我希望我的用户模型在保存之前清理一些输入。现在可以做一些简单的空白剥离。
例如,为了避免人们注册“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/