2011-08-13 63 views
7

如何在form_for提交上傳遞一個url?我試圖使用每個按鈕指向每個控制器操作的一個窗體,一個是搜索,另一個是創建。是否有可能在同一個表單上提交2個不同的動作按鈕?form_for提交多個控制器操作

<%= 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 %> 

回答

20

根據按下的按鈕,沒有簡單的Rails方式將表單提交到不同的URL。您可以在每個按鈕上使用JavaScript來提交到不同的URL,但更常見的處理這種情況的方式是允許表單提交到一個URL並檢測控制器操作中按下了哪個按鈕。

對於這樣一個提交按鈕第二種方法:

<%= 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 

更多有關這兩種方法見this similar question

另請參閱Railscast episode 38多按鈕表單。

+1

同意,保持簡單,使用本地方法,** js **可以管理* action url *。我建議你使用另一種形式來搜索調整後的CSS以重新定位 – Anatoly

2

這個問題是非常相似的this one,雖然這是一個有點不同

我只是想higlight一些答案aforementionned問題還建議添加約束路由,因此可以真正路線查詢不同的控制器操作

積分筆者,vss123

我們解決了在軌採用先進的約束。

這個想法是有相同的路徑(並因此具有相同的命名路線& 行動),但約束路由到不同的行動。

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

CommitParamRouting是一個簡單的類,它有一個方法的比賽?如果提交參數匹配給定實例attr,那麼 返回true。值爲 。

這可作爲寶石commit_param_matching。

+0

請注意,與基於JS的替換表單動作url的答案不同,此方法完全依賴後端,並且即使對於已禁用javascript的客戶端也可以工作 –