将邀请码添加到Devise

时间:2015-02-28 22:17:39

标签: ruby-on-rails devise

我为婚礼创建了一个RSVP应用程序。为了消除RSVP中的随机人员,我希望在邀请中包含代码(即" groombride2015")。我想将此字段添加到注册中,除非此代码有效,否则不允许注册处理。我花了一整天的时间试图解决这个问题。

最让我开始工作的是使用这种方法...... http://wp.headynation.com/simple-invitation-access-code-using-rails-4-devise/

谁能帮我吗?

1 个答案:

答案 0 :(得分:10)

我前几天刚刚实施了这个,而且实际上非常简单。首先,您需要在

中的Devise注册表单中添加另一个允许的参数

app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  before_action :configure_permitted_parameters, if: :devise_controller?
  after_action :verify_authorized, unless: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(
        :username, 
        :email, 
        :password, 
        :password_confirmation, 
        :remember_me, 
        :sign_up_code
    ) }
  end
end

这些参数不必完全匹配,但您需要确保您输入注册码所使用的任何表单字段都与您在此处传递的名称相匹配。

现在使用代码属性字段更新设计视图:

app/views/devise/registrations/new.html.erb

<%= form_for( resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
  <!-- Your Other Form Stuff -->
  <%= f.text_field :sign_up_code %>
<% end %>

接下来,我们需要添加一个虚拟属性和一些验证:

app/models/user.rb

class User < ActiveRecord::Base
  attr_accessor :sign_up_code
  validates :sign_up_code,
    on: :create,
    presence: true,
    inclusion: { in: ["your_code"] }
  # The rest of your model
end

现在你已经全部准备好了!

请注意,如果您想要来自表invite_codes的动态邀请代码,您还可以执行以下操作:

inclusion: { in: proc { InviteCode.where( used: false ).map( &:code ) } }

在上面的模型中,我有一个字符串code和一个布尔used,以确保邀请代码只能使用一次。

例如,我使用以下seed.rb代码填充数据库创建时的邀请代码:

  invite_codes = (0...50).map { { code: SecureRandom.hex(7), used: false } }
  invite_codes = invite_codes.uniq

  invite_codes.each do |invite_code|
    InviteCode.find_or_create_by!( invite_code )
  end