アクションへのルーティングとaccept
ネストされたリソースへのURLの構築という2つの問題があります。
カスタムアクションの定義
次の構文を使用して、RESTfulリソースにカスタムアクションを追加できます。
resources :requests do
get 'accept', :on => :member
end
これにより、次のようなルートが得られます。
requests/:id/accept
また、以下を使用してビューにパスを生成できます。
accept_request_path(a_request)
この:on => :member
部分は、すべてのリクエストのコレクションではなく、個々のリクエストごとに新しいアクションにルーティングしていることを示しています。:on => :collection
ルートを使用した場合はrequests/accept
ネストリソース
リソースをネストする場合:
resources :companies do
resources :requests do
get 'accept', :on => :member
end
end
次のようなルートが表示されます。リクエストは企業内にネストされているため、ルートにはacompany_id
とid
:の両方が含まれていることに注意してください。
companies/:company_id/requests/:id/accept
そしてこのようなヘルパー:
accept_company_request_path(a_company, a_request)
あなたが現在やろうとしているように、あなたはこれを長い間、次のようなもので行うことができます:
<%= link_to "Accept",
:controller => "requests", :action => "accept",
:id => request.id, :company_id => request.company.id %>
ただし、ヘルパーを使用する方が簡単です。
<%= link_to "Accept", accept_company_request_path(request.company, request) %>
適切な動詞
Acceptは、何らかの方法でデータベースを更新するものによく似ています。その場合は、PUT
リクエストではなくリクエストの使用を検討する必要がありますGET
。
HTTP / 1.1仕様では、GETメソッドとHEADメソッドは、人間以外のWebクライアントという現実の意味を持つ検索(RFC2616、セクション9 )以外のアクションを実行する意味を持たないようにする必要があるという規則が確立されています。検索エンジンのインデクサー、ブラウザー拡張機能など—リンク(リクエストを行う)をたどることは許可されていますが、他のタイプのリクエストを行うフォームを送信することは許可されていません。GET
PUT
リクエストの使用に切り替える場合は、button_to
ヘルパーが役立ちます。と同様にlink_to
、コントローラー、アクション、メソッド、およびルートに必要なすべてのパラメーターを次の場所に渡すことができますbutton_to
。
<%= button_to 'Accept',
{:controller => :requests, :action => :accept,
:company_id => request.company, :id => request},
:method => :put %>
または、ヘルパーを使用して、はるかに簡単なパスを生成できます。
<%= button_to 'Accept',
accept_company_request_path(request.company, request),
:method => :put %>
その他のドキュメント