55

投稿リクエストを提出する必要があるリンクがあります。通常は、jQueryを使用してリンクのデフォルトの動作を妨げ、宛先にフォームを送信します。これは、Railsが私を助けてくれるはずのもののようです。案の定、link_to方法は、POST HTTPメソッドを指定するためのオプションがあります。投稿リンクにはlink_toを使用しています

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

動作しますが、私も2つのパラメータを追加する必要があります。私が試した:ちょうど<a> HTML要素にそれらのパラメータを追加しましたが、リンクをクリックしたときにそれらを提出しなかった

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

<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

データをPOSTするには、フォームが必要です。ただし、送信ボタンは必要ありません。これを何らかの理由でリンクのように見せたい場合は、JavaScript経由でフォームを送信するリンクにすることができます。以下の例では、POSTリソースはフィールドを必要としないRESTアクションに過ぎず、フォーム入力コントロールはありません。いくつかのデータを投稿したい場合は、隠れた入力フィールドをフォームに入力するだけです。 (「:インライン表示」など)

1

パラメータをし、HTTPメソッドが{param1: 'value1', param2: 'value2', :method: :post}

<%= link_to "Profile", profile_path(@profile), {param1: 'value1', param2: 'value2', method: :post} %> 
一緒にする必要がありますあなたはそれをスタイルやCSSを経由してそれを隠すことができるように

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

フォームは、クラスが割り当てられています

0

ユーザがJSを無効にしている場合、またはデフォルトで来る控えめなJSライブラリを削除した場合、link_toGETリクエストでサイレントに送信されます。

一般に、私はPOSTリクエストを実行するリンクを持っていることはあまりありません。私はこれがフォームとボタンの役割だと思います。

このように、簡単に(そして安全な)代替はRailsのbutton_toヘルパーを使用することです:postがデフォルトので、私はそれを省略してきたように

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

button_toをもmethodオプションをサポートしていますが。

関連する問題