1 つの結果を持つ 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
結果.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 からの提案を使用して、nil:NilClass` のビルド@result = @pickem.result.build params[:result]
を取得します。undefined method