Rails дублирует ошибки проверки при использовании accepts_nested_attributes_for - PullRequest
2 голосов
/ 06 апреля 2011

У меня есть три модели, 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 ]

5 голосов
/ 06 апреля 2011

Попробуйте выполнить следующее:

  1. В модели адреса у вас есть вспомогательный метод, указанный ниже, удалить it:

validates_associated: county

В месте модели округа добавьте следующее:

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 голос
/ 06 апреля 2011

Базовое решение

Вы можете попробовать это по вашему мнению:

<% @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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...