2009-09-16 113 views
171

如何在rails中的redirect_to參數中傳遞參數? 我知道我們可以用這個傳遞ID:在rails中傳遞參數redirect_to

redirect_to :action => action_name,:id => 3 

如果我想通過更多的參數,如某種形式的數據是如何實現的呢?

編輯:

紅寶石2語法,你必須更新代碼段以上:

redirect_to action: action_name, id: 3 
+3

什麼是你真正想實現什麼?你有沒有考慮在會話中保存數據? – 2009-09-16 01:41:02

+1

你所要求的是不可能的 - 如果你正在做一個重定向,它必須是一個你重定向到的GET請求,所以你的用戶總是可以看到這些參數。你應該把東西存儲在會話中。 – GregT 2013-04-22 22:13:22

回答

146

只需將它們添加到選項:

redirect_to controller: 'thing', action: 'edit', id: 3, something: 'else' 

會產生/thing/3/edit?something=else

+5

但我不希望它對用戶可見。 – markiv 2009-09-16 00:45:55

+14

您無法使用POST重定向。從3xx定義下的HTTP 1.1文檔:「只有在第二個請求中使用的方法是GET或HEAD時,所需的操作纔可以由用戶代理執行,而不與用戶交互。」 展開你真正想要完成的事情,我們可以推動你朝着正確的方向前進。 – jdl 2009-09-16 01:11:18

+0

嗨非常感謝您的回覆。我是網站開發的新手。 我想知道不同的方式來調用一個action.Your的迴應澄清了我的許多疑問。 再次感謝:)) – markiv 2009-09-16 01:24:43

68

如果您正在使用RESTful資源,您可以執行以下操作:

redirect_to action_name_resource_path(resource_object, param_1: 'value_1', param_2: 'value_2') 

or 
#You can also use the object_id instead of the object 
redirect_to action_name_resource_path(resource_object_id, param_1: 'value_1', param_2: 'value_2') 

or 
#if its a collection action like index, you can omit the id as follows 
redirect_to action_name_resource_path(param_1: 'value_1', param_2: 'value_2') 

#An example with nested resource is as follows: 
redirect_to edit_user_project_path(@user, @project, param_1: 'value_1', param_2: 'value_2') 
38

您可以使用flash參數將任意對象傳遞給模板。

redirect_to :back, flash: {new_solution_errors: solution.errors} 

然後通過哈希在模板中訪問它們。

<% flash[:new_solution_errors].each do |err| %> 
+54

這是不好的做法。此方法濫用Flash對象,其用於用戶消息傳遞。更好的做法是在會話中存儲任意參數,然後在完成時從會話中清除這些參數。 – GregT 2013-04-22 22:11:05

6
redirect_to :controller => "controller_name", :action => "action_name", :id => x.id 
+6

你能否提供一些解釋。只是一個代碼示例是不夠的。 – simonmenke 2012-10-29 11:02:51

38

如果您有例如發送到家裏#行動某種形式的數據,現在要重定向他們的房子#的行爲,同時保持參數,你可以做到這一點

redirect_to act_house_path(request.parameters)

+1

你知道你將如何結合這一點,加上新的參數?即request.parameters,(或+):this =>: – 2012-09-11 13:15:17

+4

您可以使用合併方法。例如:'redirect_to act_house_path(request.parameters.merge(key:「value」))' – GregT 2013-04-22 22:11:39

+1

您也可以使用except方法在合併後排除不需要的參數:'redirect_to act_house_path(request.parameters.except(:authenticity_token,:控制器,:action,:utf8,:commit)' – 2016-06-16 21:18:09

22
redirect_to new_user_path(:id => 1, :contact_id => 3, :name => 'suleman') 
3

的routes.rb

match 'controller_name/action_name' => 'controller_name#action_name', via: [:get, :post], :as => :abc 

你想與參數重定向任何控制器給出如下:

redirect_to abc_path(@abc, id: @id), :notice => "message fine"