7

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

邀请码通过“/users/sign_up?invite_code=wajdpapojapsd”之类的查询字符串传输,并通过“f.hidden_​​field :invite_code, :value => params[:invite_code] 添加到注册表单的隐藏字段中”。

这工作得很好。唯一的问题是,如果注册没有得到验证和拒绝,设计重定向到“/users”并丢失其中包含invite_code的查询字符串。

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

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

任何关于如何保留查询字符串或只是邀请代码的帮助都会很棒。

4

4 回答 4

10

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

我使用 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

之后我在 devise/registrations/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 %>
于 2012-08-12T13:10:13.537 回答
1

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

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

基础:

  1. 如果您还没有安装 Devise 视图rails generate devise:views
  2. 创建一个子类Devise::RegistrationsController
  3. 更新您的设计路线声明以让设计使用您的子类控制器
于 2012-08-11T12:01:25.383 回答
1

@James Lever 的解决方案有一个缺点。邀请码保持在会话中。在某些解决方案中,它可能会导致问题。另一种选择是:

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
于 2016-02-25T13:03:38.687 回答
0

为什么不使用这样的实例变量

@invite_code = params[:invite_code]

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

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

于 2012-08-11T13:04:42.040 回答