Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rails7の新機能

Rails7はもうすぐです。リリース日はまだ確定していませんが、クリスマス前にリリースされる予定なので、それほど長くはありません。この投稿の公開時点での最新バージョンは 7.0.0.rc1です。 、最初のリリース候補です。Basecamp、HEY、Github、ShopifyはすべてRails 7 alphaを本番環境で実行しているため、リリース候補でさえかなり安定していると期待できます。

この投稿では、Rails7がもたらす新機能と変更点のいくつかを見ていきます。

ノードとWebpackは不要

はい、あなたはその権利を読んでいます! Rails7のJavaScriptはNodeJSやWebpackを必要としなくなります。また、npmパッケージは引き続き使用できます。

ES6をBabelでトランスパイルし、Webpackでバンドルするには、多くのセットアップが必要です。 RailsはWebpackerでそれをかなりうまくサポートしていました 宝石、これは多くの荷物をもたらし、特にアップグレード可能性を維持しながら、理解して変更を加えるのは困難でした。

現在、 rails newで作成された新しいアプリのデフォルト importmaps-railsを介してインポートマップを使用することです gem。package.jsonを作成する代わりに npmを使用して依存関係をインストールします またはyarn ./ bin / importmapを使用します 依存関係を固定(または固定解除または更新)するCLI。

たとえば、 date-fnsをインストールするには :

$ ./bin/importmap pin date-fns

これにより、 config / importmap.rbに行が追加されます のように:

pin "date-fns", to: "https://ga.jspm.io/npm:date-fns@2.27.0/esm/index.js"

JavaScriptコードでは、以前と同じようにすべてを使い続けることができます。

import { formatDistance, subDays } from "date-fns";
 
formatDistance(subDays(new Date(), 3), new Date(), { addSuffix: true });
//=> "3 days ago"

この設定で覚えておくべきことの1つは、作成した内容とブラウザーが取得した内容の間にトランスパイルがないことです。重要なすべてのブラウザがすぐにES6をサポートするようになったため、ほとんどの場合、これは問題ありません。

ただし、これは、TypeScriptまたはJSXは、使用する前にJSにトランスパイルする必要があるため、使用できないことも意味します。

したがって、JSXでReactを使用する場合でも、別の設定にフォールバックする必要があります(webpack / rollup / esbuildを使用)。

Rails7はあなたのためにこれを行うことができます。必要なのは、選択した戦略を使用した1つのコマンドだけです。

$ ./bin/rails javascript:install:[esbuild|rollup|webpack]

TurbolinksとUJSがTurboとStimulusに置き換えられました

Rails 7で生成されたアプリケーションは、TurbolinksとUJSの代わりに、デフォルトでTurboとStimulus(Hotwireから)を取得します。 Hotwireは、HTMLをネットワーク経由で送信することにより、DOMに高速更新を提供する新しいアプローチです。

データベースレイヤーでの暗号化

Rails 7では、 encodesを使用して特定のデータベースフィールドを暗号化済みとしてマークできます。 ActiveRecord ::Baseのメソッド 。これは、初期設定後、次のようなコードを記述できることを意味します。

class Message < ApplicationRecord
  encrypts :text
end

他の属性と同じように、暗号化された属性を引き続き使用できます。 Rails 7は、データベースとアプリケーションの間で自動的に暗号化と復号化を行います。

ただし、これには少し癖があります。 deterministic:true を渡さない限り、そのフィールドでデータベースをクエリすることはできません。 暗号化のオプション メソッド。決定論的モードは、デフォルトの非決定論的モードよりも安全性が低いため、絶対にクエリする必要がある属性にのみ使用してください。

非同期クエリ

load_asyncがあります バックグラウンドで結果をフェッチするためにデータをクエリするときに使用できるメソッド。これは、コントローラーアクションからいくつかの無関係なクエリをロードする必要がある場合に特に重要です。実行できます:

def PostsController
  def index
    @posts = Post.load_async
    @categories = Category.load_async
  end
end

これにより、両方のクエリがバックグラウンドで同時に発生します。したがって、各クエリに200ミリ秒かかる場合、データのフェッチにかかる合計時間は、シリアルにフェッチされる場合は400ミリ秒ではなく、約200ミリ秒になります。

Rails7のZeitwerkモード

これは、クラシックローダーを実行している古いアプリケーションにとっては重大な変更です。すべてのRails7アプリケーションはZeitwerkモードを使用する必要がありますが、切り替えは非常に簡単です。 Zeitwerkの完全なアップグレードガイドを確認してください。

その他のRails7の更新

ジョブを無制限に再試行

ActiveJobで:unlimitedを渡すことができるようになりました 試行として try_onのパラメータ 。 Railsは、最大試行回数なしでジョブを試行し続けます。

class MyJob < ActiveJob::Base
  retry_on(AlwaysRetryException, attempts: :unlimited)
 
  def perform
    raise "KABOOM"
  end
end

名前付きバリアント

ActiveStorageでバリアントに名前を付けることができるようになりました すべてのアクセスでサイズを指定する代わりに。

class User < ApplicationRecord
  has_one_attached :avatar do |attachable|
    attachable.variant :thumb, resize: "100x100"
  end
end
 
#Call avatar.variant(:thumb) to get a thumb variant of an avatar:
<%= image_tag user.avatar.variant(:thumb) %>

HTML属性へのハッシュ

新しいtag.attributesがあります ハッシュをHTML属性に変換するビューで使用するメソッド:

<input <%= tag.attributes(type: :text, aria: { label: "Search" }) %>>

生成します

<input type="text" aria-label="Search" />

ルビーデバッグ

デバッグの新しいデフォルトがbyebugから変更されました debugへ 宝石。

byebugを呼び出す代わりに 、 debuggerを呼び出す必要があります コードでデバッグセッションを開始します。

soleを使用して単一のレコードをアサートします

レコードをクエリするときに、 soleを呼び出すことができるようになりました またはfind_sole_by firstの代わりに またはfind_by )クエリが単一のレコードにのみ一致する必要があることを表明する場合。

Product.where(["price = %?", price]).sole
# => ActiveRecord::RecordNotFound      (if no Product with given price)
# => #<Product ...>                    (if one Product with given price)
# => ActiveRecord::SoleRecordExceeded  (if more than one Product with given price)
 
user.api_keys.find_sole_by(key: key)
# as above

アソシエーションの有無を確認する

where.associated(:association)を使用できるようになりました IDの存在を結合してチェックする代わりに、レコードに関連付けが存在するかどうかをチェックします。

# Before:
account.users.joins(:contact).where.not(contact_id: nil)
 
# After:
account.users.where.associated(:contact)

コントローラーアクションから生成されたファイルをストリーミング

これで、 send_streamを使用できます その場で生成されているファイルのストリーミングを開始するためのコントローラーアクション内。

send_stream(filename: "subscribers.csv") do |stream|
  stream.write "email_address,updated_at\n"
 
  @subscribers.find_each do |subscriber|
    stream.write "#{subscriber.email_address},#{subscriber.updated_at}\n"
  end
end

これにより、ユーザーは何かが起こっていることを即座に(部分的に)応答できるようになり、Herokuにデプロイすると追加のメリットが得られます。

ファイルはすぐにストリーミングを開始するため、Herokuは接続を終了しません。つまり、30秒以上かかる1回限りのファイルを生成するためにバックグラウンドジョブに頼る必要はありません。

Rails7へのアップグレード

Railsの以前のバージョンと同様に、アップグレードは簡単です。公式のアップグレードガイドはまだありませんが、手順は同じです:

  1. GemfileのRailsバージョン番号を変更します( 7.0.0.rc1 公開日現在)、 bundle updateを実行します 。
  2. bundle exec rails app:updateを実行します 。インタラクティブCLIに従い、必要に応じてファイルを追加/置換/変更します。
  3. テストを実行し、すべてが期待どおりに機能することを確認します。

まとめ

Rails 7リリースノートでバグ修正、機能、および変更の完全なリストを確認できます。これらは現時点では包括的ではありませんが、まもなく更新される予定です。

Rails 6以下をまだ実行している場合は、Rails 7の最終リリースで、Rails 6.1が「セキュリティ問題のみ」モードになり、バグ修正が行われなくなることに注意してください。これにより、Rails5.2のEOLもマークされます。修正を受け取らなくなるためです。

コーディングを楽しんでください!

P.S。 Ruby Magicの投稿をマスコミから離れたらすぐに読みたい場合は、Ruby Magicニュースレターを購読して、投稿を1つも見逃さないでください。


  1. iOS 13.3 バージョンの新機能

    9 月の iOS13 のアップグレードにより、機能の導入、バグ修正、および改善を含む一連の更新が行われました。 iOS 13.3 が 2019 年 12 月 10 日にリリースされ、それに伴い、バグ修正と改善とともに多くの機能が導入されました。 [ソフトウェア アップデート デバイス] を見つけます。アップデートを確認し、ダウンロードしてインストールできる最新バージョン、つまり iOS 13.3 を確認します。 導入された機能に関しては、新機能とともに導入された多くの変更がありました。それらが何であるか見てみましょう: 1.通信制限: これは、iOS デバイス上の特定のアプリの使用を制限

  2. Android 12 Developer Preview 1 の新機能

    セキュリティに関する懸念が年々高まっているため、すべてのオペレーティング システムがアップグレードされ、遅れないように努めています。今年の Android 12 デベロッパー プレビューでは、さらに多くのことが予想されます。 Android Developer Preview 1 がリリースされました。お気に入りの OS に多くのエキサイティングな機能が追加される可能性があります。 Google が述べているように、彼らは世界中のすべての Android ユーザーにとって、OS をよりスマートで使いやすくすることに取り組んでいます。最新の Android バージョンは、ユーザーのパフォーマン