在设计注册中保留查询字符串



我正在使用带有设计的轨道进行注册。我还添加了一个邀请码,所以不是每个人都可以注册。

邀请代码通过查询字符串(如"/users/sign_up?invite_code=wajdpapojapsd")传输,并添加到注册表单的隐藏字段中,其中包含"f.hidden_field :invite_code, :value => params[:invite_code]"。

这很有效。唯一的问题是,如果注册未得到验证和拒绝,设计将重定向到"/users"并丢失包含invite_code的查询字符串。

由于电子邮件在尝试失败后仍保留在注册表单中,我相信这也适用于邀请代码。作为最坏的解决方案,在注册失败并丢失电子邮件后重定向:back,但保留邀请码,将比现在的工作方式更好。

编辑:到目前为止,我已经为设计设置了一个注册控制器,但不知道如何获得所需的行为。

有关如何保留查询字符串或仅保留邀请代码的任何帮助都将很棒。

我现在找到了一个可行的解决方案。

我使用 jstr 的答案来设置用于设计的控制器并添加了"会话"行。

class MyRegistrationsController < Devise::RegistrationsController
  prepend_view_path "app/views/devise"
  def create
    super
    session[:invite_code] = resource.invite_code
  end
  def update
    super
  end
end

之后,我将以下内容添加到设计/注册/new.html.erb

<% if params[:invite_code]
  @invite_code = params[:invite_code]
else
  @invite_code = session[:invite_code]
end %>

并将hidden_field改为

<%= f.hidden_field :invite_code, :value => @invite_code %>

您可能需要创建自己的子类化 Devise 控制器才能使其正常工作。

这个答案很好地描述了如何做到这一点。

基础知识:

  1. 安装设计视图(如果尚未使用rails generate devise:views
  2. 创建子类化Devise::RegistrationsController
  3. 更新 Designing 路由声明,让 Designing 使用子类化控制器

@James Lever的解决方案有一个缺点。invite_code仍在开会。在某些解决方案中,它可能会导致问题。另一种选择是:

def create
  # set invite code to session:
  session[:invite_code] = resource.invite_code
  # here the form is rendered and invite code from session would be used:
  super
  # delete invite code from session: 
  session.delete('invite_code')
end

为什么不使用实例变量,例如

@invite_code = params[:invite_code]

然后,当注册未通过验证时,可以在将为失败注册显示的视图中使用该变量。

我的意思是之前,它是重定向的,您应该将邀请代码参数与实例变量一起保留。 对不起,如果我弄错了。

相关内容

  • 没有找到相关文章

最新更新