Devise登录过程中如何传递参数?
我有一组用户,每个用户都有自己的个人资料页面。我希望他们能够查看自己的个人资料页面,但不能查看其他用户的个人资料页面,除非他们是管理员,在这种情况下他们可以访问应用程序中的所有内容。
我创建了一个 Users 控制器,并将以下代码应用到控制器的开头。我用他们的用户名替换了通过 ID 查找,所以/users/username
访问个人资料:
filter_access_to :all do
current_user == User.find_by_username(params[:id]) or
has_role? :admin
end
我在routes.rb中指定:
root :to => "users#show"
当用户访问时http://appli.cat.ion
系统将提示他们输入登录凭据,然后重定向到root_path
这是用户控制器的显示操作。除非我能传递id
param 在登录过程中,这将导致无限重定向循环。 Devise 中有什么东西可以帮助解决这个问题吗?
我相信以下两种设计方法可以有所帮助:
after_sign_in_path_for(resource)
and
stored_location_for(resource)
我已经覆盖了after_sign_in_path
至以下内容:
def after_sign_in_path_for(resource)
user_root_path(:id => current_user.username)
end
这提供了所需的效果:用户登录,被重定向到他们的个人资料页面,但前提是我返回nil
in stored_location_for
like:
def stored_location_for(resource)
nil
end
同样,我的目标是将用户重定向到他们的个人资料页面(如果已导航到)(http)://appli.cat.ion/
如果他们已登录,则直接进行。如果用户导航到(http)://appli.cat.tion/otherresources
然后我想登录用户,然后将他们重定向到他们请求的页面。如果我回来nil
in stored_location_for
那么无论如何,用户总是会被重定向到他们的个人资料页面,这往好里说是不受欢迎的,往坏了说是无法使用。我认为如果我直接导航到应用程序登录那么stored_location
会回来nil
,并在登录后定向到我的个人资料页面,但它只是将我重定向到root_path
.