3

Productのクラスには、データベースのテーブルにprice適切な列があるフィールドと、ヘルパー フィールド ( として定義され、データベースのテーブルに適切な列がありません) があります。Productsnew_shopattr_accessorProducts

on の検証がprice失敗した場合、入力フィールドはfield_with_errorsdiv でラップされますが、on の検証がnew_shop失敗した場合、div でラップされませんfield_with_errors。なんで ?

これらの入力フィールドに対して生成された HTML は次のとおりです。

<input type="text" name="product[price]" id="product_price">
<input type="text" value="" name="product[new_shop]" id="product_new_shop">

いくつかの詳細情報:

class Product < ActiveRecord::Base
  attr_accessor :new_shop 
  accepts_nested_attributes_for :shop
  validates_presence_of :price
  ...
end

class Shop < ActiveRecord::Base
  validates_presence_of :name
  ...
end

フォームが送信されると、new_shop値が製品の に渡されますshop_attributes[:name]

4

1 に答える 1

3

では、実際に検証に失敗するのは:name属性ですか?そのため、new_shopはfieldWithErrors divを取得しません。これは、@ product.errorsを調べて、フィールドごとにエラーがあるかどうかを判断します。すなわち

#comes to do the :new_shop field
#looks to see if @product.errors.on(:new_shop) is not blank
#if it isn't blank, wraps the error div round it. 
于 2010-12-21T10:10:55.330 に答える