我在Devise的github上尝试过代码。在我的应用程序控制器中,我有:
after_filter :store_location
def store_location
# store last url - this is needed for post-login redirect to whatever the user last visited.
if (request.fullpath != "/users/sign_in" &&
request.fullpath != "/users/sign_up" &&
request.fullpath != "/users/password" )
session[:previous_url] = request.fullpath
puts 'stores location'
end
end
def after_update_path_for(resource)
session[:previous_url] || dashboard_path
puts 'after update'
end
当我检查我的服务器时,会出现store_location方法中的puts语句,但来自after_update_path_for的puts语句却没有。如何让after_update_redirect工作?
以下是设计要做的事情,但它不起作用:
答案 0 :(得分:3)
以下是我如何解决问题:
class RegistrationsController < Devise::RegistrationsController
protected
def after_update_path_for(resource)
puts 'this is happening yoyo mama'
flash[:notice] = "Account succesfully updated"
edit_user_registration_path
end
end
路线:
devise_for :users, :controllers => { :registrations => :registrations }
唯一的问题是,如果更改密码成功,这只会进行重定向。如果不是,则不会发生重定向。有没有人知道怎么做,所以如果有错误也会发生重定向?
答案 1 :(得分:2)
来自文档:
(对象)after_update_path_for(资源)(受保护)
更新资源后要使用的默认URL。您需要在自己的RegistrationsController中覆盖此方法。
所以创建你的注册控制器是正确的。这是一个更简单的解决方案:
after_update_path_for
来电signed_in_root_path(resource)
,看起来像一个家#{scope}_root_path
。这里的范围通常是user
(但如果不是,你可能知道它是什么)。对于“用户”,在应用程序控制器中实施user_root_path
,返回dashboard_url
即可。
def user_root_path
dashboard_url
end
虽然起初对我来说似乎有些迟钝,但我相信它确实很“不错”;用户范围的根路径确实可以是仪表板页面。
答案 2 :(得分:1)
根据Devise docs,覆盖默认值并添加路线。除非你想要改变它,否则不需要设置flash消息。
# Example subclass/override (registrations_controller.rb)
class Users::RegistrationsController < Devise::RegistrationsController
protected
def after_update_path_for(resource)
user_path(resource)
end
end
# Example routing config (in routes.rb):
devise_for :users, :controllers => { :registrations => :registrations }
答案 3 :(得分:0)
respond_with resource, :location => after_update_path_for(resource)
是在更新后设置重定向路径的代码。要更改默认重定向,请通过添加以下代码覆盖应用程序控制器中的以下方法
def after_update_path_for(resource_or_scope)
dashboard_url
end
答案 4 :(得分:0)
覆盖ApplicationController中的路由对我来说也不起作用,但将其添加到Users :: RegistrationsController工作。 例如,
class Users::RegistrationsController < Devise::RegistrationsController
def after_update_path_for(resource)
current_user
end
在相关的说明中,after_sign_in_path可以添加到SessionsController
class Users::SessionsController < Devise::SessionsController
def after_sign_in_path_for(resource)
current_user
end
我的路线看起来像这样:
devise_for :users, controllers: {
confirmations: "users/confirmations",
passwords: "users/passwords",
registrations: "users/registrations",
sessions: "users/sessions",
unlocks: "users/unlocks",
}