exposure 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/NOTES +57 -0
- data/Rakefile +11 -20
- data/VERSION +1 -0
- data/lib/exposure/behaviors/building.rb +36 -0
- data/lib/exposure/behaviors/callbacks.rb +53 -0
- data/lib/exposure/behaviors/finding.rb +84 -0
- data/lib/exposure/behaviors/flashing.rb +62 -0
- data/lib/exposure/behaviors/responding.rb +80 -0
- data/lib/exposure/configuration.rb +23 -41
- data/lib/exposure/options.rb +55 -0
- data/lib/exposure/patterns/resources.rb +21 -116
- data/lib/exposure.rb +7 -2
- data/spec/callbacks_spec.rb +46 -0
- data/spec/configuration_spec.rb +82 -0
- data/spec/exposure_spec.rb +16 -6
- data/spec/finders/finder_spec.rb +18 -12
- data/spec/finders/nested_resources_finder_spec.rb +19 -9
- data/spec/flashers/flash_with_block_spec.rb +20 -10
- data/spec/flashers/flash_with_method_spec.rb +19 -15
- data/spec/flashers/flash_with_proc_spec.rb +15 -9
- data/spec/flashers/flash_with_string_spec.rb +15 -10
- data/spec/resources_spec.rb +19 -7
- data/spec/responder_spec.rb +41 -0
- data/spec/responders/respond_to_mime_types_spec.rb +16 -10
- data/spec/responders/respond_with_block_spec.rb +14 -8
- data/spec/responders/respond_with_method_spec.rb +20 -14
- data/spec/responders/respond_with_proc_spec.rb +15 -8
- data/spec/spec_helper.rb +2 -5
- metadata +42 -25
- data/Manifest.txt +0 -39
- data/exposure.gemspec +0 -31
- data/lib/exposure/common.rb +0 -143
data/.gitignore
ADDED
data/NOTES
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
TOC.
|
2
|
+
I. Installing
|
3
|
+
sudo gem install exposure
|
4
|
+
II. REST
|
5
|
+
III. Current Controller behavior with class methods
|
6
|
+
IV. Exposure
|
7
|
+
A. expose
|
8
|
+
B. Finders
|
9
|
+
C. Responders
|
10
|
+
D. Flashers
|
11
|
+
E. Callbacks
|
12
|
+
|
13
|
+
Controllers already have some configuration-like structure:
|
14
|
+
before_filter
|
15
|
+
after_filter
|
16
|
+
around_filter
|
17
|
+
|
18
|
+
skip_before_filter
|
19
|
+
skip_after_filter
|
20
|
+
skip_around_filter
|
21
|
+
|
22
|
+
verify
|
23
|
+
layout
|
24
|
+
filter_parameter_logging
|
25
|
+
rescue_from
|
26
|
+
|
27
|
+
We're adding
|
28
|
+
expose
|
29
|
+
find
|
30
|
+
response_for
|
31
|
+
flash_for
|
32
|
+
|
33
|
+
the following callbacks:
|
34
|
+
before_find
|
35
|
+
after_find
|
36
|
+
after_find_on_failure
|
37
|
+
after_find_on_success
|
38
|
+
before_assign
|
39
|
+
after_assign
|
40
|
+
before_save
|
41
|
+
after_save
|
42
|
+
after_save_on_failure
|
43
|
+
after_save_on_success
|
44
|
+
before_create
|
45
|
+
after_create_on_failure
|
46
|
+
after_create_on_success
|
47
|
+
before_update
|
48
|
+
after_update_on_failure
|
49
|
+
after_update_on_success
|
50
|
+
before_destroy
|
51
|
+
after_destroy_on_success
|
52
|
+
before_response
|
53
|
+
before_response_on_success
|
54
|
+
before_response_on_failure
|
55
|
+
and speciality access to these callbacks with
|
56
|
+
before
|
57
|
+
after
|
data/Rakefile
CHANGED
@@ -1,23 +1,14 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
|
3
|
-
require '
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
# Generate all the Rake tasks
|
12
|
-
# Run 'rake -T' to see list of generated tasks (from gem root directory)
|
13
|
-
$hoe = Hoe.spec 'exposure' do
|
14
|
-
self.developer 'Trek Glowacki', 'trek.glowacki@gmail.com'
|
15
|
-
self.summary = 'exposed resources'
|
2
|
+
require 'rake'
|
3
|
+
require 'jeweler'
|
4
|
+
|
5
|
+
Jeweler::Tasks.new do |gemspec|
|
6
|
+
gemspec.name = 'exposure'
|
7
|
+
gemspec.summary = 'exposed resources'
|
8
|
+
gemspec.description = 'exposed resources'
|
9
|
+
gemspec.email = 'trek.glowacki@gmail.com'
|
10
|
+
gemspec.authors = ['Trek Glowacki']
|
16
11
|
end
|
12
|
+
Jeweler::GemcutterTasks.new
|
17
13
|
|
18
|
-
|
19
|
-
Dir['tasks/**/*.rake'].each { |t| load t }
|
20
|
-
|
21
|
-
# TODO - want other tests/tasks run by default? Add them to the list
|
22
|
-
# remove_task :default
|
23
|
-
# task :default => [:spec, :features]
|
14
|
+
Dir['tasks/**/*.rake'].each { |rake| load rake }
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.7
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Exposure
|
2
|
+
module Building
|
3
|
+
def self.included(base)
|
4
|
+
base.extend ClassMethods
|
5
|
+
base.send(:include, InstaneMethods)
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
def build(name, options = {}, &block)
|
10
|
+
options[:with] ||= block
|
11
|
+
self.const_get(:Builders)[name] = options[:with]
|
12
|
+
end
|
13
|
+
|
14
|
+
def build_default_builder(member, nesting)
|
15
|
+
self::const_set(:DefaultBuilder, {
|
16
|
+
self.resource_name.intern => Proc.new { [:new, params[resource_name] ] }
|
17
|
+
})
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
module InstaneMethods
|
22
|
+
private
|
23
|
+
def custom_builder_for(resource_name)
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
def default_builder_for(resource_name)
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
def builder_for(resource_name)
|
32
|
+
custom_builder_for(resource_name) || default_builder_for(resource_name)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Exposure
|
2
|
+
module Callbacks
|
3
|
+
def self.included(base)
|
4
|
+
base.extend ClassMethods
|
5
|
+
base.send(:include, InstaneMethods)
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
# access point for creating and configuring before_ callbacks.
|
10
|
+
def before(trigger, *actions)
|
11
|
+
options = actions.extract_options!
|
12
|
+
actions.each do |action|
|
13
|
+
build_callback('before', trigger, action, options)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# access point for creating and configuring after_ callbacks.
|
18
|
+
def after(trigger, *actions)
|
19
|
+
options = actions.extract_options!
|
20
|
+
actions.each do |action|
|
21
|
+
build_callback('after', trigger, action, options)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# builds callbacks that adhere to the ActiveSupport::Callbacks interface
|
26
|
+
def build_callback(prefix, trigger, action, options) #:nodoc:
|
27
|
+
callback_name = "#{prefix}_#{trigger}"
|
28
|
+
|
29
|
+
if options[:on]
|
30
|
+
callback_name += "_on_#{options.delete(:on)}"
|
31
|
+
end
|
32
|
+
|
33
|
+
options[:if] ||= []
|
34
|
+
|
35
|
+
only_methods = options.delete(:only)
|
36
|
+
except_methods = options.delete(:except)
|
37
|
+
|
38
|
+
if only_methods
|
39
|
+
options[:if] << Proc.new {|c| only_methods.include?(c.action_name.intern) }
|
40
|
+
end
|
41
|
+
|
42
|
+
if except_methods
|
43
|
+
options[:if] << Proc.new {|c| !except_methods.include?(c.action_name.intern) }
|
44
|
+
end
|
45
|
+
|
46
|
+
self.send(callback_name, action, options)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
module InstaneMethods
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module Exposure
|
2
|
+
module Finding
|
3
|
+
def self.included(base)
|
4
|
+
base.extend ClassMethods
|
5
|
+
base.send(:include, InstaneMethods)
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
# find :person, :with => Proc.new { Person.find_by_permalink(params[:permalink]) }
|
10
|
+
# find :people, :with => Proc.new { Person.send(params[:scope]) }
|
11
|
+
# find :dogs, :with => :dogs_adopted_after_date
|
12
|
+
# find :dogs do
|
13
|
+
# Dog.all
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# valid options are
|
17
|
+
# :with
|
18
|
+
# :only (unimplemented)
|
19
|
+
# :except (unimplemented)
|
20
|
+
def find(name, options = {}, &block)
|
21
|
+
options[:with] ||= block
|
22
|
+
self.const_get(:Finders)[name] = options[:with]
|
23
|
+
end
|
24
|
+
|
25
|
+
def build_default_finders(member, nesting) #:nodoc:
|
26
|
+
finders = self::const_set(:DefaultFinders, {
|
27
|
+
self.resource_name.intern => Proc.new { [:find, params[:id] ] },
|
28
|
+
self.resources_name.intern => Proc.new { [:all] }
|
29
|
+
})
|
30
|
+
|
31
|
+
nesting.each do |association_name|
|
32
|
+
finders[association_name.to_s.singularize.to_sym] = Proc.new { [:find, params[:"#{association_name.to_s.singularize}_id"]] }
|
33
|
+
finders[association_name] = Proc.new { [ :all ] }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
module InstaneMethods
|
39
|
+
private
|
40
|
+
def custom_finder_for(resource_name)
|
41
|
+
if finder = self.class::Finders[resource_name]
|
42
|
+
return finder
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def default_finder_for(resource_name)
|
47
|
+
if finder = self.class::DefaultFinders[resource_name]
|
48
|
+
return finder
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def finder_for(resource_name)
|
53
|
+
custom_finder_for(resource_name) || default_finder_for(resource_name)
|
54
|
+
end
|
55
|
+
|
56
|
+
def call_finder_chain(object, chain, use_associaiton = true)
|
57
|
+
links = chain.shift
|
58
|
+
return object unless links
|
59
|
+
|
60
|
+
message = finder_for(links[0])
|
61
|
+
association = links[1] if use_associaiton
|
62
|
+
|
63
|
+
case message
|
64
|
+
when Symbol
|
65
|
+
value = self.send(message)
|
66
|
+
when Proc
|
67
|
+
value = self.instance_eval(&message)
|
68
|
+
else
|
69
|
+
raise "invalid finder of #{message.inspect}"
|
70
|
+
end
|
71
|
+
|
72
|
+
if value.kind_of?(Array) && !value.respond_to?(:proxy_target)
|
73
|
+
if use_associaiton
|
74
|
+
call_finder_chain(object.send(association).send(*value), chain)
|
75
|
+
else
|
76
|
+
call_finder_chain(object.send(*value), chain)
|
77
|
+
end
|
78
|
+
else
|
79
|
+
call_finder_chain(value, chain)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Exposure
|
2
|
+
module Flashing
|
3
|
+
def self.included(base)
|
4
|
+
base.extend ClassMethods
|
5
|
+
base.send(:include, InstaneMethods)
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
# configure flash messages
|
10
|
+
# valid action names are
|
11
|
+
# :index :show :new :create :edit :update :destroy
|
12
|
+
# valid options are
|
13
|
+
# :on (optional)
|
14
|
+
# :success, :failure, :any
|
15
|
+
# default is :any
|
16
|
+
# :is (optional if block given)
|
17
|
+
# can be a Proc or method name as symbol.
|
18
|
+
def flash_for(action_name, options = {}, &block)
|
19
|
+
options[:is] ||= block
|
20
|
+
|
21
|
+
case options[:on]
|
22
|
+
when NilClass, :any
|
23
|
+
self.const_get(:FlashMessages)["#{action_name}.success.html"] = options[:is]
|
24
|
+
self.const_get(:FlashMessages)["#{action_name}.failure.html"] = options[:is]
|
25
|
+
when :success
|
26
|
+
self.const_get(:FlashMessages)["#{action_name}.success.html"] = options[:is]
|
27
|
+
when :failure
|
28
|
+
self.const_get(:FlashMessages)["#{action_name}.failure.html"] = options[:is]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
module InstaneMethods
|
34
|
+
private
|
35
|
+
def custom_flash_for(action_name, action_status)
|
36
|
+
if flash_message = self.class::FlashMessages["#{action_name}.#{action_status}.html"]
|
37
|
+
case flash_message
|
38
|
+
when String
|
39
|
+
flash[:message] = flash_message
|
40
|
+
when Symbol
|
41
|
+
flash[:message] = self.send(flash_message)
|
42
|
+
when Proc
|
43
|
+
flash[:message] = self.instance_eval(&flash_message)
|
44
|
+
end
|
45
|
+
else
|
46
|
+
false
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def default_flash_for(action_name, action_status)
|
51
|
+
if message_proc = self.class::DefaultFlashMessages["#{action_name}.#{action_status}.html"]
|
52
|
+
flash[:message] = self.instance_eval(&message_proc)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def flash_for(action_name, action_successful)
|
57
|
+
custom_flash_for(action_name, action_successful) || default_flash_for(action_name, action_successful)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module Exposure
|
2
|
+
module Responding
|
3
|
+
def self.included(base)
|
4
|
+
base.extend ClassMethods
|
5
|
+
base.send(:include, InstaneMethods)
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
# response_for :create, :on => :success, :is => { proc }
|
10
|
+
# response_for :show, :formats => [:html] do
|
11
|
+
# @resource.activated ? render('show') : render('next_steps')
|
12
|
+
# end
|
13
|
+
# response_for :new, :is => :new_foo_built
|
14
|
+
#
|
15
|
+
# valid action names are
|
16
|
+
# :index :show :new :create :edit :update :destroy
|
17
|
+
# valid options are
|
18
|
+
# :on (optional)
|
19
|
+
# :success, :failure, :any
|
20
|
+
# default is :any
|
21
|
+
# :is (option if block given)
|
22
|
+
# can be a Proc or method name as symbol.
|
23
|
+
# :formats
|
24
|
+
# array of formats as symbols.
|
25
|
+
# defaults to [:html]
|
26
|
+
def response_for(*actions, &block)
|
27
|
+
options = actions.extract_options!
|
28
|
+
options[:is] ||= block
|
29
|
+
formats = options[:formats] || [:html]
|
30
|
+
|
31
|
+
case options[:on]
|
32
|
+
when NilClass, :any
|
33
|
+
build_custom_response(actions, :success, formats, options[:is])
|
34
|
+
build_custom_response(actions, :failure, formats, options[:is])
|
35
|
+
when :success
|
36
|
+
build_custom_response(actions, :success, formats, options[:is])
|
37
|
+
when :failure
|
38
|
+
build_custom_response(actions, :failure, formats, options[:is])
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def build_custom_response(action_names, success_status, formats, response) #:nodoc:
|
43
|
+
action_names.each do |action_name|
|
44
|
+
formats.each do |format|
|
45
|
+
self.const_get(:Responses)["#{action_name}.#{success_status}.#{format}"] = response
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
module InstaneMethods
|
52
|
+
private
|
53
|
+
def custom_response_for(action_name, action_status, format)
|
54
|
+
if responder = self.class::Responses["#{action_name}.#{action_status}.#{format}"]
|
55
|
+
case responder
|
56
|
+
when Symbol
|
57
|
+
self.send(responder)
|
58
|
+
when Proc
|
59
|
+
self.instance_eval &responder
|
60
|
+
end
|
61
|
+
else
|
62
|
+
false
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def default_response_for(action_name, action_status, format)
|
67
|
+
if responder = self.class::DefaultResponses["#{action_name}.#{action_status}.#{format}"]
|
68
|
+
self.instance_eval &responder
|
69
|
+
else
|
70
|
+
return false
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def response_for(action_name, action_status, format = :html)
|
75
|
+
format = :html if format == :all
|
76
|
+
custom_response_for(action_name, action_status, format) || default_response_for(action_name, action_status, format) || head(:not_acceptable)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -1,26 +1,5 @@
|
|
1
1
|
module Exposure
|
2
|
-
module Configuration
|
3
|
-
# options
|
4
|
-
# :nested => false or symbol or array of symbols
|
5
|
-
# defaults to false
|
6
|
-
# :only => array of REST methods names as symbols to only include
|
7
|
-
# defaults to [:show, :new, :create, :edit, :update, :destroy]
|
8
|
-
# :except => array of REST methods to exclude
|
9
|
-
# defaults to [ ]
|
10
|
-
# :formats => array of
|
11
|
-
# defaults to [ :html, :xml, :json ]
|
12
|
-
def expose_one(resource_name, options = {})
|
13
|
-
include ActiveSupport::Callbacks
|
14
|
-
extend Exposure::Common
|
15
|
-
self.resource_name = resource_name
|
16
|
-
self.member_nesting = [ [self.resource_name.to_sym] ]
|
17
|
-
|
18
|
-
extend Patterns::Resource
|
19
|
-
include Patterns::Resource::Actions
|
20
|
-
|
21
|
-
define_callbacks(*Patterns::Resource::Callbacks)
|
22
|
-
end
|
23
|
-
|
2
|
+
module Configuration
|
24
3
|
# options
|
25
4
|
# :nested => false or symbol or array of symbols
|
26
5
|
# defaults to false
|
@@ -29,34 +8,37 @@ module Exposure
|
|
29
8
|
# :except => array of REST methods to exclude
|
30
9
|
# defaults to [ ]
|
31
10
|
# :formats => array of
|
32
|
-
# defaults to [ :html, :xml
|
11
|
+
# defaults to [ :html, :xml]
|
33
12
|
#
|
34
13
|
def expose_many(name, options = {})
|
35
|
-
|
36
|
-
|
14
|
+
@_exposed_resource_name = name
|
15
|
+
@_exposed_resource_options = options
|
37
16
|
|
38
|
-
|
39
|
-
self.resources_name = name.to_s
|
17
|
+
extend Configuration::Options
|
40
18
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
nesting.collect! {|sym| [sym.to_s.singularize.to_sym, sym]}
|
48
|
-
self.member_nesting = nesting + [ [self.resource_name.to_sym] ]
|
49
|
-
self.collection_nesting = nesting + [ [self.resources_name.to_sym] ]
|
50
|
-
else
|
51
|
-
self.parent_model = self.resource_name.camelize.constantize
|
52
|
-
build_default_finders(self.resource_name, [])
|
53
|
-
self.member_nesting = [ [self.resource_name.to_sym] ]
|
54
|
-
self.collection_nesting = [ [self.resources_name.to_sym] ]
|
19
|
+
class << self
|
20
|
+
attr_accessor :resource_name, :resources_name,
|
21
|
+
:resource_chain, :resources_chain,
|
22
|
+
:collection_nesting, :member_nesting,
|
23
|
+
:parent_model
|
55
24
|
end
|
56
25
|
|
26
|
+
include ActiveSupport::Callbacks
|
27
|
+
include Exposure::Finding
|
28
|
+
include Exposure::Flashing
|
29
|
+
include Exposure::Responding
|
30
|
+
include Exposure::Callbacks
|
31
|
+
|
32
|
+
self.name!
|
33
|
+
self.build_default_finders!
|
34
|
+
self.build_default_builders!
|
35
|
+
|
57
36
|
extend Patterns::Resources
|
58
37
|
include Patterns::Resources::Actions
|
59
38
|
|
39
|
+
self.allow_actions!
|
40
|
+
self.allow_formats!
|
41
|
+
|
60
42
|
define_callbacks(*Patterns::Resources::Callbacks)
|
61
43
|
end
|
62
44
|
alias :expose :expose_many
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Exposure
|
2
|
+
module Configuration
|
3
|
+
module Options
|
4
|
+
|
5
|
+
def allow_actions!
|
6
|
+
if @_exposed_resource_options[:only]
|
7
|
+
@_exposed_resource_options[:except] = Patterns::Resources::DefaultActions - @_exposed_resource_options[:only]
|
8
|
+
end
|
9
|
+
|
10
|
+
if @_exposed_resource_options[:except]
|
11
|
+
@_exposed_resource_options[:except].each do |action|
|
12
|
+
undef_method(action)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def allow_formats!
|
18
|
+
formats = @_exposed_resource_options[:formats] || [:html, :xml]
|
19
|
+
end
|
20
|
+
|
21
|
+
def name!
|
22
|
+
self.resource_name = @_exposed_resource_name.to_s.singularize
|
23
|
+
self.resources_name = @_exposed_resource_name.to_s
|
24
|
+
end
|
25
|
+
|
26
|
+
def build_default_finders!
|
27
|
+
if nesting = @_exposed_resource_options[:nested]
|
28
|
+
self.build_nested_default_finders!(nesting)
|
29
|
+
return
|
30
|
+
end
|
31
|
+
|
32
|
+
self.parent_model = self.resource_name.camelize.constantize
|
33
|
+
build_default_finders(self.resource_name, [])
|
34
|
+
self.member_nesting = [ [self.resource_name.to_sym] ]
|
35
|
+
self.collection_nesting = [ [self.resources_name.to_sym] ]
|
36
|
+
end
|
37
|
+
|
38
|
+
def build_default_builders!
|
39
|
+
true
|
40
|
+
end
|
41
|
+
|
42
|
+
def build_nested_default_finders!(nesting)
|
43
|
+
|
44
|
+
self.parent_model = nesting.shift.to_s.singularize.camelize.constantize
|
45
|
+
|
46
|
+
build_default_finders(self.resources_name, nesting)
|
47
|
+
|
48
|
+
nesting.collect! {|sym| [sym.to_s.singularize.to_sym, sym]}
|
49
|
+
|
50
|
+
self.member_nesting = nesting + [ [self.resource_name.to_sym] ]
|
51
|
+
self.collection_nesting = nesting + [ [self.resources_name.to_sym] ]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|