Is :on => :create valid for a before_save callback in Rails 3.2.3

activerecord, before-save, ruby-on-rails, ruby-on-rails-3.2

Solution

You're right, there is no `:on` option for `before_save` callback. But, I don't understand, why use `before_save` instead of `before_create`. `before_create` callback will be called right after `before_save`.

Of course, you can use `before_save :callback_method, :if => :new_record?`. But I personally don't like this solution - what if I need to add conditions in the `:if` option?

If one have a dependency between `before_save` and `before_create` callbacks, I`d suggest, to combine 2 callbacks. For instance (pseudocode):

class MyModel < ActiveRecord::Base
  before_create :prepare_x
  before_save :do_something_with_x

  def prepare_x
    @x = 10
  end


  # will not work, because `prepare_x` called after `do_something_with_x`
  def do_something_with_x
    @a = 100 / @x
  end
end

# ||
# ||
# \/

class MyModel < ActiveRecord::Base

  before_save :do_something_with_x

  def do_something_with_x
    @x = 10 if new_record?
    @a = 100 / @x
  end
end

Problem

As you know, `before_save` callbacks are executed prior to `before_create` callbacks. Therefore, some people have suggested that in would be better to use `before_save :method, :on => :create` instead of `before_create` so that the callback method is executed at the right time in relation to other callbacks (such as autosave callbacks). See, for example, this Pivotal Labs blog post, and this StackOverflow answer. However, as far as I can tell, the `:on => :create` option does not achieve the desired effect on a `before_save` callback. In other words, the callback is executed for every save regardless of whether it is a create or not. The `:on => :create` option does appear to be valid for `before_validation` callbacks, though. Could someone confirm whether the `:on => :create` is supposed to work for a `before_save`? Did it work in previous versions of Rails and is now broken, or are the aforementioned links simply mistaken? Assuming `:on => :create` is not valid, is the following acceptable, and/or is there a better way? ``` before_save :callback_method, :if => :new_record? ``` Thank you.

Original source

Related problems