Rails 3.2.14がリリースされました

本日、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があと数ヶ月でセキュリティメンテナンスモードに入るとは、相変わらず気持ちの良いスピード感です。手元のプロジェクトも、早めにアップデートしておこうと思います。

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

この記事の著者

baba

ゆとりプログラマー。 高校時代から趣味でプログラミングを初め、そのままコードを書き続けて現在に至る。慶應義塾大学環境情報学部(SFC)卒業。BPS設立初期に在学中から参加している最古参メンバーの一人。得意分野はWeb全般、Ruby on Rails、Androidアプリケーションなど。最近はBlinkと格闘中。軽度の資格マニアで、情報処理技術者試験(高度10区分)などを保有。

babaの書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ