仅当

2011-04-27 69 views
0

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

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

任何帮助将不胜感激。

回答

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 

您需要进行测试以确保它可以很好地处理新记录。

+0

仍然没有... – 2011-04-27 20:46:47

+0

说谎...实施不正确。你赢了。 – 2011-04-27 20:50:51

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 
+0

没有这样的运气。仍然不会创建一个用户... – 2011-04-27 20:26:37

+0

我发现了一些错误报告,但是,与allow_nil – 2011-04-27 20:34:28

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 
+0

有关我喜欢你,但仍然不好。 Rails2.X的方式... – 2011-04-27 20:44:39