Проверка принадлежности к ассоциации в ситуации сборки
-
22-09-2019 - |
Вопрос
У меня есть модель миссии, которая имеет_many Task, и Задача принадлежит_ к Mission
В целях безопасности я произвел эту проверку в модели задачи:
validates_presence_of :mission_id
validates_numericality_of :mission_id
Но проблема в том, что при создании Миссии и добавлении подобных задач:
@mission.tasks.build
Проверка возвращает ошибку, поскольку идентификатор миссии в задаче равен нулю ( миссия еще не была создана ).
Если я удалю проверку, Миссия и Задача будут созданы успешно, но как я могу сохранить проверку и по-прежнему выполнять эту работу?Я мог бы выполнить обратный вызов после сохранения, но я не думаю, что это правильно, потому что я не хочу сохранять задачи без mission_id .
P.S.Я скрываю свое поле миссии в форме.Если у меня это будет видно, это покажет текущую миссию, и все в порядке.Но если я спрячу это, произойдет ошибка.
<%= f.hidden_field :mission, :label => "Missão" %>
Сбрасывает ли форма атрибуты, предоставленные контроллером для нового действия?
Решение
Используйте following в Mission.rb
has_many :tasks
validates_associated :task
Задача.рб
belongs_to :mission
в контроллере
@mission=Mission.new(params[:mission])
task= @mission.tasks.build(params[:task]) ###this is same as Task.new(:mission_id=>@mission.id)
if @mission.save #this will save only when mission as well as task are valids, also it will automatically assign mission_id to tasks table you have nothing to worry about it<br>
else
#your error code will be here.......
end
Ссылка:- http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html
Другие советы
При проверке вложенного атрибута следует выполнить следующую проверку :
validates_associated :mission