1

我正在尝试创建一个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

为什么没有关于before_save工作的 if 声明?我收到错误undefined methodbefore_save' for false:FalseClass`

4

2 回答 2

3

你不能这样做,因为 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? }

但是,还有其他选择。检查文档。

于 2013-03-21T17:11:00.617 回答
2

你可以这样做:

  before_save :default_name

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

或者:

  before_save :default_name, :unless => :name?

  def default_name
    self.name = Time.new
  end
于 2013-03-21T17:11:16.663 回答