我先说一下这个问题: 如何在设计登录过程中传递参数?
现在剩下的......
我正在尝试在我的Rails 3应用程序中实现以下功能。
我有一组用户,每个用户都有自己的个人资料页面。我希望他们能够查看自己的个人资料页面,但不能查看其他用户的个人资料页面,除非他们是管理员,在这种情况下他们可以访问应用程序中的所有内容。
我已经创建了一个用户控制器,并将以下代码应用到控制器的开头(对于我已经替换的记录,用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"
因此,假设当用户访问以下URL时:http://appli.cat.ion首先会提示他们输入登录信息,然后重定向到root_path,这是Users控制器的show动作。除非我可以在登录过程中传递:id参数,否则将导致无限重定向循环。 Devise中有什么能帮助解决这个问题吗?如果我碰到一个,我会继续自己查看并发布答案。
谢谢,
莱斯
编辑#1 :我相信我已经接近解决方案了。基于我需要的所需功能,我相信以下两种Devise方法可以提供帮助:
after_sign_in_path_for(resource)
和
stored_location_for(resource)
我已将after_sign_in_path覆盖到以下内容:
def after_sign_in_path_for(resource)
user_root_path(:id => current_user.username)
end
提供了所需的效果(用户登录,被重定向到他们的个人资料页面),但只有当我在stored_location_for中返回nil时才会这样:
def stored_location_for(resource)
nil
end
只是为了重申我的目标,我的目标是将用户重定向到他们的个人资料页面,如果已经直接导航到(http):// appli.cat.ion/,那么他们当然已经登录了。如果用户导航到(http):// appli.cat.tion/otherresources,那么我想首先在用户中签名,然后将其重定向到他们请求的页面。如果我在stored_location_for中返回nil,那么用户将始终被重定向到他们的个人资料页面,无论如何,这是不希望的,并且在最坏的情况下是不可用的。我认为如果我直接导航到应用程序登录,那么stored_location将返回nil,并在登录时被定向到我的个人资料页面,但它只是将我重定向到root_path。非常困惑,但至少我正在取得进展......
答案 0 :(得分:0)
我认为您可以在UsersController中创建一个配置文件操作,该操作会重定向到用户显示页面,然后将其标记为用户root
在UsersController中
class UsersController < ApplicationController
...
def profile
redirect_to user_url(:id => current_user.username)
end
...
end
在路线
resources :users do
get 'profile', :on => :collection, :as => :user_root
end
并且不需要使用after_sign_in_path hook。