こんにちは、hachi8833です。Rails 5.1beta1がリリースされました。Rails 5リリースからのコミット数は既に3500件を超えているそうです。
なおRails 5.0.2.rc1も並行してリリースされました。
beta1にみるRails 5.1の姿
公式ニュースの情報では、5.1で予定される多数の更新の中から以下をピックアップしています。週刊Railsウォッチをお読みの方は多くの項目に見覚えがあるかと思います。
5.1リリースまでに詳細は変わる可能性がありますが、この方向性で進むと考えてよいと思います。
JavaScriptとの連携を強化
注: yarnとWebpackは外部ツールなので、利用のためには別途インストールが必要になります。以下はMac環境でHomebrewを使ってインストールする場合のコマンドです。
brew install yarn
yarn global add webpack
(yarnのインストール後に行う)
JavaScriptの管理をnpmからyarnに変更する
yarnには、Rubyにおけるbundlerと同じ役割をJavaScriptで果たしてもらうことが期待されているのがわかります。
yarnの導入に伴い、vendor/assetsディレクトリの利用は廃止されます(#27300)。
- 関連記事: 週刊Railsウォッチ(20161218)
Webpackをオプションで利用可能に
yarnとともに、近年急速に人気の高まっているWebpackを--webpack
オプションで選択できるようになりました。5.1でrails new
するのであれば、やることが多すぎていつも大変そうだったアセットパイプライン周りのタスクをWebPackで行えるというのは魅力かもしれません。
11/25の週刊Railsウォッチで取り上げた記事「Replacing the Rails Asset Pipeline with Webpack and Yarn」のとおりに進んでいるので、同記事はアセットパイプラインやWebpack周りでは必読ですね。許可を得られたら翻訳してみようと思います。
WebpackをRailsに導入しやすくするためにwebpacker gemが新たに開発され、従来のアセットパイプラインとの完全互換をうたっています。
- 参考: JS開発で人気のWebpackとは!?
- 関連記事: 週刊Railsウォッチ(20161125)
追伸: 5.1アップグレードでWebpackを導入した場合に考えられる影響
morimorihogeさんからの指摘を元に注意点を追記します。
Webpackは同リリースノートでは「This is fully compatible with the asset pipeline」と完全互換をうたってはいますが、従来のSprocketsと同時に使うものではないため、Sprockets依存の部分でさまざまな変更が発生することが予測できます。変更の量や部位については現時点では未知ですが、CoffeeScriptのトランスパイラなどもWebpackに置き換えられることから、5.1へのアップグレードでWebpackを導入すると場合によってはかなりの変更が発生するかもしれません。
なお、記事執筆時点でのSprocketsバージョンは4.0.0beta4です。Webpackを導入しない場合や5.1より前のRailsでは引き続きSprocketsが必要なので、4.0.0のリリースも待ち望まれるところです。以下はWebpackのオプション導入が報じられる前のスライドです。
- 参考: The State of Sprockets -- Ruby on Rails Tech Meetupに参加してきました!(2016/10/24)でご紹介した@_yasaichiさんの発表スライド
デフォルトでのjQuery依存をなくす
従来jQueryで書かれていたRails用のコードがvanilla JS(=素のJS)で書き直されたことにより、jQueryなしでもRailsを利用できるようになります。
- リポジトリ: rails/rails-ujs
- 関連記事: 週刊Railsウォッチ(20161209)
システムテストの改良
Capybara gemの導入
結合テストや受け入れテストでJavaScriptを扱いやすくするためにCapybara gemが標準で導入されます。
- リポジトリ上の関連コード: actionpack/lib/action_dispatch/system_test_case.rb#L11
- 関連記事: 週刊Railsウォッチ(20161019)
テストに使うデータベースの扱いがマルチスレッドに対応
Capybara gem導入に伴い、マルチスレッドでのトランザクションテストのデータベースの扱いが改善され、テストデータベースをより安全にクリーンアップできるようになります。
多数の秘密情報をマスターキーで一元管理できるようにする
sekretsというgemにヒントを得た新機能だそうです。
新しいコマンドbin/rails secrets:setup
を実行すると「マスターキー」が生成されます。このマスターキーで秘密の情報(パスワードなど)を暗号化してsecrets.yml.encのようなファイルでGitに保存できるようにし、本番などでの利用の際はこのマスターキーを別ファイルからinjectしたりRAILS_MASTER_KEY環境変数で与えて復号する、という運用になりそうです。もちろんマスターキーはリポジトリには絶対登録せず、別の場所で厳重に保管します。
Railアプリで使うパスワード情報が増えたときにありがたい機能だと思います。
#28038はまだまだ議論が続いているので、詳細はまた変わりそうです。
- Issue: #28038 Add encrypted secrets
ActionMailerをパラメータ化
before_action
のようなフィルタをActionMailerでも使えるようになります。これによりメイラー間の共通処理をフィルタでDRYに書けるようになります。
ルーティングの改良
#23138でdirectedルーティングとresolvedルーティングが導入されるそうです。directedとresolvedは訳すとかえってわかりにくくなりそうなので英ママにしてみました。
directedルーティング(directed routes)
DHHの発案です。以下のような感じでルーティングのヘルパーを書けるようになります。
# https://github.com/rails/rails/issues/22512 より
direct(:readable) do |recording|
case recording.recordable_name
when 'comment', 'client_reply'
url_for [ :commentable, recording ]
when /chat_lines/
if recording.bucket.circle?
url_for [ :circle_around_line, recording.bucket, recording ]
else
url_for [ :bucket_chat_around_line, recording.bucket, recording.parent, recording ]
end
when 'question_answer'
url_for [ :bucket_question_date, recording.bucket, recording.parent, recording.recordable.group_on, anchor: recording.anchor_dom_id ]
else
url_for [ :recordable, recording ]
end
end
resolvedルーティング(resolved routes)
モデルなどに基づいたポリモーフィックなルーティングをよりシンプルに書けるようになります。
たとえばlink_to @comment
がroutes.rbで以下のように書けます。
message_path(@comment.parent, anchor: "comment_#{@comment.id}")
form_tagとform_forを統一
フォーム作成用ヘルパform_tag
とform_for
は、今後form_with
で統一的に扱うようになります。これもDHHの発案です。
# form_tagの例
<%= form_tag('/posts') do -%>
<div><%= submit_tag 'Save' %></div>
<% end -%>
# =>
# <form action="/posts" method="post">
# <div>
# <input type="submit" name="commit" value="Save" />
# </div>
# </form>
# form_forの例
<%= form_for :person do |f| %>
First name: <%= f.text_field :first_name %><br />
Last name : <%= f.text_field :last_name %><br />
Biography : <%= f.text_area :biography %><br />
Admin? : <%= f.check_box :admin %><br />
<%= f.submit %>
<% end %>
- Issue: #25197 Provide form_with as a new alternative to form_for/form_tag
- 関連記事: 週刊Railsウォッチ(20161209)