如何使用Judge Gem配置唯一性和自定义验证?

时间:2014-07-09 15:05:34

标签: ruby-on-rails-4 client-side-validation

我在rails应用程序上使用了判断gem来进行客户端验证。我的用户模型的验证看起来像这样:

  VALID_EMAIL_REGEX = /^[\w+\-.]+@[a-z\d\-.]+\.[a-z]+$/i 
  VALID_USERNAME_REGEX = /^[A-Za-z\d_]+$/

  validates :username,        :presence => true,
                              :uniqueness => true,
                              :length => { :within => 2..49 },
                              :format => { :with => VALID_USERNAME_REGEX, :multiline => true },
                              :exclusion => { :in => RESERVED_HANDLERS }, :on => :create

  validates :email,           presence: true,
                              length: { maximum: 50 },
                              format: { with: VALID_EMAIL_REGEX, :multiline => true },
                              uniqueness: { case_sensitive: false }

由于我们点击了服务器的唯一性,我已经在初始化程序中公开了:username和:email for judge:

Judge.configure do
  expose User, :username, :email
end

现在问题是:理想情况下,我希望在客户端本身验证电子邮件和用户名格式,而不需要服务器,但我也想在服务器端保持相同的安全措施。所以请注意我放入的正则表达式与rails&两者都是javascript,我设置了:multiline =>对于^ $ end字符也是如此。

但这并不像预期的那样有效。客户端验证不能完美地用于1.:唯一性和2.电子邮件/用户名格式。为什么:uniqueness =>真的不行吗?

1 个答案:

答案 0 :(得分:0)

对于正则表达式问题:

将此代码放入judge.rb初始化程序中:

Judge::Validator.class_eval do
  def to_hash
    {
      :kind => kind,
      :options => get_js_compatible_options(options),
      :messages => messages.to_hash
    }
  end

  private

  def get_js_compatible_options(options)
    method_name = "get_js_compatible_#{self.kind}"
    if self.respond_to? method_name, options
      options = self.send method_name, options
    end
    options
  end

  def get_js_compatible_format(options)
    format_options = Hash.new
    options.each do |key, option|
      format_options[key] = (key == :with) ? convert_regex_to_js_compatible(option) : option
    end
    format_options
  end

  def convert_regex_to_js_compatible(regex)
    js_regex_source = regex.source.sub(/^\\A/, '^').sub(/\\z$/i, '$')
    /#{js_regex_source}/
  end
end

然后使用这个正则表达式:

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
VALID_USERNAME_REGEX = /\A[A-Za-z\d_]+\z/

Judge会自动将它们转换为兼容javascript的版本。