Вопрос о маршруте относительно Authlogic и Rails 3.0.0 - PullRequest
1 голос
/ 18 сентября 2010

Я обновил приложение, над которым я работаю, с Rails 3.0.0.beta4 до Rails 3.0.0 и обнаружил непредвиденную ошибку.Я использую authlogic для аутентификации, и после обновления маршрут для новой формы сеанса пользователя начал выдавать эту ошибку.

неопределенный метод `user_sessions_path '

Хорошо, я использую контроллер единственного числаназвание.Не уверен, что отличается между бета4 и новым выпуском, который вызвал проблему.

В моем файле rout.rb у меня есть это:

  get "user_session/new",     :as => :login
  get "user_session/destroy", :as => :logout
  resources :user_session, :controller => :user_session

, который определяет мой единственный маршрут контроллера.

Чтобы решить проблему, мне пришлось изменить первую строку формы с этой:

<%= form_for @user_session do |f| %>

на эту:

<%= form_for @user_session, :url =>  user_session_index_path do |f| %>

Что меня странно поражает, так этоназвание маршрута.Запуск рейковых маршрутов показал название маршрута, но я не понимаю, зачем нужен индекс.Я ожидал чего-то большего, чем user_session_path для метода post.Мои маршруты user_session - единственные, действующие таким образом.Все остальные, как я и ожидал.

Вот вывод от рейк-маршрутов:

 user_session_index GET    /user_session(.:format)                              {:action=>"index", :controller=>"user_session"}
 user_session_index POST   /user_session(.:format)                              {:action=>"create", :controller=>"user_session"}

Это работает, но мне любопытно узнать, сталкивался ли кто-нибудь еще с этим.

1 Ответ

1 голос
/ 18 сентября 2010

Прежде всего, я не понимаю, почему вы указываете имя контроллера, когда оно совпадает с именем ресурса? Те два, эквивалентны:

resources :user_session, :controller => :user_session
resources :user_session

AFAIR by design create просто выполняет POST по тому же пути, что и index. По определению, когда имя контроллера единственное, маршрутизатор не сможет создать множественную версию имени. Это работает наоборот. Таким образом, существует суффикс _index как в индексе, так и при создании действий.

Имя в единственном числе предполагает, что ресурс является единственным, поэтому вы должны просто использовать (sigular для resource ):

resource :user_session

В этом случае не будет никакого действия индекса (так как оно не имеет смысла для единственного ресурса), и имя для пути создания будет user_session_path.

Как примечание, единый ресурс не подразумевает, что существует только один экземпляр модели. Он просто указывает, как вы получаете доступ к ресурсу. Например, у вас может быть несколько пользователей с профилями, но есть смысл использовать единый ресурс для управления профилями, поскольку каждое использование может получить доступ только к своему профилю.

пс. Я перешел к Devise для аутентификации до Rails 3, и я не совсем помню, как раньше маршруты решались в Authlogic.

...