创建字段需要并在验证时以“http://”开头

时间:2012-05-28 18:14:36

标签: ruby-on-rails ruby ruby-on-rails-3

我正在尝试为store.website编写自定义验证。我希望该方法检查网站字段是以http://还是https://开头的。这就是我尝试过的:

class Store < ActiveRecord::Base
  validate :website_has_correct_format

  def website_has_correct_format
    self.website = self.website.downcase.start_with?(/https?:\/\//, '')
  end
end

但这不起作用。出于某种奇怪的原因,它只是保存了字母t

这样做的正确方法是什么?另外,我也可以加:message吗?

3 个答案:

答案 0 :(得分:2)

  1. 不要修改验证器中的值;验证者应该在不改变的情况下验证现有数据。

  2. start_with?方法将普通String作为参数,而不是Regexp

  3. 因此,您可以像这样实现验证器:

    def website_has_correct_format
      errors.add(:website, "Wrong website") unless website.downcase.start_with?('https://', 'http://')
    end
    

答案 1 :(得分:1)

start_with? returns true or false - 给出一个字符串参数。

您还将验证与设置值混为一谈 - 验证是或否;为什么要在验证方法中设置属性值?

答案 2 :(得分:1)

您不应该在验证中修改模型中的数据,因为您有before_save个动作。验证者应该看:

def website_has_correct_format
  errors.add(:website, 'Wrong website') unless website =~ %r{\Ahttps?://}
end