web-dev-qa-db-ja.com

Ruby on Rails link_to with putメソッド

私はRailsを初めて使い、link_toヘルパーを使用して、GETリクエストではなくPUTリクエストを発行するリンクを作成しようとしています。具体的には、管理者のパネルからアプリのユーザーアカウントを有効にするリンクを作成しようとしています。 Rails 3.0.5。

私のroutes.rbファイルは:

match '/admin/users/:id/activate' => 'admin#activate_user',
  :action => :activate_user, :via => :put

私の見解は:

link_to 'Activate', :action => :activate_user, :id => user.id, :method => :put

ただし、これにより、ソースコード/admin/users/7/activate?method=putを含むURL(たとえば)<a href="/admin/users/7/activate?method=put">Activate</a>が生成されます。

代わりに<a href = "/admin/users/7/activate" data-method="put">Activate</a>を生成したい

私はbutton_toを使用できることを理解していますが、しばらくの間この問題に取り組んできており、他のチュートリアルで私がやっていることは有効であると言われているときに、この動作が見られる理由がわかりません。必要な動作を備えたlink_toヘルパーを作成するにはどうすればよいですか?

26
maksim

Updated-メソッドが指定されていない限り、link_toヘルパーはGETを実行します。

ルートファイルでmatchではなく、正確なリクエストタイプを指定する方が適切です。次のようにルートのmatchputに置き換えてみてください。

put '/admin/users/:id/activate' => 'admins#activate_user', :as => 'activate_user'

link_to 'Activate', activate_user_path(user.id), method: :put

activate_userメソッドはadminsコントローラーに存在する必要があります。 docs には、link_toヘルパーに関する詳細情報があります。

33
prasvin

link_toは、:method => :putがパスハッシュの一部であると見なします。それ以外の場合はそれを伝える必要があります。パスを角括弧で囲みます。

link_to 'Activate', {:action => :activate_user, :id => user.id}, :method => :put

これでlink_to:method => :putをリンクのパスの一部ではなくオプションとして認識します。

余談ですが、できる限りパスハッシュの代わりにルートヘルパーを使用するようにしてください。物事をきちんと整頓し、このようなひどい状況を避けます。

32
Substantial