本日、Ruby on Rails 3.2.14がリリースされました。
3.2.14は数々のバグフィックスが含まれたバージョンになります。大きなセキュリティフィックスは含まれていませんが、早めのアップデートを検討すると良いと思います。
なお3.2系は、次のリリース(3.2.15)が最後のバグフィックスになります。3.2.16以降はセキュリティパッチしか提供されない予定なので注意しましょう。
変更点
3.2.14には約40のバグフィックスが含まれていますが、いくつか見てみます。
routing
routes.rbにおいて、scopeでcontroller/actionを指定すれば、その内部のgetなどに反映されるようになりました。以下のような記述が可能になります。
# config/routes.rb # ... scope '/job', :controller => 'job' do scope ':id', :action => 'manage_applicant' do get '/active' end end # ... # app/controllers/job_controller.rb class JobController < ApplicationController # GET /job/5/active def manage_applicant @id = params[:id] # 5 end end
Rails 3.2.13で同じ記述をして「/job/5/active」にアクセスすると、"Routing Error: uninitialized constant ActiveController"になります。
link_to_unlessのescape
link_to_unlessに指定した文字列が、条件に関わらず常時HTMLエスケープされるようになりました。
第1引数が真の場合、aタグで囲まれることはありませんが、文字列はHTMLエスケープされて返されます。なお、Viewで普通に使う分には、元々表示する部分でHTMLエスケープされるため、3.2.13にXSS脆弱性があったという意味ではありません。
file_field
file_fieldにmultileオプションを指定した場合、名前に[]が付与されてArrayとして受け取れますが、明示的にnameを指定した際には[]が追加されないように修正されました。
action_missing
ActionController#action_missingが呼ばれないバグが修正されました。
number_to_human
number_to_humanで:unitsを指定し、数値に適用できるunitが無いとき、そのまま数値を返すように修正されました。従来はエラーになっていました。
# Rails 3.2.13 number_to_human 2000, unit: { thousand: 'k' } # => "2k" number_to_human 100, unit: { thousand: 'k' } # => TypeError: no implicit conversion of nil into String # Rails 3.2.14 number_to_human 2000, unit: { thousand: 'k' } # => "2k" number_to_human 100, unit: { thousand: 'k' } # => "100"
i18n.fallback
viewファイルを検索するとき、I18n.fallbackが参照されるようになりました。
たとえばapplication.rbで以下のような設定がされているとします。
config.i18n.fallbacks = [:ja, :en]
index.html.erb, index.en.html.erbの2つのファイルがあるとき、I18n.locale = 'de'の状態でアクセスすると、以下のような挙動になります。
- Rails 3.2.13: index.html.erbが表示される
- Rails 3.2.14: index.en.html.erbが表示される
従来の挙動を想定しているコードもありそうなので、注意が必要ですね。
has_many
new_recordなオブジェクトでhas_manyなrelationのidsを取得すると、foreign_id IS NOT NULLで検索されてしまうバグが修正されました。
Company has many contractsのときに以下のようになります。
company = Company.new company.id # => nil # Rails 3.2.13 company.contract_ids # => SELECT ... WHERE `contracts`.`company_id` IS NULL # Rails 3.2.14 company.contract_ids # => []
まとめ
以上、ざっくりと変更点を流し読みしてみました。
Rails 4のプロジェクトも増えてきた今日この頃ですが、Rails 3.2があと数ヶ月でセキュリティメンテナンスモードに入るとは、相変わらず気持ちの良いスピード感です。手元のプロジェクトも、早めにアップデートしておこうと思います。