web-dev-qa-db-ja.com

投稿するリンクにRails link_toを使用する

投稿リクエストの送信に必要なリンクがあります。通常、jQueryを使用して、リンクのデフォルトの動作を防ぎ、フォームを宛先に送信します。これは、Railsが何か助けてくれるように思えます。案の定、link_toメソッドにはPOST httpメソッドを指定するオプションがあります:

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>

link_toまたは他のPOSTメソッドを使用して、パラメーターを使用してRailsリクエストを行う方法はありますか? Rails 3.2.9を使用しています。

77
at.

簡単な答えは、「パラメーター」が意味するものがフォームフィールドである場合、これを行うことができないということです(少なくとも、わかりやすい方法では)。代わりに、リンクのようにスタイル設定された送信ボタン付きのフォームを使用する必要があります(それが見た目である場合)。

一方、queryパラメータを意味していた場合、これは機能します。

link_to "Profile", profile_path(@profile.id, param1: 'value1', param2: 'value2'), method: :post
127
Chris Salzberg

この方法でURLのパラメーターをエンコードできます。

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

ニーズに合わない場合は、link_toよりもフォームを使用する方が適切です。

8
Adrien Coquio

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

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

したがって、簡単な(より安全な)代替手段はRails button_to ヘルパーを使用することです:

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

button_tomethodオプションもサポートしていますが、デフォルトではpostに設定されているため、省略しました。

2
Kostas Rousis

POSTデータを使用するには、フォームが必要です。ただし、送信ボタンは必要ありません。これを何らかの理由でリンクのように見せたい場合は、実際に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を使用してスタイルを設定したり非表示にしたりできます(例: 'display:inline')

2
Ammo Goettsch

パラメータとhttpメソッドは一緒にする必要があります{param1: 'value1', param2: 'value2', :method: :post}

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