Aar*_*all 4 custom-action ruby-on-rails controller-action nested-routes
我想设置一个自定义的嵌套控制器操作,但我无法弄清楚路由.
我一直收到以下错误
No route matches [GET] "/assets"
Run Code Online (Sandbox Code Playgroud)
的routes.rb
resources :companies do
resources :requests do
match :accept
end
end
Run Code Online (Sandbox Code Playgroud)
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 %>
Run Code Online (Sandbox Code Playgroud)
geo*_*ock 24
存在一些问题:路由到accept操作并构建到嵌套资源的URL.
您可以使用以下语法向RESTful资源添加自定义操作:
resources :requests do
get 'accept', :on => :member
end
Run Code Online (Sandbox Code Playgroud)
这将为您提供如下所示的路线:
requests/:id/accept
Run Code Online (Sandbox Code Playgroud)
您可以使用以下方法在视图中生成路径:
accept_request_path(a_request)
Run Code Online (Sandbox Code Playgroud)
该:on => :member部分表示您将路由到每个单独请求的新操作,而不是所有请求的集合.如果你用过:on => :collection这条路线的话requests/accept
嵌套资源时:
resources :companies do
resources :requests do
get 'accept', :on => :member
end
end
Run Code Online (Sandbox Code Playgroud)
您获得的结果如下所示,请注意,由于请求嵌套在公司内部,因此路由包括a company_id和an id:
companies/:company_id/requests/:id/accept
Run Code Online (Sandbox Code Playgroud)
和这样的助手:
accept_company_request_path(a_company, a_request)
Run Code Online (Sandbox Code Playgroud)
正如你现在所做的那样,你可以通过以下方式做到这一点:
<%= link_to "Accept",
:controller => "requests", :action => "accept",
:id => request.id, :company_id => request.company.id %>
Run Code Online (Sandbox Code Playgroud)
但是使用助手更容易:
<%= link_to "Accept", accept_company_request_path(request.company, request) %>
Run Code Online (Sandbox Code Playgroud)
接受声音很像是以某种方式更新数据库的东西,如果是这种情况,你应该考虑使用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 %>
Run Code Online (Sandbox Code Playgroud)
或者您可以使用帮助程序生成更容易的路径:
<%= button_to 'Accept',
accept_company_request_path(request.company, request),
:method => :put %>
Run Code Online (Sandbox Code Playgroud)