Devise登录时如何传递参数

2024-02-01

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这是用户控制器的显示操作。除非我能传递idparam 在登录过程中,这将导致无限重定向循环。 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.


我认为您可以在 UsersController 中创建一个配置文件操作,该操作会重定向到用户显示页面,然后将其标记为用户 root。

在用户控制器中:

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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Devise登录时如何传递参数 的相关文章

随机推荐