2011-08-13 2 views
7

submit_forにURLを渡すにはどうすればよいですか?私はそれぞれのボタンが各コントローラのアクションを指し示す一つのフォームを使用しようとしています。一つは検索で、もう一つは作成です。同じフォーム上に異なるアクションを持つ2つの送信ボタンを持つことは可能ですか?提出用の複数のコントローラアクションを持つform_for

答えて

20

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

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

は、両方のアプローチについての詳細はthis similar questionを参照してください。

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

あなたの行動は、次のようになります。

また、マルチボタンフォームのRailscast episode 38を参照してください。

+1

は*、ネイティブなアプローチを使用して、物事をシンプルに保つ** JS ** *アクションURLを管理することができ、同意します。私は、フォームのアクションURLを置き換えるJSベースの答えとは違って、このメソッドは、バックエンドに完全に依存しており、JavaScriptを無効にしているクライアントに対しても動作すること – Anatoly

2

それは私がちょうどaforementionned質問にいくつか答えはまた、ルートに制約を追加することを提案するので、あなたはへのルートクエリを実際にできることhiglightしたかった

少し違うのですけれどもこの質問は、this oneに非常によく似ています異なるコントローラアクション!私たちは、レールに高度な制約を使用して解決作者へ

クレジット、vss123

アイデアは同じパス(したがって同じ名前のルート& アクション)を持ちますが、異なるアクションにルーティングする制約があります。

resources :plan do 
    post :save, constraints: CommitParamRouting.new("Propose"), action: :propose 
    post :save, constraints: CommitParamRouting.new("Finalize"), action: :finalize 
end 

CommitParamRoutingは、メソッドの一致を持つ単純なクラスですか? は、コミットパラメータが指定されたインスタンスattrと一致する場合にtrueを返します。 値。

これはgem commit_param_matchingとして利用できます。

+0

注意を再配置するように調整CSSでの検索のために別のフォームを使用することをお勧めしたいです –

関連する問題