Techioz Blog

送信用の複数のコントローラー アクションを含む form_for

概要

form_for submit で URL を渡すにはどうすればよいですか?各ボタンが各コントローラーのアクションを指す 1 つのフォームを使用しようとしています。1 つは検索、もう 1 つは作成です。同じフォーム上に異なるアクションを持つ 2 つの送信ボタンを配置することはできますか?

<%= form_for @people do |f| %>
    <%= f.label :first_name %>:
    <%= f.text_field :first_name %><br />

    <%= f.label :last_name %>:
    <%= f.text_field :last_name %><br />

    <%= f.submit(:url => '/people/search') %>
    <%= f.submit(:url => '/people/create') %>
<% end %>

解決策

Rails には、押されたボタンに応じて異なる URL にフォームを送信する簡単な方法はありません。各ボタンで JavaScript を使用して、異なる URL に送信することもできますが、この状況に対処するより一般的な方法は、フォームを 1 つの URL に送信し、コントローラーのアクションでどのボタンが押されたかを検出できるようにすることです。

2 番目のアプローチでは、次のような送信ボタンを使用します。

<%= form_for @people do |f| %>
  # form fields here
  <%= submit_tag "First Button", :name => 'first_button' %>
  <%= submit_tag "Second Button", :name => 'second_button' %>
<% end %>

アクションは次のようになります。

def create
  if params[:first_button]
    # Do stuff for first button submit
  elsif params[:second_button]
    # Do stuff for second button submit
  end
end

両方のアプローチの詳細については、この同様の質問を参照してください。

マルチボタン フォームに関する Railscast エピソード 38 も参照してください。