更好的有关Rails 3的validates_associated方法?

Ton*_*ony 18 ruby-on-rails validates-associated

Rails 3包括validates_associated在保存嵌套模型时自动调用的Rails .该方法的问题是消息很糟糕 - "模型无效"

Rails 2上有一些帖子攻击了这个问题:

而且可能还有更多.如果这些帖子中描述的Rails 3兼容,那将是一个很好的版本.主要的改进将包括为什么关联的模型失败.

Wol*_*old 5

在关系上,您可以使用,:autosave => true而不是在保存父项时尝试保存子模型.这将自动运行子项的验证,并将报告正确的错误消息.

此外,如果您在子项上添加必须设置父项的状态验证,并且通过关联构造子对象,您甚至不需要该autosave标志,并且您会收到一个漂亮的错误消息.例如:

class Trip < ActiveRecord::Base
  validates :name, :presence => true

  attr_accessible :name

  has_many :places, dependent: :destroy, :inverse_of => :trip
end

class Place < ActiveRecord::Base
  belongs_to :trip

  validates :name, :trip, presence: true

  attr_accessible :name
end
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下使用方案获得一条很好的错误消息:

> trip = Trip.new(name: "California")
=> #<Trip id: nil, name: "California"> 
> trip.places.build
=> #<Place id: nil, name: nil, trip_id: nil>
> trip.valid?
=> false
> trip.errors
=> #<ActiveModel::Errors:0x00000004d36518 @base=#<Trip id: nil, name: "California">, @messages={:places=>["is invalid"]}>
> trip.errors[:places]
=> ["is invalid"] 
Run Code Online (Sandbox Code Playgroud)

我认为这validates_associated是儿童自动保护之前的遗留物,并不是最好的做事方式.当然,这并不一定很好.我不是100%肯定这也适用于Rails 2.3,但我有一种感觉.添加嵌套属性功能(有时在2.x中)时会出现这些更改.

这是我在github上发布培训项目的简化代码片段.


Mir*_*rko -1

大多数时候validates_existence_of就是我所需要的。