Rails 路由:只有:[] 在这里做什么?

Rails routing: What does only: [] do here?

我看到一段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 部分会在 he/she 执行以下所有操作之前验证用户是否已登录。但是我对 only: [] 有点困惑。这是否意味着不会为 :auth_states 生成任何操作?那这个东西是怎么工作的。这是否意味着没有访客可以从外部访问 auth_states,但应用程序本身仍然可以使用它? only: [] 是 Rails 中广泛使用的模式吗?

谢谢

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

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

resource :auth_states, only: [:index]

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

GET /auth_states

将起作用,而(新操作)

GET /auth_states/new

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

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 命名空间中。使用这个技巧有时会更有效,并且允许将属于同一伞下的所有路由分组,并为它们添加相同的路径前缀。