我希望能够以电子邮件链接的形式向潜在用户提供代码(例如 mysite.com/signup?beta=rapunzel)
当有人单击该链接时,它会使用该值填充一个 hidden_field(仅使用 :params[:beta] 会起作用吗?)
然后在它创建用户之前,它通过检查另一个我有不同 beta 代码的表来验证。
然后继续存储哪些代码或者只是 beta.id。
建议?插件已经存在?
谢谢。
我希望能够以电子邮件链接的形式向潜在用户提供代码(例如 mysite.com/signup?beta=rapunzel)
当有人单击该链接时,它会使用该值填充一个 hidden_field(仅使用 :params[:beta] 会起作用吗?)
然后在它创建用户之前,它通过检查另一个我有不同 beta 代码的表来验证。
然后继续存储哪些代码或者只是 beta.id。
建议?插件已经存在?
谢谢。
当您的用户点击 mysite.com/signup 时,与该路由关联的操作将具有存储在 params[:beta] 中的值“rapunzel”。您可以通过将其分配给实例变量(@beta)将其传递到您的视图,按计划通过隐藏字段将其传递回您的用户控制器,并在保存用户对象之前将其与您的表进行比较。
或者,如果用户传入有效的 beta 代码,您可以只允许他们访问注册页面,在这种情况下,您不需要任何特殊的表单字段:
def signup
unless BetaCode.find_by_code(params[:beta])
flash[:notice] = "You can't sign up without a beta code!"
redirect_to root_path
end
end
您从 URL 中获得的参数取决于您的路由设置方式。使用您当前的路线,您将获得:
params[:beta] = "rapunzel"
如果您将路线指定为:
map.connect '/signup/:beta', :controller => 'signup', :action => 'beta'
您可以向他们发送一个链接,例如:mysite.com/signup/rapunzel,您将获得与以前相同的 beta 参数。
要将 beta 字段添加到表单中,只需将其作为隐藏字段包含在表单页面模板中即可。
在控制器中放置如下内容:
@beta_id = params[:beta]
然后在视图模板中放置:
hidden_field_tag 'beta', @beta_id
然后,当他们注册并创建正确的 id 时,您可能希望将用户表中的行与“beta”表中包含 beta id 的行关联起来。如果您只想允许单个用户使用每个 beta id 注册,这可能是 beta 表上的 has_one 关联,或者如果多个人可以注册它,则可能是 has_many。
我会通过验证来做到这一点。
class User < ActiveRecord::Base
validate_on_create {|r|
beta_code = BetaCode.find_by_code(r.beta_code)
beta_code && beta_code.destroy ||
r.errors.add(beta_code, "is invalid")
}
attr_accessor :beta_code
end
在您的表格中:
<% form_for(@user) do |f| %>
# fields...
<%= f.text_field :beta_code %>
<% end %>
这假设您有一个 BetaCode 模型,其表包含一个 beta 代码列表。