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

if ステートメントが機能しないのはなぜbefore_saveですか? undefined methodfalse:FalseClass` に対して before_save'エラーが発生します

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 に答える