设计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_for
和after_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'}