Почему я получаю неопределенный метод `before_save' для false:FalseClass при использовании if перед сохранением?

Я пытаюсь создать before_save, чтобы установить имя записи на дату ее создания, если она была оставлена ​​​​пустой. Я заставил его работать с методом, вот моя модель:

class Entry < ActiveRecord::Base
  belongs_to :user
  has_many :entry_ingredients
  has_many :ingredients, :through => :entry_ingredients
  before_save :default_name

  accepts_nested_attributes_for :ingredients, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => true

  def default_name
    if self.name.blank?
      self.name = Time.new
    else
      self.name
    end
  end
end

Однако то, что я думаю, тот же самый код, похоже, не работает в before_save. По сути, я пытался сделать это before_save :default_name, :if => self.name.blank?, и тогда мой метод был бы короче:

def default_name
  self.name = Time.new
end

Почему не работает оператор if на before_save? Я получаю сообщение об ошибке undefined methodbefore_save для false:FalseClass`


person GiH    schedule 21.03.2013    source источник


Ответы (2)


Вы не можете сделать это таким образом, потому что self.name.blank? оценивается, когда класс оценивается в первый раз. Таким образом, вы получаете ":if => false" или ":if => true" или возникает ошибка.

before_save :default_name, :if => self.name.blank?

В том же файле у вас есть пример того, как это можно сделать:

before_save :default_name, :if => lambda { |entry| entry[:name].blank? }

Однако есть и другие варианты. Проверьте документацию.

person Andreyy    schedule 21.03.2013

Вы можете сделать так:

  before_save :default_name

  def default_name
    self.name ||= Time.new
  end

or:

  before_save :default_name, :unless => :name?

  def default_name
    self.name = Time.new
  end
person Rahul Tapali    schedule 21.03.2013