Tech Racho エンジニアの「?」を「!」に。
  • 開発

5.1 beta1リリースノートに見るRails 5.1の姿

こんにちは、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に変更する


https://yarnpkg.com/en/より

yarnには、Rubyにおけるbundlerと同じ役割をJavaScriptで果たしてもらうことが期待されているのがわかります。

yarnの導入に伴い、vendor/assetsディレクトリの利用は廃止されます(#27300)。

Webpackをオプションで利用可能に


http://webpack.github.io/より

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が新たに開発され、従来のアセットパイプラインとの完全互換をうたっています。

追伸: 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のオプション導入が報じられる前のスライドです。

デフォルトでのjQuery依存をなくす

従来jQueryで書かれていたRails用のコードがvanilla JS(=素のJS)で書き直されたことにより、jQueryなしでもRailsを利用できるようになります。

システムテストの改良

Capybara gemの導入

結合テストや受け入れテストでJavaScriptを扱いやすくするためにCapybara gemが標準で導入されます。

テストに使うデータベースの扱いがマルチスレッドに対応

Capybara gem導入に伴い、マルチスレッドでのトランザクションテストのデータベースの扱いが改善され、テストデータベースをより安全にクリーンアップできるようになります。

多数の秘密情報をマスターキーで一元管理できるようにする

sekretsというgemにヒントを得た新機能だそうです。

新しいコマンドbin/rails secrets:setupを実行すると「マスターキー」が生成されます。このマスターキーで秘密の情報(パスワードなど)を暗号化してsecrets.yml.encのようなファイルでGitに保存できるようにし、本番などでの利用の際はこのマスターキーを別ファイルからinjectしたりRAILS_MASTER_KEY環境変数で与えて復号する、という運用になりそうです。もちろんマスターキーはリポジトリには絶対登録せず、別の場所で厳重に保管します。

Railアプリで使うパスワード情報が増えたときにありがたい機能だと思います。

#28038はまだまだ議論が続いているので、詳細はまた変わりそうです。

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_tagform_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 %>

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。