【问题标题】:Rails routing: What does only: [] do here?Rails 路由:仅:[] 在这里做什么?
【发布时间】:2015-02-14 18:07:14
【问题描述】:

我看到一段 Rails 的路由代码是这样的:

namespace :my do
  resource :auth_states, only: [] do
    collection do
      get 'signed_in'
    end
  end


  resource :password, only: [:edit, :update]      
  # And all the actions a logged in user can perform under "my" namespace...
  # ...

end

据说这个应用程序适用于devisecancancan gem。我猜:auth_states 部分会在用户执行以下所有操作之前验证用户是否已登录。但是我对only: [] 有点困惑。这是否意味着不会为:auth_states 生成任何操作?那这个东西是怎么工作的。这是否意味着没有访客可以从外部访问auth_states,但应用程序本身仍然可以使用它? only: [] 是 Rails 中广泛使用的模式吗?

谢谢

【问题讨论】:

    标签: ruby-on-rails authentication devise url-routing


    【解决方案1】:

    only: [] 包含要为资源路由的白名单操作数组。例如,如果您指定

    resource :auth_states, only: [:index]
    

    那么只会生成索引动作,因此

    GET /auth_states
    

    会起作用,而(新动作)

    GET /auth_states/new
    

    不会。传递空操作是将资源用作嵌套路由的命名空间的技巧。实际上,在您的情况下,路由器将路由

    GET /auth_states/signed_in
    

    但同时,不会路由

    GET /auth_states
    GET /auth_states/1234
    

    有时,您会看到它与controller 选项结合使用

    resource :authentication, controller: 'auth_states', only: [] do
      collection do
        get 'signed_in'
      end
    end
    

    生成

    GET /authentication/signed_in
    

    路由器有一个namespace 方法,但它会自动将控制器范围限定为Ruby 命名空间。使用这个技巧有时更有效,并且允许将属于同一伞下的所有路由组合在一起,并在它们前面加上相同的路径。

    【讨论】:

      【解决方案2】:

      only: [] 用作可选参数,以便您可以指定允许路由到该特定控制器的特定操作 - auth_states。在您的情况下,似乎没有必要使用它。如果您指定某些动作只说:[:index] 那么索引动作将只被路由,而不是其他动作。希望这能消除您的困惑。

      【讨论】:

      • 我的困惑是我认为如果它是空的,那么 所有操作 将不被允许。所以你的意思是它在这里什么都不做,因为它是空的......那么开发人员将它包含在代码中是有原因的吗?
      • 是的,如果您不需要指定某些操作,可以将其设置为空或最好不要使用它。开发人员可能已在此处加入以提供灵活性。
      • 它不是为了提供灵活性,而是模拟命名空间路由的常用技巧。
      • 是的,现在我意识到答案实际上是不准确的,但我无法收回赞成票...奇怪的投票系统。
      猜你喜欢
      • 1970-01-01
      • 2011-01-28
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多