0

我有一个有一个结果的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

结果.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 %>

皮克姆.rb

has_one :result, :dependent => :destroy
accepts_nested_attributes_for :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 %>

然后使用 Chuck W of 的建议@result = @pickem.result.build params[:result],我得到undefined method了 nil:NilClass` 的 build'。

4

1 回答 1

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 很陌生),但我认为您明白了它的要点。

于 2012-08-25T05:43:33.017 回答