55

我有一個鏈接,我需要提交一個發佈請求。通常,我會使用jQuery並阻止鏈接的默認行爲,然後將表單提交到目標。這看起來像Rails應該能夠幫助我。果然,link_to方法用於指定HTTP POST方法的選擇:使用Rails的link_to發佈的鏈接

link_to "Profile", 'http://example.com/profile', method: :post 

這樣的作品,但我需要添加2個參數了。我想:

link_to "Profile", 'http://example.com/profile', method: post, param1: 'value1', param2: 'value2' 

這只是增加了這些參數的<a> HTML元素,但點擊該鏈接時,沒有提交這些:

<a rel="nofollow" param1="value1" param2="value2" data-method="post" href="http://example.com/profile">Profile</a> 

有沒有辦法做一個帶參數的POST請求使用link_to或其他Rails方法?我正在使用Rails 3.2.9。

+0

不認爲你可以做到這一點。可能最好在你的控制器使用net/http或HTTParty來完成它? –

+0

無法在我的控制器中執行此操作,需要將用戶引導至其他站點。看起來你是對的,但沒有內置的鏈接機制來爲我做這件事。 –

回答

94

簡短的回答是,如果你的意思是「參數」是表單域,那麼你根本無法做到這一點(至少不是以我能看到的簡單方式)。你應該改用一個帶有提交按鈕的表單,看起來像一個鏈接(如果這就是你想要的樣子)。

如果在另一方面,你本來還打算查詢參數,那麼這會工作:

link_to "Profile", 'http://example.com/profile?' + {param1: 'value1', param2: 'value2'}.to_param, method: :post 

如果沒有:

link_to "Profile", profile_path(@profile.id, param1: 'value1', param2: 'value2'), method: :post 
+1

剛更新了我的問題,我實際上使用這些鏈接的外部URL。 –

+0

我已經添加了一個說明,基本上說,你想要做的是不可能使用鏈接。你需要一個帶有提交按鈕的表單。 –

+2

重要的是要注意,如果用戶禁用JavaScript,則鏈接將默認爲「GET」請求。 – bkunzi01

9

您可以在URL這樣編碼參數根據您的需求,您最好使用比link_to更好的形式。

+0

這確實是添加參數的一種非常好的方式。 – nathanvda

+0

不適合我的需求,參數需要是POST參數。但是,謝謝,我不知道to_param方法。配置文件後還需要一個'?'。 –

+0

好吧,我明白了,那麼我認爲你必須寫一個表格。如果您需要多次重複此邏輯,您可以編寫一個幫助程序方法來構建此表單。 –

1

爲了發佈數據,您需要一個表單。但是,您不需要提交按鈕。如果你想讓它看起來像一個鏈接出於某種原因,你實際上可以使它成爲一個通過JavaScript提交表單的鏈接。在下面的示例中,POST資源只是一個REST操作,不需要任何字段,因此沒有表單輸入控件。如果您想發佈一些數據,只需在表單中放置隱藏的輸入字段。

<%= form_tag('http://something_postable', :method => :post, :class => 'internal') %></form> 
<%= link_to_function('Label for Link', 'previous("form").submit()', :title => 'Hover text for link') %> 

的形式被分配一個類,因此可以設定樣式或通過CSS隱藏(例如,「顯示:內聯」)

1

的參數和HTTP方法應該在一起{param1: 'value1', param2: 'value2', :method: :post}

<%= link_to "Profile", profile_path(@profile), {param1: 'value1', param2: 'value2', method: :post} %> 
0

請注意,如果用戶禁用了JS,或者您已刪除默認出現的不顯眼的JS庫,則link_to將通過GET請求靜默提交。

一般來說,我不喜歡有執行POST請求的鏈接。我認爲這是一個表單和一個按鈕的作用。

因此,一個簡單的(和更安全的)替代方案是使用Rails的button_to幫手:

button_to 'Profile', profile_path(@profile, param1: 'value1', param2: 'value2') 

button_to還支持method選項,但因爲它默認爲post所以我只是省略了。