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: "商品名"