设计after_sign_in_path_for,但不是其他的

我真的在这里错过了一些东西。

我已经阅读了很多关于设计重定向的内容(对于大多数人来说似乎很难实现……)但在我的情况下我真的不明白。

有时我读到after__path_for(resource)应该在ApplicationController ,有时它被提到是在特定的控制器中,覆盖了设计控制器。

我宁愿在我的ApplicationController使用它们,因为它困扰我创建更多的控制器只是为了重定向,但如果最终不可能,我不会坚持……

这是交易:

我在我的ApplicationController :(以及其他一些,但这对于该示例来说已经足够了)

  def after_update_path_for(user) flash[:notice] = 'Successfully updated password' edit_user_path(user) end def after_inactive_sign_up_path_for(user) flash[:notice] = 'Welcome! Please follow the steps!' me_new_path end def after_sign_up_path_for(user) flash[:notice] = 'Welcome! Please follow the steps!' me_new_path end def after_sign_in_path_for(user) if user.sign_in_count == 1 me_new_path else root_path end end 

而疯狂的是,调用了after_sign_in_path_for ,而不是其他的。 就像用户注册时一样, if user.sign_in_count == 1重定向他,而不是after_inactive_sign_up_path_forafter_sign_up_path_for

怎么会?

它可能与我的路线有关,所以这是我的routes.rb提取:

  devise_for :user, :skip => [:sessions, :registrations], :path => '' devise_scope :user do get :register, :to => 'devise/registrations#new' post :register, :to => 'devise/registrations#create' put :update_password, :to => 'devise/my_registrations#update' get :login, :to => 'devise/sessions#new' get :login, :to => 'devise/sessions#new', :as => :new_copasser_session post :login, :to => 'devise/sessions#create' delete :logout, :to => 'devise/sessions#destroy' end 

我正在使用Devise 3.1.0和Ruby 1.9.3以及Rails 3.2.13

谢谢您的帮助!


编辑

谢谢@ rich-peck的回答。 我routes.rb这种方式更新了我的routes.rb

  devise_for :users, :path => '', :path_names => { :sign_in => :login, :registration => :register, :sign_up => '', :sign_out => :logout } 

它给了我与之前相同的路由(除了我不能再使用login_path助手了,但这不是什么大问题),但我仍然得到有关重定向的相同结果。

这是rake routes的结果:

  new_user_session GET /login(.:format) devise/sessions#new user_session POST /login(.:format) devise/sessions#create destroy_user_session DELETE /logout(.:format) devise/sessions#destroy user_password POST /password(.:format) devise/passwords#create new_user_password GET /password/new(.:format) devise/passwords#new edit_user_password GET /password/edit(.:format) devise/passwords#edit PUT /password(.:format) devise/passwords#update cancel_user_registration GET /register/cancel(.:format) devise/registrations#cancel user_registration POST /register(.:format) devise/registrations#create new_user_registration GET /register(.:format) devise/registrations#new edit_user_registration GET /register/edit(.:format) devise/registrations#edit PUT /register(.:format) devise/registrations#update DELETE /register(.:format) devise/registrations#destroy user_confirmation POST /confirmation(.:format) devise/confirmations#create new_user_confirmation GET /confirmation/new(.:format) devise/confirmations#new GET /confirmation(.:format) devise/confirmations#show 

任何的想法?

感谢@ rich-peck的帮助,我们想出来了。

问题是为什么after_sign_in_path_for行为与after_sign_up_path_for和cie不同?

在设计源中 , after_sign_in_path_for在辅助after_sign_in_path_for中定义了after_sign_in_path_for ,而其他的是其控制器的方法(例如, Devise::RegistrationsController < DeviseController

因此,对于after_sign_in_path_for它在ApplicationController覆盖,而对于其他的,则需要创建registrations_controller.rb文件,以覆盖其中的方法:

 class RegistrationsController < Devise::RegistrationsController protected def after_sign_up_path_for(copasser) flash[:notice] = 'Welcome! Please follow the steps!' me_new_path end end 

并以这种方式设置router.rb

 devise_for :copassers, :controllers => { :registrations => :registrations } 

我认为行为是不同的,因为:registerable, :recoverable等是设计模块,不一定使用,并且在这种情况下帮助程序不合适。 设计撰稿人可以在这一点上帮助我们。

Devise严重依赖于一个称为“资源”的中心变量。 此变量定义了设计如何在您的系统上运行,这就是您必须将Devise“附加”到用户或类似用户的原因

人们会遇到Devise的问题,因为他们不遵守惯例,并且无处不在。 如果他们阅读了Devise自述文件,他们会感激它非常灵活:)

我相信您的问题与您的路由有关,因为您可能希望将所有这些静态路由合并为以下内容:

 devise_for :users, :path => '', :controllers => {:sessions => 'sessions', :registrations => 'registrations'}, :path_names => { :sign_in => 'login', :password => 'forgot', :confirmation => 'confirm', :unlock => 'unblock', :registration => 'register', :sign_up => 'new', :sign_out => 'logout'}