lib/nilify_blanks.rb in nilify_blanks-1.3.0 vs lib/nilify_blanks.rb in nilify_blanks-1.4.0
- old
+ new
@@ -1,12 +1,18 @@
+require "active_support/concern"
+
module NilifyBlanks
- def self.included(base)
- base.extend ClassMethods
+ extend ActiveSupport::Concern
+
+ included do
+ class_attribute :nilify_blanks_columns, instance_writer: false, default: []
+ class_attribute :nilify_blanks_options, instance_writer: false, default: nil
end
module ClassMethods
DEFAULT_TYPES = [:string, :text, :citext]
+ DEFAULT_CALLBACK = :validation
@@define_nilify_blank_methods_lock = Mutex.new
# This overrides the underlying rails method that defines attribute methods.
# This must be thread safe, just like the underlying method.
@@ -15,81 +21,56 @@
if super
define_nilify_blank_methods
end
end
- def inherited(child_class)
- if instance_variable_get(:@_nilify_blanks_options) and !child_class.instance_variable_get(:@_nilify_blanks_options)
- child_class.nilify_blanks @_nilify_blanks_options
- end
-
- super
- end
-
def nilify_blanks(options = {})
- return if @_nilify_blanks_options
+ self.nilify_blanks_options = options
- unless included_modules.include?(NilifyBlanks::InstanceMethods)
- include NilifyBlanks::InstanceMethods
- end
-
- @_nilify_blanks_options = options
-
# Normally we wait for rails to define attribute methods, but we could be calling this after this has already been done.
# If so, let's just immediately generate nilify blanks methods.
#
- if @attribute_methods_generated
- define_nilify_blank_methods
- end
-
- descendants.each do |subclass|
- subclass.nilify_blanks @_nilify_blanks_options
- end
+ define_nilify_blank_methods if @attribute_methods_generated
end
private
def define_nilify_blank_methods
- return unless @_nilify_blanks_options
- return if @nilify_blank_methods_generated
+ return unless nilify_blanks_options
@@define_nilify_blank_methods_lock.synchronize do
- options = @_nilify_blanks_options
+ options = nilify_blanks_options.dup
+ options[:before] ||= DEFAULT_CALLBACK
options[:only] = Array.wrap(options[:only]).map(&:to_s) if options[:only]
options[:except] = Array.wrap(options[:except]).map(&:to_s) if options[:except]
options[:types] = options[:types] ? Array.wrap(options[:types]).map(&:to_sym) : DEFAULT_TYPES
- cattr_accessor :nilify_blanks_columns
-
if options[:only]
- self.nilify_blanks_columns = options[:only].clone
+ columns_to_nilify = options[:only].clone
elsif options[:nullables_only] == false
- self.nilify_blanks_columns = self.columns.select {|c| options[:types].include?(c.type) }.map(&:name).map(&:to_s)
+ columns_to_nilify = self.columns.select {|c| options[:types].include?(c.type) }.map(&:name).map(&:to_s)
else
- self.nilify_blanks_columns = self.columns.select(&:null).select {|c| options[:types].include?(c.type) }.map(&:name).map(&:to_s)
+ columns_to_nilify = self.columns.select(&:null).select {|c| options[:types].include?(c.type) }.map(&:name).map(&:to_s)
end
- self.nilify_blanks_columns -= options[:except] if options[:except]
- self.nilify_blanks_columns = self.nilify_blanks_columns.map(&:to_s)
+ columns_to_nilify -= options[:except] if options[:except]
- options[:before] ||= :save
+ self.nilify_blanks_columns = columns_to_nilify.map(&:to_s)
+
send("before_#{options[:before]}", :nilify_blanks)
- @nilify_blanks_methods_generated = true
end
end
end
- module InstanceMethods
- def nilify_blanks
- (self.nilify_blanks_columns || []).each do |column|
- value = read_attribute(column)
- next unless value.is_a?(String)
- next unless value.respond_to?(:blank?)
+ def nilify_blanks
+ (nilify_blanks_columns || []).each do |column|
+ value = read_attribute(column)
+ next unless value.is_a?(String)
+ next unless value.respond_to?(:blank?)
- write_attribute(column, nil) if value.blank?
- end
+ write_attribute(column, nil) if value.blank?
end
end
end
require "nilify_blanks/railtie"