簡體   English   中英

Rails:自定義嵌套控制器操作

[英]Rails: Custom nested controller actions

我想設置一個自定義的嵌套控制器操作,但我無法弄清楚路由。

我一直收到以下錯誤

No route matches [GET] "/assets"

的routes.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 %>

存在一些問題:路由到accept操作並構建到嵌套資源的URL。

定義自定義操作

您可以使用以下語法向RESTful資源添加自定義操作:

resources :requests do
  get 'accept', :on => :member
end

這將為您提供如下所示的路線:

requests/:id/accept

您可以使用以下方法在視圖中生成路徑:

accept_request_path(a_request)

:on => :member part表示您在每個請求上路由到新操作,而不是所有請求的集合。 如果您使用:on => :collection則路由將是requests/accept

嵌套資源

嵌套資源時:

resources :companies do
  resources :requests do
    get 'accept', :on => :member
  end
end

您獲得的結果如下所示,請注意,由於請求嵌套在公司內部,因此路由包括company_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) %>

適當的動詞

接受聲音很像是以某種方式更新數據庫的東西,如果是這種情況,你應該考慮使用PUT請求而不是GET請求。

HTTP / 1.1規范說已經建立了這樣的約定:GET和HEAD方法不應該具有采取除檢索之外的動作的重要性RFC2616,第9節 ),其具有非人類Web客戶端的真實含義 -搜索引擎索引器,瀏覽器擴展等 - 允許跟隨鏈接(發出GET請求)但不允許提交發出其他類型請求的表單。

如果您切換到使用PUT請求,那么button_to幫助程序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 %>

更多文檔

在您的路線文件中:

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

在視野中

link_to "Accept", accept_path(request) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM