Validar A pertence à associação em uma situação de construção
-
22-09-2019 - |
Pergunta
Eu tenho um modelo de missão que possui tarefa, e a tarefa pertence a missão
Para segurança, fiz essa validação no modelo de tarefas:
validates_presence_of :mission_id
validates_numericality_of :mission_id
Mas o problema é que, ao criar uma missão e adicionar tarefas como esta:
@mission.tasks.build
A validação retorna um erro, porque o ID da missão na tarefa é nulo (a missão ainda não foi criada)
Se eu excluir a validação, a missão e a tarefa são criadas bem -sucedidas, mas como posso manter a validação e ainda ter esse trabalho? Eu poderia fazer um retorno de chamada após o salvamento, mas não acho que esteja certo, porque não quero salvar tarefas sem mission_id.
PS Estou escondendo meu campo missionário no formulário. Se eu tiver visível, ele mostrará a missão do Currect e tudo está bem. Mas se eu escondi o erro acontecer.
<%= f.hidden_field :mission, :label => "Missão" %>
O formulário está redefinindo os atributos fornecidos pelo controlador na nova ação?
Solução
Use a seguir em mission.rb
has_many :tasks
validates_associated :task
Tarefa.rb
belongs_to :mission
no controlador
@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
Ref:- http://api.rubyonrails.org/classes/activerecord/validações/classmethods.html
Outras dicas
Ao validar um atributo aninhado, você deve fazer a seguinte validação:
validates_associated :mission