【问题标题】:Restricting resource routes and adding additional non-RESTful routes in Rails 3在 Rails 3 中限制资源路由并添加额外的非 RESTful 路由
【发布时间】:2011-06-19 19:23:18
【问题描述】:

我在这里或其他地方找不到任何内容,既包括限制资源的路由,又在 Rails 3 中添加额外的非 RESTful 路由。这可能非常简单,但我遇到的每个示例或解释都只针对一个案例不能同时进行。

这是我在 Rails 2 中所做的一个示例:

map.resources :sessions, :only => [:new, :create, :destroy], :member => {:recovery => :get}

非常简单,我们只需要 7 个 RESTful 路由中的 3 个,因为其他路由对这个资源没有任何意义,但我们还想添加另一个用于帐户恢复的路由。

现在从我收集到的信息来看,做这些事情中的任何一件都非常简单:

resources :sessions, :only => [:new, :create, :destroy]

就像在 Rails 2 中一样。并且:

resources :sessions do
  member do
    get :recovery
  end
end

那么,如何将这两者结合起来呢?我还可以使用旧的 Rails 2 方法吗?在 Rails 3 中是否有这样做的首选方法?

【问题讨论】:

    标签: ruby-on-rails ruby routes


    【解决方案1】:

    您可以将参数和块传递给resources

    resources :sessions, :only => [:new, :create, :destroy] do
      get :recovery, :on => :member
    end
    

    并使用rake routes 进行测试。

    【讨论】:

    • 我的routes.rb 声明resources :thing, :only => [:show] do get :foo, :on => :member end,而rakes routes 给出foo_thing GET /thing/foo(.:format) thing#foo 加上thing GET /thing(.:format) thing#show。指向thing 的链接有效,但如果代码导航到链接foo_thing,我会看到一个显示No route matches [GET] "/foo_thing" 的Rails“路由错误”屏幕——尽管如果我在URL 栏中输入.../thing/foo,它会有效。 (路径foo_thing 仅在routes.rb 具有get 'foo_thing' => 'thing#foo' 行时才在代码中起作用)。关于我做错了什么有什么想法吗?
    • 我对上面的问题进行了扩展,并写了this question,所以如果你有答案,你能去吗?再见。
    【解决方案2】:

    它应该像这样工作

    resources :sessions, :only => [:new, :create, :destroy] do
      member do
        get :recovery
      end
    end
    

    Coreyward 提出了一种更短的方法。

    检查导轨,“Rails Routing from the Outside In”。 我还可以推荐 Obie Fernandez 的“The Rails 3 Way”,其中有 2 个关于路由和 REST 的非常好的章节。

    干杯

    【讨论】:

    • 您的“资源”有错字。 ;)
    • 去掉第一行末尾do前的逗号,这样就对了。
    猜你喜欢
    • 2010-12-16
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多