如果属性已填满,请调用before_update

时间:2015-07-08 12:52:23

标签: ruby-on-rails ruby-on-rails-4

仅在填充特定属性时调用before_update触发器的方法是什么?

以下是我的代码的一部分:

before_update { self.gravatar = gravatar.downcase }

validates :gravatar, :on => :update, length: { maximum: 128 },
                    format: { with: VALID_GRAVATAR_REGEX }, 
                    allow_blank: true

事实上,我只想在编辑表单中填写此属性时才调用属性上的downcase函数。

我目前遇到以下错误:

  

nil的未定义方法`downcase':NilClass

这是合乎逻辑的。

3 个答案:

答案 0 :(得分:4)

那样的? before_update { self.gravatar = gravatar.downcase if gravatar.present? }

答案 1 :(得分:2)

before_update { self.gravatar = gravatar.downcase}, if: ->(s) { s.gravatar.present? }

答案 2 :(得分:2)

Rails回调接受:if and :unless options

class Model
  before_update :normalize_gravatar, if: :gravatar?

  protected

  def normalize_gravatar
    self.gravatar = gravatar.downcase
  end
end

上面的代码是

的快捷方式
class Model
  before_update :normalize_gravatar, if: ->() { gravatar.present? }

  protected

  def normalize_gravatar
    self.gravatar = gravatar.downcase
  end
end

在您的情况下,总是运行回调可能更容易,并确保在属性为空时不会崩溃。

class Model
  before_update :normalize_gravatar

  protected

  def normalize_gravatar
    self.gravatar = gravatar.downcase if gravatar.present?
  end
end