Skip to content

Commit

Permalink
Refactor column definer module (#258)
Browse files Browse the repository at this point in the history
* Refactoring: use a better variable name

Rename column -> position_column to make it clear what kind of column we're
talking about.

* Refactoring: rename ColumnMethodDefiner -> PositionColumnMethodDefiner

* Refactoring: extract PositionColumnMethodDefiner.define_instance_methods

* Refactoring: extract PositionColumnMethodDefiner.define_class_methods

* Refactoring: define_class_methods before define_instance_methods

* Refactoring: remove redundant interpolation

* Refactoring: extract .mass_assignment_protection_was_used_by_user?

* Refactoring: extract .protect_attributes_from_mass_assignment

* Replace gratuitous defined? with #respond_to?

* Replace !o.blank? with o.present?
  • Loading branch information
ledestin authored and brendon committed Feb 27, 2017
1 parent 177740f commit 024ffe0
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 20 deletions.
2 changes: 1 addition & 1 deletion lib/acts_as_list.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
require 'acts_as_list/active_record/acts/list'
require "acts_as_list/active_record/acts/column_method_definer"
require "acts_as_list/active_record/acts/position_column_method_definer"
require "acts_as_list/active_record/acts/scope_method_definer"
require "acts_as_list/active_record/acts/top_of_list_method_definer"
require "acts_as_list/active_record/acts/add_new_at_method_definer"
Expand Down
2 changes: 1 addition & 1 deletion lib/acts_as_list/active_record/acts/list.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ def acts_as_list(options = {})

caller_class = self

ActiveRecord::Acts::List::ColumnMethodDefiner.call(caller_class, configuration[:column])
ActiveRecord::Acts::List::PositionColumnMethodDefiner.call(caller_class, configuration[:column])
ActiveRecord::Acts::List::ScopeMethodDefiner.call(caller_class, configuration[:scope])
ActiveRecord::Acts::List::TopOfListMethodDefiner.call(caller_class, configuration[:top_of_list])
ActiveRecord::Acts::List::AddNewAtMethodDefiner.call(caller_class, configuration[:add_new_at])
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,19 @@
module ActiveRecord::Acts::List::ColumnMethodDefiner #:nodoc:
def self.call(caller_class, column)
caller_class.class_eval do
attr_reader :position_changed

define_method :position_column do
column
end
module ActiveRecord::Acts::List::PositionColumnMethodDefiner #:nodoc:
def self.call(caller_class, position_column)
define_class_methods(caller_class, position_column)
define_instance_methods(caller_class, position_column)

define_method :"#{column}=" do |position|
write_attribute(column, position)
@position_changed = true
end
if mass_assignment_protection_was_used_by_user?(caller_class)
protect_attributes_from_mass_assignment(caller_class, position_column)
end
end

# only add to attr_accessible
# if the class has some mass_assignment_protection
if defined?(accessible_attributes) and !accessible_attributes.blank?
attr_accessible :"#{column}"
end
private

def self.define_class_methods(caller_class, position_column)
caller_class.class_eval do
define_singleton_method :quoted_position_column do
@_quoted_position_column ||= connection.quote_column_name(column)
@_quoted_position_column ||= connection.quote_column_name(position_column)
end

define_singleton_method :quoted_position_column_with_table_name do
Expand Down Expand Up @@ -47,4 +41,31 @@ def self.call(caller_class, column)
end
end
end

def self.define_instance_methods(caller_class, position_column)
caller_class.class_eval do
attr_reader :position_changed

define_method :position_column do
position_column
end

define_method :"#{position_column}=" do |position|
write_attribute(position_column, position)
@position_changed = true
end
end
end

def self.mass_assignment_protection_was_used_by_user?(caller_class)
caller_class.class_eval do
respond_to?(:accessible_attributes) and accessible_attributes.present?
end
end

def self.protect_attributes_from_mass_assignment(caller_class, position_column)
caller_class.class_eval do
attr_accessible position_column.to_sym
end
end
end

0 comments on commit 024ffe0

Please sign in to comment.