gpt4 book ai didi

ruby-on-rails - Devise登录时如何传参

转载 作者:行者123 更新时间:2023-12-02 05:10:44 25 4
gpt4 key购买 nike

如何在 Devise 登录过程中传递参数?

我有一组用户,每个用户都有自己的个人资料页面。我希望他们能够查看自己的个人资料页面,但不能查看其他用户的个人资料页面,除非他们是管理员,在这种情况下他们可以访问应用程序中的所有内容。

我创建了一个用户 Controller ,并将以下代码应用到 Controller 的开头。我用他们的用户名替换了通过 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,这是显示操作用户 Controller 。除非我可以在登录过程中传递 id 参数,否则这将导致无休止的重定向循环。 Devise 中有什么东西可以帮助解决这个问题吗?

我相信以下两种 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

最佳答案

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

在用户 Controller 中:

class UsersController < ApplicationController
...
def profile
redirect_to user_url(:id => current_user.username)
end
...
end

在 route :

resources :users do
get 'profile', :on => :collection, :as => :user_root
end

并且不需要使用 after_sign_in_path Hook 。

关于ruby-on-rails - Devise登录时如何传参,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5903589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com