在Devise登录期间传递参数

时间:2011-05-05 20:18:39

标签: ruby-on-rails-3 devise declarative-authorization

我先说一下这个问题: 如何在设计登录过程中传递参数?

现在剩下的......

我正在尝试在我的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。非常困惑,但至少我正在取得进展......

1 个答案:

答案 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。