我想设置一个自定义的嵌套控制器的行动,但我想不通的路由。
我不断收到以下错误
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
部分都表明您正在路由到每个单独的请求一个新的动作,而不是所有请求的集合。 如果你使用:on => :collection
路线将requests/accept
嵌套资源
当你窝资源:
resources :companies do
resources :requests do
get 'accept', :on => :member
end
end
你得到的是这样的,请注意,由于请求被嵌套在公司内部的路径包括一个路由company_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) %>
合适的动词
接受听起来很像的东西,以某种方式更新您的数据库,如果是那样的话,你应该考虑使用一个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 %>
更多的文档
在你的路由文件:
match 'request/accept/:id' => 'requests#accept', :as => :accept
并鉴于
link_to "Accept", accept_path(request)