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:[email protected]/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の以前のバージョンと同様に、アップグレードは簡単です。公式のアップグレードガイドはまだありませんが、手順は同じです:
- GemfileのRailsバージョン番号を変更します(
7.0.0.rc1
公開日現在)、bundle update
を実行します 。 -
bundle exec rails app:update
を実行します 。インタラクティブCLIに従い、必要に応じてファイルを追加/置換/変更します。 - テストを実行し、すべてが期待どおりに機能することを確認します。
まとめ
Rails 7リリースノートでバグ修正、機能、および変更の完全なリストを確認できます。これらは現時点では包括的ではありませんが、まもなく更新される予定です。
Rails 6以下をまだ実行している場合は、Rails 7の最終リリースで、Rails 6.1が「セキュリティ問題のみ」モードになり、バグ修正が行われなくなることに注意してください。これにより、Rails5.2のEOLもマークされます。修正を受け取らなくなるためです。
コーディングを楽しんでください!
P.S。 Ruby Magicの投稿をマスコミから離れたらすぐに読みたい場合は、Ruby Magicニュースレターを購読して、投稿を1つも見逃さないでください。
-
iOS 13.3 バージョンの新機能
9 月の iOS13 のアップグレードにより、機能の導入、バグ修正、および改善を含む一連の更新が行われました。 iOS 13.3 が 2019 年 12 月 10 日にリリースされ、それに伴い、バグ修正と改善とともに多くの機能が導入されました。 [ソフトウェア アップデート デバイス] を見つけます。アップデートを確認し、ダウンロードしてインストールできる最新バージョン、つまり iOS 13.3 を確認します。 導入された機能に関しては、新機能とともに導入された多くの変更がありました。それらが何であるか見てみましょう: 1.通信制限: これは、iOS デバイス上の特定のアプリの使用を制限
-
Android 12 Developer Preview 1 の新機能
セキュリティに関する懸念が年々高まっているため、すべてのオペレーティング システムがアップグレードされ、遅れないように努めています。今年の Android 12 デベロッパー プレビューでは、さらに多くのことが予想されます。 Android Developer Preview 1 がリリースされました。お気に入りの OS に多くのエキサイティングな機能が追加される可能性があります。 Google が述べているように、彼らは世界中のすべての Android ユーザーにとって、OS をよりスマートで使いやすくすることに取り組んでいます。最新の Android バージョンは、ユーザーのパフォーマン