module ControllerSetterPattern::ActionController::ClassMethods

Public Instance Methods

set(*names) click to toggle source
# File lib/controller_setter_pattern/action_controller.rb, line 6
def set(*names)
  callback_options = names.extract_options!

  (options ||= {})[:model] = callback_options.delete(:model)
  options[:model] ||= options[:model].to_s.camelize.constantize unless options[:model].nil?

  options[:finder_params] = _normalize_finder_params(callback_options.delete(:finder_params) || [])
  options[:finder_method] = 'find' + (options[:finder_params].empty? ? '' : '_by_' + options[:finder_params].join('_and_'))

  options[:ancestor] = callback_options.delete(:ancestor)
  options[:scope] = callback_options.delete(:scope)

  _insert_setters(names, options, callback_options)
end

Private Instance Methods

_insert_setters(setters, options, callback_options) click to toggle source
# File lib/controller_setter_pattern/action_controller.rb, line 30
def _insert_setters(setters, options, callback_options)
  setters.each do |setter|
    before_action callback_options do |controller|
      resource = _get_resource(setter, options[:model], options[:ancestor])
      if _is_class_model_or_association_method?(resource)
        Array(options[:scope]).each { |s| resource = resource.send(s) } unless options[:scope].nil?
        values_for_find = _get_values_for_finder_params(setter, options[:finder_params])
        resource = resource.send(options[:finder_method], *values_for_find)
      end
      controller.instance_variable_set("@#{setter}".to_sym, resource)
    end
  end
end
_normalize_finder_params(finder_params) click to toggle source
# File lib/controller_setter_pattern/action_controller.rb, line 23
def _normalize_finder_params(finder_params)
  finder_params = [finder_params] unless finder_params.is_a?(Array)
  finder_params = finder_params.compact.uniq
  finder_params.clear if finder_params.one? && finder_params.join.eql?('id')
  finder_params
end