我正在使用带有设计的轨道进行注册。我还添加了一个邀请码,所以不是每个人都可以注册。
邀请代码通过查询字符串(如"/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 控制器才能使其正常工作。
这个答案很好地描述了如何做到这一点。
基础知识:
- 安装设计视图(如果尚未使用
rails generate devise:views
) - 创建子类化
Devise::RegistrationsController
- 更新 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]
然后,当注册未通过验证时,可以在将为失败注册显示的视图中使用该变量。
我的意思是之前,它是重定向的,您应该将邀请代码参数与实例变量一起保留。 对不起,如果我弄错了。