Fazendo com que o Fields_for funcione com o relacionamento has_many
-
13-11-2019 - |
Pergunta
Estou tendo problemas para gerar um formulário de modelo aninhado.
Aqui estão meus modelos:
class Workout < ActiveRecord::Base
has_many :scores
has_many :users, :through => :scores
accepts_nested_attributes_for :scores
end
class Score < ActiveRecord::Base
belongs_to :user
belongs_to :workout
end
class User < ActiveRecord::Base
has_many :scores
has_many :workout, :through => :scores
end
No controlador Workout, aqui está o que tenho para a nova ação:
def new
@workout = Workout.new
3.times { @workout.scores.build }
respond_to do |format|
format.html # new.html.erb
format.json { render json: @wod }
end
end
Porém, no formulário, quando tento o Fields_for, não recebo nada:
<% f.fields_for :scores do |builder| %>
<p>
<%= builder.label :score %><br />
<%= builder.text_field :score %>
</p>
<% end %>
O que estou fazendo de errado?
Solução
Acontece que no Rails 3, preciso usar <%=fields_for ...%> em vez de <% campos_for ...%>.
Outras dicas
Tente adicionar o seguinte ao seu Workout
modelo:
attr_accessible :scores_attributes
accepts_nested_attributes_for :scores
Se você quiser ter certeza de que uma pontuação não será construída a menos que seja válida, e que possa ser destruída por meio do relacionamento, você pode expandir para:
attr_accessible :scores_attributes
accepts_nested_attributes_for :scores, reject_if: proc { |a| a[:field].blank? }, allow_destroy: true
validates_associated :scores
Basta mudar :field
com um campo relevante que é necessário para a criação de uma pontuação.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow