【问题标题】:Rails: Custom nested controller actionsRails:自定义嵌套控制器动作
【发布时间】:2012-07-01 15:37:40
【问题描述】:

我想设置一个自定义的嵌套控制器操作,但我不知道路由。

我不断收到以下错误

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

【问题讨论】:

  • 随着您越来越接近可行的解决方案,请保留原始问题以帮助将来找到此页面的其他人。您现在已经对问题进行了大量编辑,以至于答案看起来无关紧要。
  • 对不起,我已经回滚到原来的问题了
  • 没问题,在 SO 上总是值得考虑两件事:为您当前的问题寻求帮助,并帮助以后在 Google 上找到此问题的人。

标签: ruby-on-rails custom-action nested-routes controller-action


【解决方案1】:

在您的路线文件中:

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

在视野中

link_to "Accept", accept_path(request) 

【讨论】:

    【解决方案2】:

    有几个问题:路由到 accept 操作和构建嵌套资源的 URL。

    定义自定义操作

    您可以使用以下语法向 RESTful 资源添加自定义操作:

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

    这将为您提供如下所示的路线:

    requests/:id/accept
    

    您可以使用以下方法在视图中生成路径:

    accept_request_path(a_request)
    

    :on =&gt; :member 部分表示您正在路由到针对每个单独请求的新操作,而不是所有请求的集合。如果您使用:on =&gt; :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) %>
    

    适当的动词

    Accept 听起来很像以某种方式更新数据库的东西,如果是这种情况,您应该考虑使用PUT 请求而不是GET 请求。

    HTTP/1.1 规范说 已经建立了约定,即 GET 和 HEAD 方法不应该具有采取除检索以外的操作的意义 (RFC2616, section 9)世界暗示非人类网络客户端——搜索引擎索引器、浏览器扩展等——被允许跟踪链接(发出GET请求),但不允许提交发出其他类型请求的表单。

    如果您确实切换到使用PUT 请求,那么button_to helper 将派上用场。与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 %>
    

    更多文档

    【讨论】:

    • 谢谢,这是我迄今为止遇到的最详细、最清晰的答案之一
    • 使用 PUT 是否只需将路由代码从 GET 更改为 PUT?
    • 您需要更改路线,并更改视图以使用 &lt;form&gt; 而不是链接 (&lt;a&gt;)。我在答案中链接到的 button_to 助手将有助于生成表单(如果你想要的话,bit of CSS 可以使它看起来像一个链接)
    • 我已按照您的建议进行了更改,但仍遇到类似问题。 :member 符号代表什么。
    • 我已经进一步澄清了这个问题并用新的错误和代码更新了它
    猜你喜欢
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 2011-03-17
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 2012-06-19
    相关资源
    最近更新 更多