Module: RailsStuff::Statusable::MethodsGenerator

Defined in:
lib/rails_stuff/statusable.rb

Overview

Generates methods.

Instance Method Summary collapse

Instance Method Details

#field_accessor(field) ⇒ Object



89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/rails_stuff/statusable.rb', line 89

def field_accessor(field)
  # Make field accept sympbols.
  define_method "#{field}=" do |val|
    val = val.to_s if val.is_a?(Symbol)
    super(val)
  end

  # Status as symbol.
  define_method "#{field}_sym" do
    val = self[field]
    val && val.to_sym
  end
end

#generate_class_method(method, &block) ⇒ Object



125
126
127
# File 'lib/rails_stuff/statusable.rb', line 125

def generate_class_method(method, &block)
  const_get(:ClassMethods).send(:define_method, method, &block)
end

#generate_field_methods(field, statuses) ⇒ Object

Generates all methods for the ‘field`.



70
71
72
73
74
# File 'lib/rails_stuff/statusable.rb', line 70

def generate_field_methods(field, statuses)
  field_accessor field
  translation_helpers field
  select_options_helper field, statuses
end

#select_options_helper(field, statuses) ⇒ Object



116
117
118
119
120
121
122
123
# File 'lib/rails_stuff/statusable.rb', line 116

def select_options_helper(field, statuses)
  translation_method = :"#{field}_name"
  # Returns array compatible with select_options helper.
  generate_class_method "#{field}_select_options" do |args = {}|
    filtered_statuses = statuses - Array.wrap(args[:except])
    filtered_statuses.map { |x| [send(translation_method, x), x] }
  end
end

#status_accessor(field, status_name, prefix = nil) ⇒ Object

Generates methods for specific value.



77
78
79
80
81
82
83
84
85
86
87
# File 'lib/rails_stuff/statusable.rb', line 77

def status_accessor(field, status_name, prefix = nil)
  # Shortcut to check status.
  define_method "#{prefix}#{status_name}?" do
    self[field] == status_name
  end

  # Shortcut to update status.
  define_method "#{prefix}#{status_name}!" do
    update_attributes!(field => status_name)
  end
end

#translation_helpers(field) ⇒ Object



103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/rails_stuff/statusable.rb', line 103

def translation_helpers(field)
  # Class-level translation helper.
  generate_class_method "#{field}_name" do |status|
    t(".#{field}_name.#{status}") if status
  end

  # Translation helper.
  define_method "#{field}_name" do
    val = send field
    self.class.t(".#{field}_name.#{val}") if val
  end
end