什么是“预填充属性除非已设置”的正确Rails方法?

时间:2014-01-30 11:25:13

标签: ruby-on-rails-4 activemodel

我有很多地方出现以下模式。情况是我需要使用“随机”信息预填充属性,除非它是由模型的消费者提供的。

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')(或 createbuild。或者通过其中一个属性助手,例如 fqdn=update_attribute(:fqdn, 'example.com')等等。

1 个答案:

答案 0 :(得分:0)

您可以测试params是否存在:params[:param_name].present?

The present? methodblank?的倒数)测试empty?,但也为空格返回false,以便''' 'nil[]{}都是假的。

对此的改进是使用the presence method。然后,您可以直接在控制器方法中执行此操作,而无需回调:

fqdn = params[:fqdn].presence || MyRandomNameGenerator.generate