5

カスタムのネストされたコントローラーアクションを設定したいのですが、ルーティングがわかりません。

次のエラーが発生し続けます

No route matches [GET] "/assets"

ルート.rb

resources :companies do
  resources :requests do
    match :accept
  end
end

index.html.rb

<% @requests.each do |request| %>
  <ul class="users">
    <li>
    <%= full_name(request.profile) %> 
    <%= request.status %> 
    <%= link_to "Accept",
            :controller => "requests", :action => "accept",
            :id => request.id %>
    </li>
  </ul>
<% end %>
4

2 に答える 2

25

アクションへのルーティングと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_idid:の両方が含まれていることに注意してください。

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 %>

その他のドキュメント

于 2012-06-30T10:34:18.380 に答える
2

ルートファイル内:

match 'request/accept/:id' => 'requests#accept', :as => :accept

とビューで

link_to "Accept", accept_path(request) 
于 2012-06-30T09:53:20.417 に答える