gpt4 book ai didi

ruby-on-rails - 用户确认后如何重定向到其他页面

转载 作者:行者123 更新时间:2023-12-04 06:18:58 24 4
gpt4 key购买 nike

我正在使用 Rails 3.2.13 和 Devise 3.2.4。用户注册后,生成确认链接:

localhost:3000/users/confirmation?confirmation_token=HpPHitLtV3CnLy2z1ZmQ

我想在点击确认链接后重定向到 mentors/new 操作,但在确认后它重定向到我不想要的 /users/sign_in .

到目前为止,这是我的代码:

路线:

devise_for :users
devise_for :users, :controllers => { :confirmations => 'confirmations' }

创建确认 Controller 并从 Devise::ConfirmationsController 覆盖:

class ConfirmationsController < Devise::ConfirmationsController
protected

def after_confirmation_path_for(resource_name, resource)
if resource.has_role? :user
redirect_to new_mentor_path("account_id")
else
root_path
end
end
end

在 ConfirmationsController 中,也许我必须添加一些额外的代码。

在应用程序 Controller 中,我有这段代码,在成功登录后将我带到mentor/student 家:

def after_sign_in_path_for(resource_or_scope)
if resource_or_scope.is_a?(User)
if current_user.user_type == "mentor"
home_mentors_path(:account_id => current_user.account_id)
else
home_students_path(:account_id => current_user.account_id)
end
end

结束

def after_sign_up_path_for(resource_or_scope)
root_path
end

大体上逻辑是这样的,但是我不明白怎么用Devise来做:

def activate
@user = User.where("activation_code = ?","#{params[:id]}").first
if !@user.blank?
if @user.created_at < 24.hours.ago
if @user and @user.activate
cookies[:user_id]=@user.id
if @user.user_type == "student"
redirect_to new_student_path
else
redirect_to new_mentor_path
end
else
@user.destroy
redirect_to "/"
end
else
@user.destroy
redirect_to "/"
end
else
redirect_to "/"
end

结束

最佳答案

如果您查看 Devise GitHub repository ,当您点击确认链接时调用此方法:

# GET /resource/confirmation?confirmation_token=abcdef
def show
self.resource = resource_class.confirm_by_token(params[:confirmation_token])
yield resource if block_given?

if resource.errors.empty?
set_flash_message(:notice, :confirmed) if is_flashing_format?
respond_with_navigational(resource){ redirect_to after_confirmation_path_for(resource_name, resource) }
else
respond_with_navigational(resource.errors, status: :unprocessable_entity){ render :new }
end
end

现在你已经覆盖了 Devise 的 after_confirmation_path 方法:

protected
def after_confirmation_path_for(resource_name, resource)
if resource.has_role? :user
redirect_to new_mentor_path("account_id")
else
root_path
end
end

这很好,Devise 将重定向到您的 new_mentor_path,但在您的 Mentor Controller 中,您将有一个 before 文件管理器来检查身份验证,例如:

before_action :authenticate_user! #this will check if your user is signed in or not and if not it'll redirect you

正如@Rich Peck 建议的那样,您基本上还需要重写您的 show 操作,以便您的用户在被重定向到您的 new_mentor_path 之前先登录。

在您的show 操作中,您可以执行类似这样的操作以确保您的用户已登录:

# GET /resource/confirmation?confirmation_token=abcdef
def show
self.resource = resource_class.confirm_by_token(params[:confirmation_token])

if resource.errors.empty?
set_flash_message(:notice, :confirmed) if is_navigational_format?
sign_in(resource)
respond_with_navigational(resource){ redirect_to after_confirmation_path_for(resource_name, resource) }
else
respond_with_navigational(resource.errors, :status => :unprocessable_entity){ render :new }
end
end

此外,我注意到在您的 after_confirmation_path 中有

redirect_to new_mentor_path("account_id")

为什么要在路径中将 account_id 作为字符串传递?

如果您的 account_id 是一个整数,那么您必须首先在 show 操作中设置它,然后调用您的 after_confirmation_path ,例如

respond_with_navigational(resource){ redirect_to after_confirmation_path_for(resource_name, resource, account_id) }

此外,您还必须更改 after_confirmation_path 的定义,例如:

def after_confirmation_path_for(resource_name, resource, account_id)
if resource.has_role? :user
redirect_to new_mentor_path(account_id)
else
root_path
end
end

关于ruby-on-rails - 用户确认后如何重定向到其他页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24720491/

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