我希望我的用户模型在保存之前清理一些输入。现在可以做一些简单的空白剥离。
例如,为了避免人们注册“Harry”并假装是“Harry”。

我认为在验证之前进行剥离是个好主意,这样 validates_uniqueness_of 可以避免意外重复。

class User < ActiveRecord::Base
  has_many :open_ids

  validates_presence_of :name
  validates_presence_of :email
  validates_uniqueness_of :name
  validates_uniqueness_of :email
  validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i

  before_validation :strip_whitespace, :only => [:name, :email, :nick]

  private
  def strip_whitespace(value)
    value.responds_to?('strip') ? value.strip : value
  end
end

但是,此代码带有错误 ArgumentError: wrong number of arguments (0 for 1)。我假设回调将传递值。

另外:这种剥离实际上是个好主意吗?或者我应该在空间上进行验证并告诉用户“Harry”包含无效空格(我想允许“Harry Potter”但不允许“Harry\s\sPotter”)。

编辑:正如评论中指出的那样,我的代码是错误的(这就是我问 a.o. 问题的原因)。除了我的问题之外,请确保您阅读了已接受的答案以获得正确的代码,并避免我犯的同样错误。

最佳答案

我不相信 before_validation 是这样工作的。你可能想这样写你的方法:

def strip_whitespace
  self.name = self.name.strip unless self.name.nil?
  self.email = self.email.strip unless self.email.nil?
  self.nick = self.nick.strip unless self.nick.nil?
end

如果你想使用像 self.columns 这样的东西,你可以让它更动态,但这就是它的要点。

关于ruby-on-rails - Rails before_validation 去除空白最佳实践,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3268053/

10-14 00:16