Rails CHANGELOG "2019-12-02".."2019-12-09"

この期間の CHANGELOG.md へのコミットは11件。

railtiesに関して3件、ActiveStorageに関して4件、ActiveRecordに関して1件、ActionViewに関して1件、ActionPackに関して2件。

多いすね。

railties

各環境の設定ファイルで autoload_paths, autoload_once_paths, eager_load_paths を指定できるようになった

コミット: registers 43863bf in the CHANGELOG [skip ci] · rails/rails@76bafb0

実装の中身は let environments configure load-related paths · rails/rails@43863bf これ。

このコミットは CHANGELOG に書いとくね〜 というやつ。

config/environments/*.rb にこんな感じで書けば良い

# In config/application.rb, for example.
require "#{Rails.root}/lib/my_app/config"

# In config/environments/development.rb, for example.
config.foo = MyApp::Config.foo

引用: registers 43863bf in the CHANGELOG [skip ci] · rails/rails@76bafb0

Rails.application.config_for の戻り値に対して、文字列キーでのアクセスを禁止した

コミット: Remove deprecated non-symbol access to nested config_for hashes · rails/rails@e5e9c55

この修正前は deprecated になっていた。 シンボルキー以外でアクセスすると warning が出る。

ActiveSupport::Deprecation.warn(<<~MESSAGE.squish)
  Accessing hashes returned from config_for by non-symbol keys
  is deprecated and will be removed in Rails 6.1.
  Use symbols for access instead.
MESSAGE

引用: Remove deprecated non-symbol access to nested config_for hashes · rails/rails@e5e9c55

この修正後はシンボルキーのみでアクセスできるようになる。

どうしても文字列キーでアクセスしたければ with_indifferent_access を使えば?みたいな話も書いてある。

shared_configdeep_merge するようにした

コミット: Add CHANGELOG entry for 4d858b3f2a · rails/rails@2b17c11

詳細は Rails::Application#config_for merges shared configuration deeply by kirikiriyamama · Pull Request #37913 · rails/rails

このようなyamlがあった場合、

# config/example.yml
shared:
  foo:
    bar:
      baz: 1
development:
  foo:
    bar:
      qux: 2

引用: Add CHANGELOG entry for 4d858b3f2a · rails/rails@2b17c11

config_for を使うと baz 消えてしまっていた。baz が消えないように修正されている。

# Previously
Rails.application.config_for(:example)[:foo][:bar] #=> { qux: 2 }
# Now
Rails.application.config_for(:example)[:foo][:bar] #=> { baz: 1, qux: 2 }

引用: Add CHANGELOG entry for 4d858b3f2a · rails/rails@2b17c11

deep_merge に関してはこちら

ActiveStorage

Variant#service_urlPreview#service_url が非推奨になり、 #url が推奨になった

コミット: Deprecate `service_url` in favour of `url` · rails/rails@235f263

「Blobと一貫性を持たせようぜ」的なことが書いてあったので過去のコミットを掘り出した。
Permanent URLs for public storage blobs · rails/rails@feab703
Rails CHANGELOG "2019-10-07".."2019-10-13" - tanaken’s blog で紹介していた。

このときも #service_url を非推奨にして #url を推奨にしているので、合わせようぜ〜という話。

Blob の variant を DB に保存するようにした

コミット: Track Active Storage variants in the database · rails/rails@7d0327b

ActiveStorage::Blob::Representable でDBを使っているなら ActiveStorage::VariantWithRecord を使うように修正されている

def variant(transformations)
  if variable?
    variant_class.new(self, transformations)
  else
    raise ActiveStorage::InvariableError
  end
end

# 中略

private
  def variant_class
    ActiveStorage.track_variants ? ActiveStorage::VariantWithRecord : ActiveStorage::Variant
  end

抜粋: rails/representable.rb at 7d0327bbbf9fdb1f7f988ebb4e86649a776d1c65 · rails/rails

PublicDiskController を削除し DiskController に統一した

コミット: Use DiskController for both public and private files · rails/rails@fbb83d7

リファクタリング

DiskService で作られたURLに service_name フィールドを追加することで、DiskController は複数のサービスを処理できるようになっている。

DiskService のクエリパラメータのうち、dispositioncontent_type は未使用だったので削除した

コミット: Remove query params in DiskService · rails/rails@2e15092

これもリファクタリング。

ActiveRecord

connect_to メソッドにキーワード引数 database を渡すと warning が出るようにした

コミット: Deprecate `database` kwarg from `connected_to` without replacement · rails/rails@254ba46

コミットメッセージによれば、キーワード引数 database をシャーディング(データベースを水平方向に分割すること)の用途で使おうとし、それに関する多くのバグレポートがあったとのこと。で、検討の結果このキーワード引数 database は一旦削除することにしたとのことで、今回 deprecated になった。

シャーディングをサポートする機能を追加するプランはあるらしい。

いまこのキーワード引数 database があるとなんかいろいろしんどいんだろうなぁ。バグレポートを無視するわけにもいかないだろうし。

ActionView

TagBuilder で条件による値の出し分けをできるようにした

コミット: Add support for conditional values to TagBuilder · rails/rails@f1c63d8

修正前はこう書かないと行けなかったところを

content_tag(
  "My username",
  class: "always #{'sometimes' if current_user.special?} another"
)

引用: Add support for conditional values to TagBuilder by joelhawksley · Pull Request #37872 · rails/rails

こう書けるようにした

content_tag(
  "My username",
  class: ["always", "another", { 'sometimes' => current_user.special? }]
)

引用: Add support for conditional values to TagBuilder by joelhawksley · Pull Request #37872 · rails/rails

ActionPack

system test の driver オプションを non-headless ブラウザ用の selenium driver に渡すようにした

コミット: forward system test driver options configured · rails/rails@769188e

コミットメッセージを見る限りそんな感じ。コードベースではあんまり理解できてない。

config/routes.rb の中で外部のroutesファイルをロードできるようにした

コミット: Bring back feature that allows loading external route iles: · rails/rails@33bf253

使い方はこんな感じ。 draw メソッドが生えている。

# config/routes.rb

Rails.application.routes.draw do
  draw(:admin)
end

# config/routes/admin.rb

get :foo, to: 'foo#bar'

引用: Bring back feature that allows loading external route iles: · rails/rails@33bf253

ルーティングがたくさんあるアプリケーションだと有用そう。

コミットメッセージによると2012年にこの機能はあったんだけど、リバートされていたとのこと。
Revert "Allow loading external route files from the router" · rails/rails@5e7d6bb

やっぱり便利っぽいから入れようぜ、的な議論があったらしい。