2013-03-21 38 views
1

我正在尝试创建一个before_save以将条目的名称设置为创建日期,如果它留空。我得到了它的方法来工作,这里是我的模型:为什么我得到未定义的方法`before_save'为false:如果在保存之前使用FalseClass?

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工作?我得到错误undefined method before_save'为false:FalseClass`

回答

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? } 

但是也有其他的选择。 Check the documentation.

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 
相关问题