为什么我无法在has_one关系中保存关联对象?

时间:2012-08-25 03:05:10

标签: ruby-on-rails activerecord

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

1 个答案:

答案 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很新),但我认为你得到了它的要点。