使用accepts_nested_attributes_for时,Rails会重复验证错误

时间:2011-04-06 06:44:45

标签: ruby-on-rails validation

我有三个模型,Event,Address和County,就像这样设置。

class Event < ActiveRecord::Base
     has_one :address
     accepts_nested_attributes_for :address, :allow_destroy => true


     validates_presence_of :address
     validates_associated :address
end

class Address < ActiveRecord::Base
     belongs_to :county, :event


     validates_presence_of :county
     validates_associated :county
end

class County < ActiveRecord::Base
     has_many :addresses

     validates_presence_of :name, :allow_blank => false
end

它们都是通过一个表单创建的,它可以正常工作,直到验证它们为止。 如果该县留空,则我得到2个验证错误:

County can't be blank
Address is invalid

我可以理解为什么会这样,但只需要第一个验证错误“县不能为空”。

有关如何实现这一目标的任何想法吗?

2 个答案:

答案 0 :(得分:5)

尝试以下方法:

  1. 在地址模型中,您有下面给出的帮助方法删除
  2. validates_associated:county

    1. 在县模型位置,添加以下内容:
    2. validates_associated:地址

      编辑: 看起来你已经命中: https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/5632-validates_associated-should-be-allowed-to-not-create-an-error#ticket-5632-2

      您可能想要反应该错误......

答案 1 :(得分:1)

基本解决方案

您可以在视图中尝试此操作:

<% @event.errors.full_messages.each do |msg| %>
  <% unless msg.end_with?('is invalid') %>
  <li><%= msg %></li>
  <% end %>
<% end %>

但是此代码不会在基本模型上更改errors.count

替代解决方案

您可以清除erorrs对象以防止控制器中的不必要错误(或其他):

@event.errors.values.each {|v| v.delete_if{|message| message == "is invalid"} }

此代码将生成此errors哈希:

{:"address.county"=>["can't be blank"], :address=>[]}

因此@event.errors.count将返回1而不是2