0

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

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 アクションに返される方法をいじる必要があるかもしれません (私はレールにかなり慣れていません) が、要点は理解できたと思います。

于 2012-08-25T05:43:33.017 に答える