Rails 5.2ベータがリリース!内容をざっくりチェックしました

こんにちは、hachi8833です。

日本時間の早朝、DHHが自らRails 5.2ベータの公開をアナウンスしましたので、駆け足で内容を追っかけてみました。

過去の週刊Railsウォッチで扱った内容が多かったので、扱ったことのあるPRにはバックナンバーも貼りました。

Rails 5.2ベータの概要

プレスリリースの末尾には、Railsの5.xシリーズはこれが最後になるかもしれないとあります。既にRails 6.0を視野に入れているそうです。

Active Storageの改善

ファイルをクラウドにそのままアップロードできるようになりました。Amazon S3、Google Cloud Storage、Microsoft Azure Cloud File Storageをすぐ使うことができます。動画やPDFのプレビューも作りやすくなったそうです。

Active StorageはBasecamp 3で既に本番運用されているとのことです。

Active Storage READMEより:

  • ファイルが1つの場合も複数の場合も対応

モデルでhas_one_attachedhas_many_attachedで指定できます。

# ファイルが1つの場合
class User < ApplicationRecord
  # 添付ファイルとblobが関連付けられる。ユーザーが削除されるとデフォルトで削除される
  # (モデルが削除され、リソースファイルが削除される)
  has_one_attached :avatar
end

# ファイルが複数の場合
class Message < ApplicationRecord
  has_many_attached :images
end
  • Active StorageとJavaScriptライブラリでクラウドへのダイレクトアップロードをサポート
// asset pipelineに以下を追加
//= require activestorage
// npmパッケージを利用
import * as ActiveStorage from "activestorage"
ActiveStorage.start()
<!-- フォームでアップロードを指定 -->
<%= form.file_field :attachments, multiple: true, direct_upload: true %>

なお現時点では、ActiveStorageのドキュメントはedgeguides.rubyonrails.orgにも上がっていません。

週刊Railsウォッチ(20170707)Railsの新機能ActiveStorage、高速Rubyフォーマッタrufo gemが超便利、Railscasts全コンテンツが無料公開ほか

Redisキャッシュストアが標準で使える

純粋なRedis、hiredis、Redis::Distributedをサポートし、複数Redisでのシャーディング(sharding: 複数サーバーへのデータ分散)やMGETも利用可能です。Redisサーバーにアクセスできない場合にも例外をraiseせず、ローカルキャッシュも利用できます。

      # デフォルトは `redis://localhost:6379/0`
      config.cache_store = :redis_cache_store
      # Redis::Distributedで複数ホストをサポート
      config.cache_store = :redis_cache_store, driver: :hiredis
        namespace: 'myapp-cache', compress: true,
        url: %w[
          redis://myapp-cache-1:6379/0
          redis://myapp-cache-1:6380/0
          redis://myapp-cache-2:6379/0
          redis://myapp-cache-2:6380/0
          redis://myapp-cache-3:6379/0
          redis://myapp-cache-3:6380/0
        ]

キャッシュの改善

キーベースのキャッシュの不要な生成を抑制して再利用を促進し、1KB以上のキャッシュをデフォルトで圧縮するようになりました。イニシャライザでcompress: falseを指定すると圧縮がオフになります。

週刊Railsウォッチ(20170526)増えすぎたマイグレーションを圧縮するsquasher gem、書籍「Complete Guide to Rails Performance」ほか

HTTP/2 early hintsを導入

HTTP/2のearly hintsに対応しました。

# actionpack/lib/action_dispatch/http/request.rb
+    def send_early_hints(links)
+      return unless env["rack.early_hints"]
+
+      env["rack.early_hints"].call(links)
+    end

参考: blog.jxck.io HTTP の新しいステータスコード 103 Early Hints

週刊Railsウォッチ(20171013)Ruby 2.5.0-preview1リリース、RubyGems 2.6.14でセキュリティバグ修正、Bootstrap 4.0がついにBetaほか

Bootsnap gemが標準に

Shopify作のbootsnap gemはRails/Rubyアプリを高速で起動できます。既存のRailsアプリのGemfileへの追加も容易です。

週刊Railsウォッチ(20170728)bootsnapがRailsで正式採用、Ruby Prizeの推薦開始、PostgreSQL配列の重複を除去ほか

Content-Security-PolicyヘッダーをDSLで設定可能に

これはRailsウォッチでは扱っていなかったものでした。

# config/initializers/content_security_policy.rb
Rails.application.config.content_security_policy do
  p.default_src :self, :https
  p.font_src    :self, :https, :data
  p.img_src     :self, :https, :data
  p.object_src  :none
  p.script_src  :self, :https
  p.style_src   :self, :https, :unsafe_inline

  # Specify URI for violation reports
  # p.report_uri  "/csp-violation-report-endpoint"
end

参考: MDN Content-Security-Policy

config/secrets.yml.encで秘密情報をリポジトリで一元管理可能に

EncryptedConfigurationクラスも導入されました。

週刊Railsウォッチ(20170929)特集: RubyKaigi 2017セッションを振り返る(2)Ruby 2.3.5リリースほか

Webpacker 3.0が利用可能に

そういえばWebpacker 2.0が6月頃、3.0が8月末にリリースされていました。asset pipelineの出番が減りそうです。

週刊Railsウォッチ(20170602)チームが喜ぶ19のgem、Bundler 1.15が高速化&機能追加、Deviseに挑戦する新認証gem「Rodauth」ほか

番外

関連は不明ですが、早くもRails 5.1.2がらみのバグとおぼしきissueがRubyの方に上がりました。

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833

コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。
これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。
かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。
実は最近Go言語が好き。
仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ