仅在何时验证

时间:2011-04-27 20:19:13

标签: ruby-on-rails model validation

我需要验证值的存在,但仅在填充值之后。创建用户时,不需要设置shortcut_url。但是,一旦用户决定选择shorcut_url,他们就无法删除它,它必须是唯一的,它必须存在。

如果我使用validates_presence_of,由于未定义shortcut_url,因此不会创建用户。如果我使用:allowblank =>是的,用户可以将“”作为shortcut_url,它不遵循网站的逻辑。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

这里我们总是确保shortcut_url是唯一的,但是如果设置了属性shortcut_selected(或者如果已设置并且现在已更改),我们只确保它存在

class Account 
  validates_uniqueness_of :shortcut_url
  with_options :if => lambda { |o| !o.new_record? or o.shortcut_changed? } do |on_required|
    on_required.validates_presence_of :shortcut_url
  end

end

您需要进行测试,以确保这适用于新记录。

答案 1 :(得分:0)

尝试使用:allow_nil选项代替:allow_blank。这样可以防止空字符串验证。

编辑:在创建用户时是否将空字符串分配给shortcut_url,然后呢?也许试试:

class User < ActiveRecord::Base
  validates_presence_of :shortcut_url, :allow_nil => true

  def shortcut_url=(value)
    super(value.presence)
  end
end

答案 2 :(得分:0)

尝试条件验证,例如:

validates_presence_of :shortcut_url, :if => :shortcut_url_already_exists?
validates_uniqueness_of :shortcut_url, :if => :shortcut_url_already_exists?

def shortcut_url_already_exists?
  @shortcut_url_already_exists ||= User.find(self.id).shortcut_url.present?
end