gpt4 book ai didi

ruby-on-rails-3 - 在设计中确认后如何重定向页面

转载 作者:行者123 更新时间:2023-12-03 14:00:56 29 4
gpt4 key购买 nike

假设用户单击指向 protected 页面的链接。然后,他们将被重定向到可以登录的登录屏幕。如果他们登录了,则成功重定向到该页面。但是,如果他们没有帐户,则必须注册。这是事情变得棘手的地方,因为我正在做电子邮件确认。

通过单击它创建一个新 session 的链接,我不能自动将用户重定向到该 protected 页面。我试图通过在确认链接中添加对重定向的引用来改变这一点。我想要做:

<%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @resource.confirmation_token, :redirect_to => stored_location_for(@resource)) %>

但我不知道如何访问 stored_location_for (或者如果那是正确的位置)。它在 Devise::Controllers::Helpers 中定义, 但它是一个实例方法所以我不能做 Devise::Controllers::Helpers.stored_location_for(…) .

如何访问 stored_location_for或者这样做的更好方法是什么?

我的目标是做到这一点,然后在我的自定义 ConfirmationsController 中定义:
def show
if params[:redirect_to]
session["user_return_to"] = params[:redirect_to]
end
super

end

那应该有效吗?

最佳答案

我想到了。我不确定这是否随着 Devise 昨天在使 Devise::Mailer 将其大部分功能放入模块中所做的更新而改变。 (参见 codeticket 了解更多信息)。

基本上归结为无法访问 session在邮件程序 View 内。因此,您必须将重定向作为变量传递。设计使用 after_create您的资源(在我的情况下为 User)上的方法,然后发送确认电子邮件。这意味着我不能直接将 session 变量传递给邮件程序。因此,为了获得此功能,我觉得这是一个非常讨厌的解决方法,但这里是代码:

获取 redirect_to变量到邮件中,您必须向用户添加一个变量,因此:

class User < ActiveRecord::Base

attr_accessor :return_to

end

然后,您必须在第一次创建用户时设置该变量。

我已经有一个用于注册的自定义 Controller 设置。 (有关如何设置的信息,请参阅设计的自述文件,或参阅@ramc 的答案以了解方向)。不过这部分做起来还是比较容易的,我只是把它加到参数里面,剩下的就自己搞定了。
class RegistrationsController < Devise::RegistrationsController
def create
params[:user][:return_to] = session[:user_return_to] if session[:user_return_to]

super
end
end

现在用户有一个变量 return_to这是设置的。我们只需要在 confirmation_instructions 中访问它电子邮件。我已经重写了 Confirmation_instructions.html.erb 的一部分,所以我在里面添加了:
<% if @resource.return_to %>
<%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @resource.confirmation_token, :redirect_to => @resource.return_to) %>
<% else %>
<%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %>
<% end %>

(对于那些不熟悉此的人, @resource 是 Devise 用来定义您的用户的变量)。

现在,一旦用户单击该链接,我们就需要重定向它们。 @ramc 的 before过滤器适用于此:
class ConfirmationsController < Devise::ConfirmationsController
before_filter :set_redirect_location, :only => :show

def set_redirect_location
session[:user_return_to] = params[:redirect_to] if params[:redirect_to]
end
end

这将处理新用户进入 protected 页面然后注册、单击确认链接并正确重定向到 protected 页面的情况。

现在我们只需要处理用户执行上述操作的情况,但他们没有点击链接,而是尝试返回 protected 页面。在这种情况下,他们被要求注册/登录。他们登录,然后被要求确认他们的电子邮件,并可以选择重新发送确认电子邮件。他们输入了他们的电子邮件,现在我们需要输入 redirect_to新确认电子邮件中的变量。

为此,我们需要修改 ConfirmationController,类似于我们修改 RegistrationController 的方式。这次我们需要修改 create方法。开箱即用的工作方式是调用名为 send_confirmation_instructions 的用户的类方法。 .我们想重写那个方法,这样我们就可以通过 return_to变量进去。
class ConfirmationsController < Devise::ConfirmationsController
def create
self.resource = resource_class.send_confirmation_instructions(params[resource_name],session[:user_return_to])

if resource.errors.empty?
set_flash_message(:notice, :send_instructions) if is_navigational_format?
respond_with resource, :location => after_resending_confirmation_instructions_path_for(resource_name)
else
respond_with_navigational(resource){ render_with_scope :new }
end
end
end

唯一与 Devise 不同的是 create 的第一行。 ,我们传入两个变量。现在我们需要重写那个方法:
class User < ActiveRecord::Base
def self.send_confirmation_instructions(attributes={},redirect=nil)
confirmable = find_or_initialize_with_errors(confirmation_keys, attributes, :not_found)
confirmable.return_to = redirect if confirmable.persisted?
confirmable.resend_confirmation_token if confirmable.persisted?
confirmable
end
end
confirmable成为 User 的一个实例(基于电子邮件的当前用户)。所以我们只需要设置 return_to .

就是这样。

关于ruby-on-rails-3 - 在设计中确认后如何重定向页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6499589/

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