2015-07-08 4 views
1

Каков способ вызова триггера before_update только при заполнении определенного атрибута?Вызов before_update, если атрибут заполнен

Вот часть моего кода:

before_update { self.gravatar = gravatar.downcase } 

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

Действительно, я хочу, чтобы вызвать функцию downcase на атрибут только если это одна заполняется в форме редактирования.

В настоящее время я эту ошибку:

undefined method `downcase' for nil:NilClass

что логично.

ответ

4

Нравится? before_update { self.gravatar = gravatar.downcase if gravatar.present? }

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

Рельсы обратные вызовы принимают :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 
Смежные вопросы