Rails3.2でネストしたモデルのバリデーションエラーの日本語化

なかなか苦戦したので備忘録として、バリデーションのかけ方とメッセージの日本語の2本立て

Rails3.2

ネストしたモデルのバリデーション

例)お客(Customer)に注文(Order)が1対多で紐づく場合、
お客を登録した時に一緒に注文も複数個登録したい

  • Model
# customer.rb
has_many :orders
#「:モデル名_attributes」
attr_accessible :name, :tel, :orders_attributes
# 以下でネストするモデルを指定。has_manyだから複数形。
accepts_nested_attributes_for :orders

validates :name, :presence => true
validates :tel, :presence => true

# order.rb
belongs_to :customer
attr_accessible :name

validates :name, :presence => true
  • Controller
# order_controller.rb

def create
  @customer = Customer.new(name:params[:name], tel:params[:tel])
  params[:orders].each do |order|
    @customer.orders.build(name:order[:name])
    # または以下でも同意
    # @customer.orders << Order.new(name:order[:name])
  end
  @customer.save!
end

ネストしたバリデーションエラーメッセージの日本語化

下記のサイトどおりではうまくいきませんでした。Railsのバージョンが違うから?
http://ukstudio.jp/posts/2009/04/14/accepts_nested_attributes_for/

で、調べつつそれっぽい書き方を試すものの、別のサイトの方法でようやく解決
Rails 3.2でネストしたモデルの属性名をI18nで翻訳する。 - Sooey

# config/locales/ja.yml
# order単体で登録する場合もあるため、ネストしない場合も別途記載

  activerecord:
    models:
      order: 'ご注文'
      customer: 'お客様'
    attributes:
      order: # orderモデル
        name: "商品名"
      customer: # customerモデル
        name: "お名前"
        tel: "電話番号"
      customer/orders: # ネストした場合はスラッシュ区切り。インデントは他のモデルと同じ(単数・複数形に注意)
        name: "商品名"