ほとんどのRubyon Railsファンが知っているかもしれませんが、Rails 6は間もなく登場し、待望の多くの機能と変更をもたらします。この記事の目的は、Rails 6に追加された主要な機能を理解し、それらがアプリケーションの改善にどのように役立つかを概説し、貴重な開発時間を節約することです。
手始めに、Rails6にはRuby2.5以降とアップグレードされたデータベースが必要であることを忘れないでください。したがって、まだアップグレードしていない場合は、それに応じてシステムをアップグレードする計画があることを確認してください。
では、これらの新機能は何ですか?これは、今後使用する可能性のあるRails6の主な機能の簡単な要約です。
プロとして Ruby onRails開発者 、コードを最大限にカバーすることを目指しています。ただし、テストケースが「重く」なり、テストケースを実行するためだけに数分、場合によっては数時間待たなければならない場合、テストは面倒な作業になります。
さて、Rails6にはここで答えがあります。 parallelize
が追加されましたActiveSupport::TestCase
へのメソッドこれにより、テストスイートをフォークされたプロセスと並列化できます。
したがって、テストのプロセスを並列化するために必要なことは、これをtest_helper.rb
に追加することです。
parallelize(workers: 2)
または、テストを実行するために以前に使用したコマンドを置き換えることもできます。たとえば、bin/rails test OR bin/rspec spec
PARALLEL_WORKERS=15 rails test OR PARALLEL_WORKERS=15 rspec spec
に置き換えることができます。
したがって、Travis、Gitlab、CircleCIなどのさまざまなCIプラットフォームでテストスイートを実行するためのコマンドを変更できます。
機械学習の概要
各プロセスが作成/破棄されるときのフックもあり、次のように使用できます。
class ActiveSupport::TestCase parallelize_setup do |worker| # setup databases end parallelize_teardown do |worker| # cleanup databases end parallelize(workers: :number_of_processors) end
注意: 詳細については、こちらをご覧ください。 Railsガイド 詳細については。
効率的なテストについて話していたので、Rails5の最も顕著な機能の1つであるアクションケーブルがどのように改善されたかについても理解しましょう。これで、アクションケーブルを任意のレベルでテストできます。 接続 、 チャネル 、および 放送 。
接続テスト 接続の識別子が適切に割り当てられているかどうか、または不適切な接続要求が拒否されているかどうかを確認することを目的としています。
class ApplicationCable::ConnectionTest チャネルテスト ユーザーがチャンネルに登録でき、チャンネルにストリームがあるかどうかを確認するために作成できます。
class ChatChannelTest チャネルへのブロードキャスト 次のようにテストできます。
# app/jobs/chat_relay_job.rb class ChatRelayJob 注意: テスト方法に関するその他のヒントを見つけることができます ここに 。
一括挿入とアップサート
ある時点で、一度に複数のレコードを挿入する必要があり、そうするときに多くの回避策が見つかりました。さて、Rails 6には、insert_all
と同様の新しいメソッドupdate_all
が付属しています。
コールバックは発生せず、単一のSQLクエリを実行します。追加のメソッドがありますupsert_all
これにより、 アップサート操作 これは、Postgresのような多くの最新のデータベースによって公開されています。これで、挿入クエリを減らし、コードをより最適化することができます。また、activerecord-import
のような以前に使用した宝石に別れを告げます。
単一のINSERT
SQLクエリはこれらのメソッドによって準備され、モデルをインスタンス化したり、Active Recordのコールバックや検証を呼び出したりすることなく、単一のSQLステートメントがデータベースに送信されます。アップサートクエリをスキップまたは実行するオプションを使用して、主キー(一意のインデックスまたは一意の制約に違反している場合)の基準を定義することもできます。
いくつかの例を以下に示します。
result = Article.insert_all( [ { id: 1, title: 'Handling 1M Requests Per Second', author: 'John', slug: '1m-req-per-second' }, #...snip... ], returning: %w[ id title ], unique_by: :index_articles_on_title_and_author ) result = Article.upsert_all( [ { id: 1, title: 'Handling 1M Requests Per Second', author: 'John', slug: '1m-req-per-second' }, { id: 1, .... }, # duplicate 'id' here { id: 2, .... }, { id: 3, .... }, # duplicate 'title' and 'author' here { id: 4, .... }, { id: 5, .... }, # duplicate 'slug' here { id: 6, .... } ] )
メソッドinsert
、insert!
およびupsert
insert_all
、insert_all!
のラッパーですそれぞれupsert_all
。
注意: さまざまなデータベースに関する一括クエリについて説明している非常に優れた記事があります。追加情報が必要な場合は、 見てみな 。
複数のデータベース間の切り替え
多くの大きなアプリケーションが評価する主な機能の1つは、これです。Rails6は、アプリケーションの複数のデータベースのサポートをついに追加しました。組み込みですぐに使用できます。

もちろん、アプリケーションを複数のマイクロサービスに分割し、それぞれに個別のデータベースを持たせるか、モノリシックルートを使用するか、アプリケーションに複数のリードレプリカを追加するかどうかにかかわらず、設計の選択は依然としてあなた次第です。
しかし、そのような簡単な方法でそれを行う能力を持つことは、節約する可能性があります たくさん 開発の最前線で。
だから、これはあなたの新しいdatabase.yml
の方法ですファイルは次のようになります。
development: primary: database: my_primary_db user: root primary_replica: database: my_primary_db user: ro_user replica: true animals: database: my_animals_db user: root animals_replica database: my_animals_db user: ro_user replica: true
別のデータベースに切り替える方法を指定する興味深い方法は次のとおりです。
class AnimalsModel これが GitHubの公式ページ 、これも適切に文書化されています。個人的には、将来のRailsアップデートでもデータベースシャーディング機能を利用できることを楽しみにしています( この )。
アクションメールボックス
もう1つの興味深いRails6の機能は、 アクションメールボックス 、に機能を追加します 受信メールをルーティングする Railsで処理するためのメールボックスのようなコントローラーに。
Action Mailboxは、Mailgun、Mandrill、Postmark、SendGridの入力機能を備えています。組み込みのExim、Postfix、およびQmailの入力を介して、受信メールを直接処理することもできます。これで、詳細に立ち入ることなく、潜在的なメリットを想像できるでしょう。ヘルプデスクからのメールを直接処理してサポートチケットを自動化する場合があります。Rails6を使用すると、顧客は電子メールなどを介して直接返信できます。フロアは、この機能を探索し、アプリケーションに最適なアプローチを考え出すために開かれています。
アクションメールボックスの使用方法を理解するための小さな例を次に示します。
COMMENTS_REGEX = /^comment+(.+)@example.com/i # app/mailboxes/application_mailbox.rb class ApplicationMailbox :comments end # app/mailboxes/comments_mailbox.rb class CommentsMailbox また、メールを設定する新しい方法は次のとおりです(Sendgridを例にとると)。
# config/environments/production.rb config.action_mailbox.ingress = :sendgrid
rails credentials:edit
を使用するaction_mailbox.ingress_password
の下にあるアプリケーションの暗号化された資格情報にパスワードを追加します。ここで、ActionMailboxはパスワードを自動的に検出します。
action_mailbox: ingress_password: …
を構成します SendGridインバウンド解析 受信メールを/rails/action_mailbox/sendgrid/inbound_emails
に転送するユーザー名actionmailbox
以前に生成したパスワード。アプリケーションがhttps://example.com
にある場合は、次のURLを使用してSendGridを構成します。
https://actionmailbox: [email protected] /rails/action_mailbox/sendgrid/i
これをさらに詳しく調べたい場合は、Railsにすでにガイドがあります。 ここに 。
独自のコーディング言語を作成する方法
Zeitwerk
ZeitwerkはRubyの新しいコードローダーです。従来のファイル構造では、Zeitwerkはプロジェクトのクラスとモジュールをオンデマンドでロードします。つまり、独自のファイルのrequire呼び出しを作成する必要はありません。 Rails 6で有効にするには、次のようにします。
config.autoloader = :zeitwerk
あなたはについてもっと読むことができます Zeitwerkはこちら 。
オプティマイザーのヒント
一部のクエリの実行に時間がかかりすぎるのではないかと心配ですか?さて、これでクエリのタイムアウトを定義する方法もあります。
次のステートメントはStatementTimeout
を発生させますクエリの実行に通常よりも時間がかかる場合の例外:
User.optimizer_hints('MAX_EXECUTION_TIME(5000)').all
これはMySQLでサポートされており、データベースでサポートされているかどうかを調べる必要があります。
データベースの切り捨て
シードデータはどうですか?次のステートメントは、すべてのデータベーステーブルを切り捨ててから、データのシードに進むことができます。
rails db:truncate_all
シードするデータベースを削除する必要はもうありません。あなたはおそらくこれがエレガントで迅速な解決策であることに同意するでしょう。
アクションテキスト
おそらく、WYSIWYGエディターで動作する多くのアプリケーションのもう1つの注目すべき機能は、のサポートの追加です。 Trixエディター Rails6アプリケーションにネイティブに。これは確かに多くのプロジェクトにとって良いアップグレード/追加になるでしょう。
ほとんどのWYSIWYGHTMLエディターは範囲が非常に広いため、各ブラウザーの実装には独自のバグと癖があり、JavaScript開発者は不整合を解決する必要があります。 Trixは、contenteditable
を処理することにより、これらの不整合を回避します。 I / Oデバイスとして:入力がエディターに送られると、Trixはその入力を内部ドキュメントモデルの編集操作に変換し、そのドキュメントをエディターに再レンダリングします。これにより、Trixはすべてのキーストロークの後に何が起こるかを完全に制御できます。
インストール:
rails action_text:install # app/models/message.rb class Message あなたは探検することができます アクションテキスト 公式ドキュメントでさらに詳しく、 ここに 。
セキュリティ
いくつかのセキュリティ強化がなければ、深刻なアップグレードは完了しません。 Rails6もセキュリティの面で失望していません。最初の注目すべきセキュリティアップグレードは、のサポートの追加です。 ホスト認証 。
Host Authorizationは、防御する新しいミドルウェアです。 DNSの再バインド リクエストの送信先となるホストを明示的に許可することによる攻撃。これが意味するのは、アプリケーションにアクセスできるホストを定義できるということです。
別のセキュリティアップグレードは、Cookieの署名/暗号化された値をコピーし、それを別のCookieの値として使用しようとする攻撃を阻止することを目的としています。これは、目的フィールドにCookie名を隠し、Cookie値とともに署名/暗号化することによって行われます。次に、サーバー側の読み取りで、Cookie名を確認し、攻撃されたCookieを破棄します。 action_dispatch.use_cookies_with_metadata
を有効にするこの機能を使用するには、新しい目的と有効期限のメタデータが埋め込まれたCookieを書き込みます。
デフォルトのバンドラーとしてのWebpack
フロントエンド開発用の多くの最新のJavaScriptフレームワークのデファクトスタンダードであるように、Rails6はWebpackergemを介してデフォルトのJavaScriptバンドラーとしてWebpackを追加し、RailsAssetパイプラインを置き換えました。これは比較的簡単な追加であり、詳細については説明しません。 Webpackは、過労のフロントエンド開発者にいくらかの救済をもたらすと言えば十分です。
競合状態の防止
Rails 6には、コード内のSELECT / INSERT競合状態を防ぐために使用される新しいメソッドがあります(多くの読者が、プロジェクトをスケーリングするときに競合状態に遭遇するという不幸に見舞われたと思います)。これが GitHubスレッド 追加情報が必要な場合に備えて。
基になるテーブルには、固有の制約で定義された関連する列が必要です。 #find_or_create_by
からのSELECT→INSERT間の競合状態を回避しますが、実際にはINSERT→SELECT間に別の競合状態があります。これは、これら2つのステートメント間のDELETEが別のクライアントによって実行された場合にトリガーできます。ただし、ほとんどのアプリケーションでは、これが発生する可能性が大幅に低い状態です。
Rails6の資格情報
Rails 5.2の時代から、資格情報は、悪名高いものを取り除くことを約束して機密情報を処理するための新しい「Railsの方法」と呼ばれています。 .env 一度限りのファイル。資格情報を使用すると、サードパーティサービスの暗号化されたキーをソース管理に直接チェックインできます。
ただし、これまでRailsはすべての環境で同じ暗号化ファイルを使用していたため、特に大きなプロジェクトやレガシーコードを処理する場合は、開発と本番環境で異なるキーを処理するのが少し難しくなりました。
Rails 6では、これは環境ごとの資格情報のサポートによって最終的に解決されます。繰り返しになりますが、詳細は公式で調べることができます GitHubスレッド 。
Rails 6は良いアップデートですか?
はい。実際、Rails 6はメジャーアップデートとして説明できますが、ゲームチェンジャーと呼ぶ人はほとんどいません。 Ruby on Railsは何年も前から存在しているため、革命的な変化を期待する人はほとんどいませんが、その6番目の化身は多くのことをもたらします。
Rails 6で展開された機能の中には、マイナーな改善のように見えるものもあれば、開発時間を大幅に節約したり、セキュリティや堅牢性を向上させたりする可能性があるものもあります。結論:レールは成熟しており、 多くの開発者はその将来に熱心なままです 、そしてRails 6のリリースにより、さらに良くなりました。
もちろん、このRails 6の機能のリストは不完全であり、変更の完全なセットを表示するには、変更ログを確認する必要があります。さらに、考慮すべき多くの非推奨があります。最後に、すべての変更を確認して自分で更新することを主張する場合は、 フルリリースノート 。
基本を理解する
Ruby on Railsは2019年も引き続き関連性がありますか?
Railsは、市場の他のどのソリューションよりも関連性があります。 RailsとRubyの両方がアップグレードされています(MatzはRubyを3倍高速化しています)。 Rails 6は、アプリケーションをネイティブにスケーリングするための簡単なテクニックをもたらします。そして、Github、Shopify、Basecampなどの多くの大手プレーヤーから信頼されている選択肢です。
Androidでm3u8ファイルを再生する方法
Railsを使用する必要がありますか?
答えはユースケースによって異なります。これは、通常のWeb、eコマース、コンテンツ管理、およびその他の多くの種類のアプリケーションに最適なフレームワークです。また、MVPの開発時間を短縮し、固定観念がない場合やアプリケーションの迅速なプロトタイプが必要な場合に最適です。
Upsertはどういう意味ですか?
アップサートはデータベース操作です。つまり、操作に提供された属性に基づいて、レコードがデータベースにすでに存在する場合は、そのレコードを更新するか、レコードが存在しない場合は新しいレコードを作成します。アップサートは単一のトランザクションで発生するため、アプリケーションの競合状態を防ぐことができます。
並列テストの利点は何ですか?
テストケースを実行するだけで数時間かかるプロジェクトを見てきました。さまざまなプロセスで一連のテストケースを実行することにより、テストケースの実行時間を短縮できます。 Rails 6の並列テストでは、テストケースを並列化するために外部サービスに依存する必要はありません。