Ruby on Rails 4.1 Release Notes — Ruby on Rails Guides を読んで行くことにします。
今日は最初のUpgradingの章です。
Highlights in Rails 4.1:
冒頭に新機能概要について書かれています。
Spring application preloader config/secrets.yml Action Pack variants Action Mailer previews
config/secrets.yml これは初耳です。
なんでしょうか。
1 Upgrading to Rails 4.1
ということで、4.0から4.1へのupgradeについて見て行きます。
以下、番号はリンク先に準拠します。
2 Upgrading from Rails 4.0 to Rails 4.1
2.1 CSRF protection from remote script tags
CSRF protectonがgetリクエストに対しても有効になったようです。
get :index, format: :js
を
xhr :get, :index, format: :js
に変更することで対応できるそうです。
2.2 Spring
springをpreloadとして使う場合の対応方法です。
Rails4.1からはdefaultでspringを使うようになるので、手動で次のように設定します。
1.Gemfileへの追加
gem 'spring', group: :development
2.bundle installを実行
3.bundle exec spring binstub --all
2.3 config/secrets.yml
ここで出てきました。
config/initializers/secret_token.rb が外出しになったようです。
1.config/secrets.yml
development: secret_key_base: test: secret_key_base: production: secret_key_base:
2.secret_token.rb からsecret_key_baseをコピーします
3.これで secret_token.rb は不要なので削除します
4.rake secret を実行しtest/development用のkeyを生成します
5.restart server
2.4 Changes to test helper
ActiveRecord::Migration.check_pending! が不要になるそうです。
(でも新規作成したrails projectには入っているようです。)
あってもなくても害はないとのことなので、とりあえずほっときます。
2.5 Changes in JSON handling
2.5.1 MultiJSON removal
不要なのでRailsからは削除されています。
直で呼んでいる場合は、multi_json をGemfileに追加するか
代わりに obj.to_json, and JSON.parse(str) を使うと。
2.5.2 JSON gem compatibility
ここはよくわかんないので、さらっと流します。
JSON gemはこれまで互換性の問題があったらしく、
JSON.generate and JSON.dump でエラーになっていたそうです。
Rails4.1ではこれを修正したとのこと。
2.5.3 New JSON encoder
JSON encoderは、JSON gemを利用するために書き直しがされたようで、
以下の機能がなくなったとのこと。
1.Circular data structure detection
2.Support for the encode_json hook
3.Option to encode BigDecimal objects as numbers instead of strings
どうしても必要なら、rails/activesupport-json_encoder を使用するといいらしいです。
2.6 Usage of return within inline callback blocks
callback の戻り値の書き方が変わったようです。
以前はこう書けたのが、今はNGとのこと。
もしこんな書き方をしているなら、はまりそうですが、あんまりなさそうな気がします。
class ReadOnlyModel < ActiveRecord::Base before_save { return false } # BAD end
こうするか
class ReadOnlyModel < ActiveRecord::Base before_save { false } # GOOD end
こうするか。
class ReadOnlyModel < ActiveRecord::Base before_save :before_save_callback # GOOD private def before_save_callback return false end end
2.7 Methods defined in Active Record fixtures
ちょっと合ってるか自信がないのですが
fixtures では、動的な定義が可能ですがコンテキストが分けられたようです。
他のfixturesの利用ができなくなったみたいです。
ActiveRecord::FixtureSet.context_classを利用することで対応するようです。
class FixtureFileHelpers def file_sha(path) Digest::SHA2.hexdigest(File.read(Rails.root.join('test/fixtures', path))) end end ActiveRecord::FixtureSet.context_class.send :include, FixtureFileHelpers
使い方。( ActiveRecord::FixtureSet )
photo: name: kitten.png sha: <%= file_sha 'files/kitten.png' %>
2.8 I18n enforcing available locales
これがdefaultで有効になったようです。
config.i18n.default_locale = :ja
というのを入れればokです。
falseにすることもできますが、推奨ではないようです。
2.9 Mutator methods called on Relation
Relation から #map! and #delete_if がなくなったようです。
to_a してからやってね。
# Instead of this Author.where(name: 'Hank Moody').compact! # Now you have to do this authors = Author.where(name: 'Hank Moody').to_a authors.compact!
See Also
Ruby on Rails 4.1 Release Notes
・#2(Rails4.1の主な機能)
・#3(Railties)
・#4(Action Pack)
・#5(Action Mailer)
・#6(Active Record)
・#7(Active Model)
・#8(Active Support)