投稿リクエストの送信に必要なリンクがあります。通常、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を使用しています。
簡単な答えは、「パラメーター」が意味するものがフォームフィールドである場合、これを行うことができないということです(少なくとも、わかりやすい方法では)。代わりに、リンクのようにスタイル設定された送信ボタン付きのフォームを使用する必要があります(それが見た目である場合)。
一方、queryパラメータを意味していた場合、これは機能します。
link_to "Profile", profile_path(@profile.id, param1: 'value1', param2: 'value2'), method: :post
この方法でURLのパラメーターをエンコードできます。
link_to "Profile", 'http://example.com/profile?' + {param1: 'value1', param2: 'value2'}.to_param, method: :post
ニーズに合わない場合は、link_to
よりもフォームを使用する方が適切です。
ユーザーがJSを無効にしている場合、またはデフォルトで存在する控えめなJSライブラリを削除した場合、link_to
はGET
リクエストを介してサイレントに送信されます。
一般的に、私はPOST
リクエストを実行するリンクを持つことをあまり好きではありません。それがフォームとボタンの役割だと思います。
したがって、簡単な(より安全な)代替手段はRails button_to ヘルパーを使用することです:
button_to 'Profile', profile_path(@profile, param1: 'value1', param2: 'value2')
button_to
はmethod
オプションもサポートしていますが、デフォルトではpost
に設定されているため、省略しました。
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')
パラメータとhttpメソッドは一緒にする必要があります{param1: 'value1', param2: 'value2', :method: :post}
<%= link_to "Profile", profile_path(@profile), {param1: 'value1', param2: 'value2', method: :post} %>