我见过很多关于将用户重定向到他使用设计的最后一页的问题。这里有一个很好的解释和示例代码
这对我有用,这有时是我想要的,但有时,我希望重定向到用户试图访问的受限页面,而不是他之前所在的页面。例如:
- 用户点击主页上的“创建新帖子按钮”
- 这击中了帖子控制器,新操作受 before_filter 保护,需要用户登录
- 用户被重定向到登录页面
- 登录后,用户现在被重定向到主页。
- 但是,在这种情况下,我希望用户使用他尝试访问的新帖子表单而不是主页被重定向到新操作。
我见过很多关于将用户重定向到他使用设计的最后一页的问题。这里有一个很好的解释和示例代码
这对我有用,这有时是我想要的,但有时,我希望重定向到用户试图访问的受限页面,而不是他之前所在的页面。例如:
所以我意识到,为了重定向到用户在登录后尝试访问的受保护页面,store_location 函数需要是 before_filter 而不是 after_filter。
before_filter :store_location
def store_location
# store last url as long as it isn't a /users path
session[:previous_url] = request.fullpath unless request.fullpath =~ /\/users/
end
def after_sign_in_path_for(resource)
session[:previous_url] || root_path
end
这是有道理的,因为在这种情况下,会话变量被设置为受保护的页面,因为 store_location 函数在我尝试访问new_post_path
示例时正确执行。当您将 store_location 作为 github 代码示例中的 after_filter 时,最后一次执行 store_location 函数是当我到达非受保护操作时,即我的示例中的主页。
在重定向到登录页面之前使用以下代码段设置当前路径:
session[:previous_url] = request.fullpath unless request.fullpath =~ /\/users/
成功登录后检查此会话变量,如果已设置,然后重定向到它。