2015-02-14 2 views
2

я видел кусок кода Rails для маршрутизации, как это:Rails routing: Что только: [] делать здесь?

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 

Якобы это приложение работает с devise и cancancan камнем. Я думаю, что часть :auth_states проверяет, был ли пользователь подписан или нет, прежде чем он сможет выполнить все приведенные ниже действия. Однако я немного смущен only: []. Разве это не означает, что никаких действий для :auth_states? Как это работает. Означает ли это, что посетитель не сможет посетить auth_states снаружи, но само приложение все равно сможет его использовать? Есть only: [] широко используемый шаблон в Rails?

Благодаря

ответ

2

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. Использование этого трюка иногда более эффективно и позволяет группировать все маршруты, которые принадлежат одному и тому же зонтику, префикс их с одним и тем же путем.

1

только: [] используется в качестве дополнительного параметра, так что вы можете указать, разрешить маршрутизацию на конкретные действия конкретного контроллера - auth_states. В вашем случае нет необходимости использовать это. Если вы указываете определенные действия, скажите только: [: index], тогда действие индекса будет только маршрутизировано, но не другие. Надеюсь, это очистит ваше замешательство.

+0

Мое замешательство я думал, если он пуст, тогда * все действия * не будут разрешены. Итак, вы имеете в виду, что здесь ничего не происходит, потому что он пуст ... Тогда есть причина, по которой разработчик включил его в код? –

+1

Да, его можно установить пустым или лучше не использовать, если вам не нужно указывать определенные действия. Возможно, разработчик мог обеспечить гибкость. – sansarp

+0

Я вижу. Благодарю. , –