Tech Racho エンジニアの「?」を「!」に。
  • 開発

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


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。