将自定义字段验证添加到ROR Devise

时间:2016-02-26 15:17:35

标签: ruby-on-rails ruby devise

我正在尝试通过检查用户在注册时输入的代码是否存在于表中来配置设计来验证用户注册。为了测试它,我目前只是针对静态字符串测试输入。有关如何做的任何想法?问题是由于某种原因,字符串没有从:ticket_id注册字段传递到用户类中的:invite_code_valid函数。当我检查变量中的内容时,它只是空白,并且在注册时使用字符串“hello”会给出我指定的错误消息。

代码是英雄git所以我无法链接到它,但我这样做了:

迁移:

class AddUserTicketIdField < ActiveRecord::Migration
  def change
    change_table :users do |t|
        t.text  :ticket_id
    end
  end
end

在models / user.rb中:

验证:invite_code_valid,:on =&gt; :创建

  def invite_code_valid
    unless self.ticket_id == "hello"
      self.errors.add(:ticket_id, "membership code is not one we recognize, check again?")
    end
  end

在设计/注册/ new.html.erb:

<div class="field">
  <%= f.label :Membership_code %><br />
  <%= f.text_field :ticket_id, autocomplete: "off" %>
</div>

要查看代码是否正常工作,我尝试验证某个类似的电子邮件:

  def invite_code_valid
    unless self.email == "some@email.com"
      self.errors.add(:ticket_id, "membership code is not one we recognize, check again?")
    end
  end

有效。使用电子邮件some@email.com注册时,注册会进行,但不会注册。

发生了什么事,我错过了Devise的工作方式吗?

------------求助------------

Josh Deedens的回答低于当场。谢谢!为了将来的参考,这就是我所做的。

class ApplicationController < ActionController::Base

  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

    def configure_permitted_parameters
       devise_parameter_sanitizer.for(:sign_up)        << :ticket_id
    end
end

1 个答案:

答案 0 :(得分:2)

我的赌注是你被强参数咬伤了:

来自设计自述文件:https://github.com/plataformatec/devise#strong-parameters

  

当您自定义自己的视图时,最终可能会向表单添加新属性。 Rails 4将参数清理从模型移动到控制器,导致Devise也在控制器处理这个问题。

文档继续给出这个例子

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
  end
end

因此,尝试将configure_permitted_parameters方法与相应的过滤器一起添加到ApplicationController中。并将:username密钥替换为:ticket_id,看看是否解决了ticket_id为零的问题。

祝你好运!