我真的在这里错过了什么。
我已经阅读了许多关于设计重定向的内容(对于大多数人来说似乎很难实现......)但在我的情况下,我真的没有得到它。
有时我读到方法after_<action>_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
:
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
有什么想法吗?
答案 0 :(得分:1)
感谢@ rich-peck的帮助,我们明白了。
问题是为什么after_sign_in_path_for
的行为与after_sign_up_path_for
和cie不同?
看起来in the devise sources,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
等是设计模块,不一定使用,并且在这种情况下帮助器不合适。设计撰稿人可以在这一点上帮助我们。
答案 1 :(得分:0)
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'}