How to set default values in Rails?

后端 未结 17 1376
醉话见心
醉话见心 2020-11-28 04:39

I\'m trying to find the best way to set default values for objects in Rails.

The best I can think of is to set the default value in the new method in

17条回答
  •  爱一瞬间的悲伤
    2020-11-28 04:43

    In Ruby on Rails v3.2.8, using the after_initialize ActiveRecord callback, you can call a method in your model that will assign the default values for a new object.

    after_initialize callback is triggered for each object that is found and instantiated by a finder, with after_initialize being triggered after new objects are instantiated as well (see ActiveRecord Callbacks).

    So, IMO it should look something like:

    class Foo < ActiveRecord::Base
      after_initialize :assign_defaults_on_new_Foo
      ...
      attr_accessible :bar
      ...
      private
      def assign_defaults_on_new_Foo
        # required to check an attribute for existence to weed out existing records
        self.bar = default_value unless self.attribute_whose_presence_has_been_validated
      end
    end
    

    Foo.bar = default_value for this instance unless the instance contains an attribute_whose_presence_has_been_validated previously on save/update. The default_value will then be used in conjunction with your view to render the form using the default_value for the bar attribute.

    At best this is hacky...

    EDIT - use 'new_record?' to check if instantiating from a new call

    Instead of checking an attribute value, use the new_record? built-in method with rails. So, the above example should look like:

    class Foo < ActiveRecord::Base
      after_initialize :assign_defaults_on_new_Foo, if: 'new_record?'
      ...
      attr_accessible :bar
      ...
      private
      def assign_defaults_on_new_Foo
        self.bar = default_value
      end
    end
    

    This is much cleaner. Ah, the magic of Rails - it's smarter than me.

提交回复
热议问题