Ruby on Rails 4.1 Release Notes #1(Rails4.1へのupgrade方法)

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

Ruby on Rails Guides

ということで、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)