Class: Rescue::Controller::Action

Inherits:
Object
  • Object
show all
Defined in:
lib/rescue/controllers/action.rb

Class Method Summary collapse

Class Method Details

.define(object, names, args = {}) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/rescue/controllers/action.rb', line 30

def self.define object, names, args = {}
  names.each do |name|
    options = args[name]||{}
    type    = options[:type]||name
    raise RuntimeError, "`#{name}` is already defined." if object.method_defined?(name)
    case type
    when :show, :edit
      object.send(:define_method, name) do
        send(:find_call)
        instance_exec(&options[:render]) if options[:render]
      end
    when :new
      object.send(:define_method, name) do
        params = options[:params] ? send(options[:params]) : {}
        send(:new_call, params)
        instance_exec(&options[:render]) if options[:render]
      end
    when :create, :update, :destroy
      object.send(:define_method, name) do
        begin 
          params = send(options[:params]||:"#{name}_params")
          rescue_respond(:"#{type}_call", params, options)
        rescue NoMethodError => e
          raise NoParameterMethodError.new(self.class, e.name)
        end
      end
    else
      raise Rescue::NoActionError.new(type)
    end
  end
end

.define_call(object, clazz, var_sym) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/rescue/controllers/action.rb', line 6

def self.define_call object, clazz, var_sym
  object.send(:define_method, :new_call) do |params = {}|
    instance_variable_set(var_sym, clazz.new(params))
  end
  object.send(:define_method, :find_call) do |params = {}|
    id = (params.empty? ? send(:params) : params).delete(Rescue.config.primary_key)
    instance_variable_set(var_sym, clazz.where(params).find(id))
  end
  object.send(:define_method, :create_call) do |params, validate = {}|
    new_call(params)
    instance_variable_get(var_sym).save!(validate)
  end
  object.send(:define_method, :update_call) do |params, validate = {}|
    find_call
    instance_variable_get(var_sym).attributes = params
    instance_variable_get(var_sym).save!(validate)
  end
  object.send(:define_method, :destroy_call) do |params, validate = {}|
    find_call(params)
    instance_variable_get(var_sym).destroy
  end
  object.send(:private, :new_call, :find_call, :create_call, :update_call, :destroy_call)
end