1

params[] がコントローラーに送信される方法を変更するために、form_for を操作する方法を知りたいです。

このフォームを使用して、Registration#create コントローラーに投稿しています。

<%= form_for @registration, method: :post do |form| %>
    <div class="form form-actions">
      <%= form.hidden_field :occurrence_id, :value => @occurrence.id %>
      <%= submit_tag "Yes, register", class: 'btn btn-primary' %>
      <%=  link_to "Cancel", root_path, class: 'btn' %>
    </div>
<% end %>

以下は、Registration#create コントローラーです。

def create
  if params[:occurrence_id]
    @occurrence = Occurrence.find(params[:occurrence_id])
    @registration = Registration.new(registration_date: Date.today, user: current_user, occurrence: @occurrence)
    if @registration.save
      flash[:success] = "Course registration saved with success."
    else
      flash[:error] = "There was a problem saving the registration."
    end
    redirect_to occurrence_path(@occurrence)
  else
    flash[:error] = "Occurrence missing"
    redirect_to root_path
  end
end

フォームが次のように隠しフィールドを送信しているため、今私の params[:occurrence_id] は評価されていません:

{"utf8"=>"✓",
 "authenticity_token"=>"5RFiAq3DiqauNzSpnXIcPzWEl9UuGqoXfYAvRiB6GKk=",
 "registration"=>{"occurrence_id"=>"2"},
 "commit"=>"Yes,
 register"}

私はこれを「期待」しています(RoRの限られた知識で)

{"utf8"=>"✓",
 "authenticity_token"=>"5RFiAq3DiqauNzSpnXIcPzWEl9UuGqoXfYAvRiB6GKk=",
 "occurrence_id"=> "2",
 "commit"=>"Yes,
 register"}

では、params[:registration][:occurrence_id] ではなく params[:occurrence_id] が送信されるようにフォームを変更するにはどうすればよいでしょうか。

4

1 に答える 1

2

if params[:occurrence_id]に変更if params[:registration][:occurrence_id]

これは、Rails が HTML ドキュメント内の特定のオブジェクトに属するプロパティを処理する方法です。

フォームに他の入力がある場合や、ドキュメントに複数のオブジェクトがある場合は、このように整理されます。

言及された動作が意図的に必要な場合はform_tag、form_for の代わりに を使用する必要があります。

于 2013-01-21T16:56:11.777 に答える