轨道:自定义嵌套控制器动作(Rails: Custom nested controller acti

2019-06-25 22:58发布

我想设置一个自定义的嵌套控制器的行动,但我想不通的路由。

我不断收到以下错误

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

Answer 1:

有几个问题:路由到accept的行动,建设一个URL到嵌套的资源。

定义自定义操作

您可以添加自定义操作来使用此语法您的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

你得到的是这样的,请注意,由于请求被嵌套在公司内部的路径包括一个路由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助手会派上用场。 与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 %>

更多的文档

  • 添加更多的RESTful行动
  • 嵌套资源


Answer 2:

在你的路由文件:

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

并鉴于

link_to "Accept", accept_path(request) 


文章来源: Rails: Custom nested controller actions