我有一个有一个结果的pickem对象。我在将结果保存到数据库时遇到问题。
pickems_controller.rb
def results
@pickem = Pickem.find params[:id]
# @pickem.result = @pickem.build_result if @pickem.result.blank?
@pickem.result = Result.new
end
def update_results
@pickem = Pickem.find params[:id]
@pickem.result = Result.new params[:pickem][:result_attributes]
if @pickem.result.update_attributes params[:pickem][:result_attributes]
redirect_to edit_pickem_results_path(@pickem), :notice => 'The results have been successfully updated.'
else
render "edit"
end
end
results.html.erb
<%= simple_form_for @pickem, :url => edit_pickem_results_path(@pickem), :method => :put, do |f| %>
<%= f.simple_fields_for :result do |r| %>
<%= r.input :first_name %>
...
<% end %>
<%= f.submit :class => 'btn btn-success', :label => 'Submit Results' %>
<% end %>
pickem.rb
has_one :result, :dependent => :destroy
accepts_nested_attributes_for :result
result.rb
belongs_to :pickem
我最初使用的是在控制器中注释掉的build_result代码,但不得不退出。使用build_result,当有人点击结果表单时,结果记录被保存到数据库中。应用程序中存在一些规则,如果输入了结果,则不允许用户进行任何选择。因此,即使用户点击结果表单但未提交,结果仍然是创建的。
如何构建表单并仅在用户单击“保存”时保存结果记录,而不是在加载表单时保存结果记录?我上面粘贴的当前解决方案不起作用。它使用适当的外键保存结果记录,但从不获取表单数据。如果我转储@ pickem.result正确的表单数据在结果对象中,我就是无法保存它。我试过的其他解决方案正确保存表单数据,但外键为0。
编辑:
无论出于何种原因,@pickem.result = Result.new
仍然将记录保存到数据库,因此我将其更改为@result = Result.new
并更新了表单,如下所示:
<%= simple_form_for @result, :url => edit_pickem_results_path(@pickem), :method => :put, do |r| %>
<%= r.input :first_name %>
<%= r.submit :class => 'btn btn-success', :label => 'Submit Results' %>
<% end %>
然后使用来自@result = @pickem.result.build params[:result]
的Chuck W的建议,我得到undefined method
build'为nil:NilClass`。
答案 0 :(得分:0)
pickems_controller.rb
def results
@pickem = Pickem.find params[:id]
@pickem.result.blank? ? @result = Result.new : @result = @pickem.result
end
def update_results
@pickem = Pickem.find params[:id]
@result = @pickem.result.build params[:pickem][:result]
if @result.save
redirect_to edit_pickem_results_path(@pickem), :notice => 'The results have been successfully updated.'
else
render "edit"
end
end
然后,您的视图应如下所示:
<%= simple_form_for @pickem, :url => edit_pickem_results_path(@pickem), :method => :put, do |f| %>
<%= f.simple_fields_for @result do |r| %>
<%= r.input :first_name %>
...
<% end %>
<%= f.submit :class => 'btn btn-success', :label => 'Submit Results' %>
<% end %>
你可能不得不四处讨论如何将参数传递回update_results动作(我对rails很新),但我认为你得到了它的要点。