『Rails 5.1.0.beta1: Loving JavaScript, System Tests, Encrypted Secrets, and more』を読んだメモ

  • 1
    いいね
  • 0
    コメント

今更ながら、Rails5.1に関する記事を読んだのでメモ。

JavaScript周り(Loving JavaScript)

Yarnを使ってnpmからJavaScriptの依存の管理(Manage JavaScript dependencies from NPM via Yarn.)

YarnはJavaScriptのbundlerみたいなものだよ。

任意でのWebpackによるJavaScriptのコンパイル(Optionally compile JavaScript with Webpack.)

webpacker gem を使えば、簡単に導入できるよ。generatorに--webpackを指定してね。

デフォルトの依存からのjQueryの削除(Drop jQuery as a default dependency.)

data-remotedata-confirm、そのほかの部分にjQueryを使ってきたけど、rails-ujsをバニラJSに書き換えたから必要なくなったよ。

システムテスト(System tests)

ユニットテストは場合によっては完全なテストのうちの一部であるが、もっとも重要なものではない。ControllerからModel、Viewまでの動作を検証する統合テストははるかに大きな部分を担う。

しかしながら、統合テストを行う場合、JavaScriptに依存している場合に大して役に立たないし、今日ほとんどのWebアプリケーションはJavaScriptに少なからず依存している。それで実際のブラウザを使ったテストが行われ始めている。

Rubyでは現状の答えがCapybaraと呼ばれている。Rails用に設定するのは少し骨でした。今、我々はそれを直接フレームワークに焼き込みました。これを使えばChrome向けに設定済みのCapybaraをラッピングし、Action Dispatchの一部として失敗したスクリーンショットを提供するようにしました。

ブラウザのセットアップの時間により、時間は遅くなるけどテストのカバー範囲は広くなります。

暗号化された秘密情報(Encrypted secrets)

バージョン管理すべきでない秘密情報を取り扱うのに、これまではENVを使ったり、その他のソリューションを利用してきた。

sekret gemにインスパイアされて、われわれはRails5.1に暗号化秘密管理をビルトインした。

bin/rails secrets:setup を使うことで新たな暗号化された秘密情報を扱うことができるようになった。これはマスターキーをリポジトリーの外に持っていくが、本物のプロダクションの秘密情報をリポジトリにコミットさせてくれる。プロダクションでの復号化はkey fileを挿入するか、RAILS_MASTER_KEYENV内に入れることで行える。

パラメータ化されたメーラー(Parameterized mailers)

ActionMailerはActionControllerをモデルにしている。Abstract Controllerを通して基盤を共有しているが、長きに渡ってアクション間でのロジックの共有する良い方法がなかった。

ActionControllerではbefore_actionなどを通じて、ある程度ロジックの共通化ができていたが、ActionMailerは引数を指定して呼び出す関係上、アクションの前に呼び出されるメソッドが作りづらかった

パラメータ化されたメーラーでは、Controllerのように汎用的なparamでメーラーを呼び出すオプションを提供します。これはデフォルトのfrom / toと組み合わされメーラーのアクションを劇的にDRYにする。

直接・解決されたルート(Direct & resolved routes)

新たなリソースのルートを定義するシンプルなAPIがあったけれど、paramsによって変えるような場合は独自の面倒なルーティングがひつようだった。

直接ルートを使えば、Rubyの仕様を利用して様々なことを行うことができる。

解決済みのルートでは、互換性のあるメソッドを元にしたポリモルフィックな検索ができるようになる。これはlink_to @comment を最終的に message_path(@comment.parent, anchor: "comment_#{@comment.id}") に変更することが可能になる。

form_tagform_forform_withに統一(Unify form_tag/form_for with form_with)