deals_with 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/deals_with/action_controller/class_methods.rb +48 -0
- data/lib/deals_with/active_record/class_methods.rb +13 -0
- data/lib/deals_with/resource.rb +101 -0
- data/lib/deals_with.rb +4 -0
- data/rails/init.rb +4 -0
- data/tasks/deals_with_tasks.rake +4 -0
- data/test/deals_with_test.rb +8 -0
- data/test/test_helper.rb +3 -0
- metadata +65 -0
@@ -0,0 +1,48 @@
|
|
1
|
+
# DealsWith
|
2
|
+
|
3
|
+
module DealsWith
|
4
|
+
module ActionController # :nodoc:
|
5
|
+
module ClassMethods
|
6
|
+
|
7
|
+
def deals_with_models
|
8
|
+
@deals_with_models ||= {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def deals_with(model_name, options={}, &scope_proc)
|
12
|
+
model_name = model_name.to_s.classify
|
13
|
+
model_class = model_name.constantize
|
14
|
+
|
15
|
+
unless deals_with_models[model_name]
|
16
|
+
|
17
|
+
model_class.reflect_on_all_associations(:belongs_to).each do |reflection|
|
18
|
+
deals_with(reflection.class_name)
|
19
|
+
end
|
20
|
+
|
21
|
+
deals_with_models[model_name] = DealsWith::Resource.new(self,
|
22
|
+
model_name, options, &scope_proc)
|
23
|
+
|
24
|
+
generate_resource_methods(model_name)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
def generate_resource_methods(model_name)
|
30
|
+
class_eval %{
|
31
|
+
def #{model_name.tableize}
|
32
|
+
@#{model_name.tableize} ||=
|
33
|
+
self.class.deals_with_models[#{model_name.inspect}].all(self)
|
34
|
+
end
|
35
|
+
def #{model_name.underscore}
|
36
|
+
@#{model_name.underscore} ||=
|
37
|
+
self.class.deals_with_models[#{model_name.inspect}].find(self)
|
38
|
+
end
|
39
|
+
def build_#{model_name.underscore}
|
40
|
+
@#{model_name.underscore} ||=
|
41
|
+
self.class.deals_with_models[#{model_name.inspect}].build(self)
|
42
|
+
end
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# DealsWith
|
2
|
+
|
3
|
+
module DealsWith
|
4
|
+
class Resource
|
5
|
+
|
6
|
+
attr_reader :model_name
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
attr_reader :controller_class, :options, :scope_proc
|
11
|
+
|
12
|
+
public
|
13
|
+
|
14
|
+
def initialize(controller_class, model_name, options={}, &scope_proc)
|
15
|
+
@controller_class = controller_class
|
16
|
+
@model_name = model_name.to_s.classify
|
17
|
+
@options = options
|
18
|
+
@scope_proc = scope_proc
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def model_class
|
24
|
+
@model_class ||= model_name.constantize
|
25
|
+
end
|
26
|
+
|
27
|
+
def parents
|
28
|
+
@parents ||= model_class.reflect_on_all_associations(:belongs_to).collect do |reflection|
|
29
|
+
if reflection.klass.instance_methods.include? model_name.tableize
|
30
|
+
controller_class.deals_with_models[reflection.class_name]
|
31
|
+
end
|
32
|
+
end.compact
|
33
|
+
end
|
34
|
+
|
35
|
+
def primary_for(controller)
|
36
|
+
controller_class.to_s.include? "#{model_name.pluralize}_controller".classify
|
37
|
+
end
|
38
|
+
|
39
|
+
def base(controller)
|
40
|
+
base = nil
|
41
|
+
parents.each do |resource|
|
42
|
+
if resource.can_find?(controller)
|
43
|
+
base = controller.send(resource.model_name.underscore)
|
44
|
+
break
|
45
|
+
end
|
46
|
+
end
|
47
|
+
base = base.send(model_name.tableize) if base
|
48
|
+
base ||= model_class
|
49
|
+
base = @scope_proc.call(base) if @scope_proc
|
50
|
+
base
|
51
|
+
end
|
52
|
+
|
53
|
+
def find_param_key(controller)
|
54
|
+
return @find_param_key if @find_param_key
|
55
|
+
if @options[:find_param]
|
56
|
+
@find_param_key = @options[:find_param]
|
57
|
+
else
|
58
|
+
@find_param_key = "#{model_name.underscore}_id"
|
59
|
+
@find_param_key = 'id' if primary_for(controller)
|
60
|
+
end
|
61
|
+
@find_param_key
|
62
|
+
end
|
63
|
+
|
64
|
+
def find_param(controller)
|
65
|
+
controller.params[find_param_key(controller)]
|
66
|
+
end
|
67
|
+
|
68
|
+
def build_param_key(controller)
|
69
|
+
@build_param_key ||= if @options[:build_param]
|
70
|
+
@options[:build_param]
|
71
|
+
else
|
72
|
+
"#{model_name.underscore}"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def build_param(controller)
|
77
|
+
controller.params[build_param_key(controller)] || {}
|
78
|
+
end
|
79
|
+
|
80
|
+
public
|
81
|
+
|
82
|
+
def can_find?(controller)
|
83
|
+
!find_param(controller).blank?
|
84
|
+
end
|
85
|
+
|
86
|
+
# searchers
|
87
|
+
|
88
|
+
def all(controller)
|
89
|
+
base(controller).all
|
90
|
+
end
|
91
|
+
|
92
|
+
def find(controller)
|
93
|
+
base(controller).find(find_param(controller))
|
94
|
+
end
|
95
|
+
|
96
|
+
def build(controller)
|
97
|
+
base(controller).build(build_param(controller))
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
data/lib/deals_with.rb
ADDED
data/rails/init.rb
ADDED
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: deals_with
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Simon Menke
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-05-26 00:00:00 +02:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: Automaticaly find any appropriately scoped resources.
|
17
|
+
email: simon.menke@gmail.com
|
18
|
+
engine_dependencies: {}
|
19
|
+
|
20
|
+
executables: []
|
21
|
+
|
22
|
+
extensions: []
|
23
|
+
|
24
|
+
extra_rdoc_files: []
|
25
|
+
|
26
|
+
files:
|
27
|
+
- lib/deals_with/action_controller/class_methods.rb
|
28
|
+
- lib/deals_with/active_record/class_methods.rb
|
29
|
+
- lib/deals_with/resource.rb
|
30
|
+
- lib/deals_with.rb
|
31
|
+
- rails/init.rb
|
32
|
+
- tasks/deals_with_tasks.rake
|
33
|
+
- test/deals_with_test.rb
|
34
|
+
- test/test_helper.rb
|
35
|
+
has_rdoc: true
|
36
|
+
homepage: http://github.com/simonmenke/deals_with
|
37
|
+
licenses: []
|
38
|
+
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
|
42
|
+
require_paths:
|
43
|
+
- lib
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: "0"
|
49
|
+
version:
|
50
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: "0"
|
55
|
+
version:
|
56
|
+
requirements: []
|
57
|
+
|
58
|
+
rubyforge_project:
|
59
|
+
rubygems_version: 1.3.3
|
60
|
+
signing_key:
|
61
|
+
specification_version: 3
|
62
|
+
summary: Automaticaly find any appropriately scoped resources.
|
63
|
+
test_files:
|
64
|
+
- test/deals_with_test.rb
|
65
|
+
- test/test_helper.rb
|