如何重写我的Rails验证规则,以便它不使用底层正则表达式?

时间:2016-12-08 17:23:14

标签: ruby regex validation ruby-on-rails-4 model

我在PostGres 9.5中使用Rails 4.2.7。我的模型中有这个验证规则

validates :name, presence: true

这将调用Rails中的底层代码(来自.rvm / gems / ruby​​-2.3.0 / gems / activesupport-4.2.7.1 / lib / active_support / core_ext / object / blank.rb)...

class String
  BLANK_RE = /\A[[:space:]]*\z/
…
  def blank?
    BLANK_RE === self
  end

当我将模型的名称属性设置为

"C\xE9dric Lanier”

然后在我的方法上调用#valid?,我收到编码错误:

  

((ArgumentError)UTF-8中的无效字节序列)

如何在上面重写我的验证规则,以便它不使用底层正则表达式?请注意,此问题与解决编码错误无关。我为此开了另一个问题。

1 个答案:

答案 0 :(得分:1)

validate :name_present

def name_present
  if name.mb_chars.tidy_bytes.to_s.blank?
    errors.add(:name, "can't be blank")
  end
end

它基本上取代了奇怪的字符:

"C\xE9dric Lanier".mb_chars.tidy_bytes.to_s # => "Cédric Lanier"