8

摘要:我正在尝试更改自定义验证器中的属性值。ActiveModel::EachValidator给定以下原型:

def validate_each(record, attribute, value)

尝试设置value = thing似乎没有做任何事情——我错过了什么吗?应该有一个聪明的方法来做到这一点......

详细信息:我接受 URL 输入作为站点的一部分。我不想只获取 URL 并直接验证它是否返回一条200 OK消息,因为这会忽略不以 开头的条目http,或者省略前导www等。我有一些自定义逻辑来处理这些错误和跟随重定向。因此,如果用户输入example.org/article不是http://www.example.org/article. 该逻辑在验证中正常工作,但问题是如果有人输入前者,则数据库中存储的值是“错误”的形式,而不是经过良好更新的形式。我可以在验证期间将条目更改为更规范的形式吗?

4

1 回答 1

13

你应该让验证来做这件事:validate ; 这不是操作模型属性的正确位置。

请参阅 ActiveModel 的before_validation回调。这是操作模型属性以准备验证的更合适的位置。

看起来你必须告诉你的 ActiveModel 实现关于回调,至少根据这个 SO question

class YourModel
  extend ActiveModel::Callbacks
  include ActiveModel::Validations
  include ActiveModel::Validations::Callbacks

  before_validation :manipulate_attributes

  def manipulate_attributes
    # Your manipulation here.
  end
end
于 2012-07-30T18:19:15.083 回答