我有很多地方出现以下模式。情况是我需要使用“随机”信息预填充属性,除非它是由模型的消费者提供的。
class Server
validates :fqdn, presence: true
before_validation prefill_fqdn, if: :must_prefill_fqdn?
private
def must_prefill_fqdn?
#what best to check against?
end
def prefill_fqdn
self.fqdn = MyRandomNameGenerator.generate
end
end
我正在寻找要检查的内容:
nil?
相当有限,不包括""
等值。它检查它是否为零,而不是它是否由消费者设置。empty?
捕获的数量更多,但仍不符合要求
“除非由消费者提供”,如果用户提供""
该怎么办?它
也会使validate presence: true
变得毫无用处:它会
永远不会无效。fqdn_changed?
似乎最匹配,但它的名称和父类(ActiveModel::Dirty
表明这也不是正确的测试。它不是changed
而是provided
或者这只是语义而且changed?
是正确的帮助吗?那么,看看“消费者是否提供了属性”的最佳测试是什么?
提供可以在Server.new(fqdn: 'example.com')
(或
create
或build
。或者通过其中一个属性助手,例如
fqdn=
或update_attribute(:fqdn, 'example.com')
等等。
答案 0 :(得分:0)
您可以测试params是否存在:params[:param_name].present?
The present?
method(blank?
的倒数)测试empty?
,但也为空格返回false,以便''
,' '
,nil
, []
和{}
都是假的。
对此的改进是使用the presence
method。然后,您可以直接在控制器方法中执行此操作,而无需回调:
fqdn = params[:fqdn].presence || MyRandomNameGenerator.generate