josevalim-inherited_resources 0.6.3 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,250 +1,37 @@
1
- # = belongs to
2
- #
3
- # This allows you to specify to belongs_to in your controller. You might use
4
- # this when you are having nested resources in your routes:
5
- #
6
- # class TasksController < InheritedResources::Base
7
- # belongs_to :project
8
- # end
9
- #
10
- # This will do all magic assuming some defaults. It assumes that your URL to
11
- # access those tasks are:
12
- #
13
- # /projects/:project_id/tasks
14
- #
15
- # But all defaults are configurable. The options are:
16
- #
17
- # * :parent_class => Allows you to specify what is the parent class.
18
- #
19
- # belongs_to :project, :parent_class => AdminProject
20
- #
21
- # * :class_name => Also allows you to specify the parent class, but you should
22
- # give a string. Added for ActiveRecord belongs to compatibility.
23
- #
24
- # * :instance_name => How this object will appear in your views. In this case
25
- # the default is @project. Overwrite it with a symbol.
26
- #
27
- # belongs_to :project, :instance_name => :my_project
28
- #
29
- # * :finder => Specifies which method should be called to instantiate the
30
- # parent. Let's suppose you are using slugs ("this-is-project-title") in URLs
31
- # so your tasks url would be: "projects/this-is-project-title/tasks". Then you
32
- # should do this in your TasksController:
33
- #
34
- # belongs_to :project, :finder => :find_by_title!
35
- #
36
- # This will make your projects be instantiated as:
37
- #
38
- # Project.find_by_title!(params[:project_id])
39
- #
40
- # Instead of:
41
- #
42
- # Project.find(params[:project_id])
43
- #
44
- # * param => Allows you to specify params key used to instantiate the parent.
45
- # Default is :parent_id, which in this case is :project_id.
46
- #
47
- # * route_name => Allows you to specify what is the route name in your url
48
- # helper. By default is 'project'. But if your url helper should be
49
- # "myproject_task_url" instead of "project_task_url", just do:
50
- #
51
- # belongs_to :project, :route_name => "myproject"
52
- #
53
- # But if you want to use namespaced routes, you can do:
54
- #
55
- # defaults :route_prefix => :admin
56
- #
57
- # That would generate "admin_project_task_url".
58
- #
59
- # = nested_belongs_to
60
- #
61
- # If for some reason you need to nested more than two resources, you can do:
62
- #
63
- # class TasksController
64
- # belongs_to :company, :project
65
- # end
66
- #
67
- # ATTENTION! This DOES NOT mean polymorphic associations as in resource_controller.
68
- # Polymorphic associations are not supported yet.
69
- #
70
- # It means that companies have many projects which have many tasks. You URL
71
- # should be:
72
- #
73
- # /companies/:company_id/projects/:project_id/tasks/:id
74
- #
75
- # Everything will be handled for you again. And all defaults will describe above
76
- # will be assumed. But if you have to change the defaults. You will have to
77
- # specify one association by one:
78
- #
79
- # class TasksController
80
- # belongs_to :company, :finder => :find_by_name!, :param => :company_name
81
- # belongs_to :project
82
- # end
83
- #
84
- # belongs_to is aliased as nested_belongs_to, so this provides a nicer syntax:
85
- #
86
- # class TasksController
87
- # nested_belongs_to :company, :finder => :find_by_name!, :param => :company_name
88
- # nested_belongs_to :project
89
- # end
90
- #
91
- # In this case the association chain would be:
92
- #
93
- # Company.find_by_name!(params[:company_name]).projects.find(params[:project_id]).tasks.find(:all)
94
- #
95
- # When you are using nested resources, you have one more option to config.
96
- # Let's suppose that to get all projects from a company, you have to do:
97
- #
98
- # Company.admin_projects
99
- #
100
- # Instead of:
101
- #
102
- # Company.projects
103
- #
104
- # In this case, you can set the collection_name in belongs_to:
105
- #
106
- # nested_belongs_to :project, :collection_name => 'admin_projects'
107
- #
108
- # = polymorphic associations
109
- #
110
- # In some cases you have a resource that belongs to two different resources
111
- # but not at the same time. For example, let's suppose you have File, Message
112
- # and Task as resources and they are all commentable.
113
- #
114
- # Polymorphic associations allows you to create just one controller that will
115
- # deal with each case.
116
- #
117
- # class Comment < InheritedResources::Base
118
- # belongs_to :file, :message, :task, :polymorphic => true
119
- # end
120
- #
121
- # Your routes should be something like:
122
- #
123
- # m.resources :files, :has_many => :comments #=> /files/13/comments
124
- # m.resources :tasks, :has_many => :comments #=> /tasks/17/comments
125
- # m.resources :messages, :has_many => :comments #=> /messages/11/comments
126
- #
127
- # When using polymorphic associations, you get some free helpers:
128
- #
129
- # parent? #=> true
130
- # parent_type #=> :task
131
- # parent_class #=> Task
132
- # parent #=> @task
133
- #
134
- # This polymorphic controllers thing is a great idea by James Golick and he
135
- # built it in resource_controller. Here is just a re-implementation.
136
- #
137
- # = optional polymorphic associations
138
- #
139
- # Let's take another break from ProjectsController. Let's suppose we are
140
- # building a store, which sell products.
141
- #
142
- # On the website, we can show all products, but also products scoped to
143
- # categories, brands, users. In this case case, the association is optional, and
144
- # we deal with it in the following way:
145
- #
146
- # class ProductsController < InheritedResources::Base
147
- # belongs_to :category, :brand, :user, :polymorphic => true, :optional => true
148
- # end
149
- #
150
- # This will handle all those urls properly:
151
- #
152
- # /products/1
153
- # /categories/2/products/5
154
- # /brands/10/products/3
155
- # /user/13/products/11
156
- #
157
- # = nested polymorphic associations
158
- #
159
- # You can have polymorphic associations with nested resources. Let's suppose
160
- # that our File, Task and Message resources in the previous example belongs to
161
- # a project.
162
- #
163
- # This way we can have:
164
- #
165
- # class CommentsController < InheritedResources::Base
166
- # belongs_to :project {
167
- # belongs_to :file, :message, :task, :polymorphic => true
168
- # }
169
- # end
170
- #
171
- # Or:
172
- #
173
- # class CommentsController < InheritedResources::Base
174
- # nested_belongs_to :project
175
- # nested_belongs_to :file, :message, :task, :polymorphic => true
176
- # end
177
- #
178
- # Choose the syntax that makes more sense to you. :)
179
- #
180
- # Finally your routes should be something like:
181
- #
182
- # map.resources :projects do |m|
183
- # m.resources :files, :has_many => :comments #=> /projects/1/files/13/comments
184
- # m.resources :tasks, :has_many => :comments #=> /projects/1/tasks/17/comments
185
- # m.resources :messages, :has_many => :comments #=> /projects/1/messages/11/comments
186
- # end
187
- #
188
- # The helpers work in the same way as above.
189
- #
190
- # = singleton
191
- #
192
- # Singletons are usually used in associations which are related through has_one
193
- # and belongs_to. You declare those associations like this:
194
- #
195
- # class ManagersController < InheritedResources::Base
196
- # belongs_to :project, :singleton => true
197
- # end
198
- #
199
- # But in some cases, like an AccountsController, you have a singleton object
200
- # that is not necessarily associated with another:
201
- #
202
- # class AccountsController < InheritedResources::Base
203
- # defaults :singleton => true
204
- # end
205
- #
206
- # Besides that, you should overwrite the methods :resource and :build_resource
207
- # to make it work properly:
208
- #
209
- # class AccountsController < InheritedResources::Base
210
- # defaults :singleton => true
211
- #
212
- # protected
213
- # def resource
214
- # @current_user.account
215
- # end
216
- #
217
- # def build_resource(attributes = {})
218
- # Account.new(attributes)
219
- # end
220
- # end
221
- #
222
- # When you have a singleton controller, the action index is removed.
223
- #
224
- module InheritedResources #:nodoc:
225
- RESOURCES_CLASS_ACCESSORS = [ :resource_class, :resources_configuration, :parents_symbols, :singleton ] unless self.const_defined? "RESOURCES_CLASS_ACCESSORS"
226
-
227
- module ClassMethods #:nodoc:
1
+ module InheritedResources
2
+ RESOURCES_CLASS_ACCESSORS = [ :resource_class, :resources_configuration,
3
+ :parents_symbols, :scopes_configuration ] unless self.const_defined?(:RESOURCES_CLASS_ACCESSORS)
4
+
5
+ module ClassMethods
228
6
 
229
7
  protected
230
8
 
231
- # When you inherit from InheritedResources::Base, we make some assumptions on
232
- # what is your resource_class, instance_name and collection_name.
9
+ # Used to overwrite the default assumptions InheritedResources do. Whenever
10
+ # this method is called, it should be on the top of your controller, since
11
+ # almost other methods depends on the values given to <<tt>>defaults</tt>.
233
12
  #
234
- # You can change those values by calling the class method <tt>defaults</tt>.
235
- # This is useful, for example, in an accounts controller, where the object
236
- # is an User but controller and routes are accounts.
13
+ # == Options
237
14
  #
238
- # class AccountController < InheritedResources::Base
239
- # defaults :resource_class => User, :instance_name => 'user',
240
- # :collection_name => 'users', :singleton => true
241
- # end
15
+ # * <tt>:resource_class</tt> - The resource class which by default is guessed
16
+ # by the controller name. Defaults to Project in
17
+ # ProjectsController.
18
+ #
19
+ # * <tt>:collection_name</tt> - The name of the collection instance variable which
20
+ # is set on the index action. Defaults to :projects in
21
+ # ProjectsController.
22
+ #
23
+ # * <tt>:instance_name</tt> - The name of the singular instance variable which
24
+ # is set on all actions besides index action. Defaults to
25
+ # :project in ProjectsController.
242
26
  #
243
- # If you want to change your urls, you can use :route_instance_name and
244
- # :route_collection_name helpers.
27
+ # * <tt>:route_collection_name</tt> - The name of the collection route. Defaults to :collection_name.
245
28
  #
246
- # You can also provide :class_name, which is the same as :resource_class
247
- # but accepts string (this is given for ActiveRecord compatibility).
29
+ # * <tt>:route_instance_name</tt> - The name of the singular route. Defaults to :instance_name.
30
+ #
31
+ # * <tt>:route_prefix</tt> - The route prefix which is automically set in namespaced
32
+ # controllers. Default to :admin on Admin::ProjectsController.
33
+ #
34
+ # * <tt>:singleton</tt> - Tells if this controller is singleton or not.
248
35
  #
249
36
  def defaults(options)
250
37
  raise ArgumentError, 'Class method :defaults expects a hash of options.' unless options.is_a? Hash
@@ -287,16 +74,194 @@ module InheritedResources #:nodoc:
287
74
  actions_to_remove += RESOURCES_ACTIONS.map{|a| a.to_s } - actions_to_keep unless actions_to_keep.first == 'all'
288
75
  actions_to_remove.uniq!
289
76
 
290
- # Undefine actions that we don't want
291
77
  (instance_methods & actions_to_remove).each do |action|
292
78
  undef_method action, "#{action}!"
293
79
  end
294
80
  end
295
81
 
82
+ # Detects params from url and apply as scopes to your classes.
83
+ #
84
+ # Your model:
85
+ #
86
+ # class Graduation < ActiveRecord::Base
87
+ # named_scope :featured, :conditions => { :featured => true }
88
+ # named_scope :by_degree, proc {|degree| { :conditions => { :degree => degree } } }
89
+ # end
90
+ #
91
+ # Your controller:
92
+ #
93
+ # class GraduationsController < InheritedResources::Base
94
+ # has_scope :featured, :boolean => true, :only => :index
95
+ # has_scope :by_degree, :only => :index
96
+ # end
97
+ #
98
+ # Then for each request:
99
+ #
100
+ # /graduations
101
+ # #=> acts like a normal request
102
+ #
103
+ # /graduations?featured=true
104
+ # #=> calls the named scope and bring featured graduations
105
+ #
106
+ # /graduations?featured=true&by_degree=phd
107
+ # #=> brings featured graduations with phd degree
108
+ #
109
+ # You can also specify the target of the scope. Let's suppose that a
110
+ # Graduation has many students:
111
+ #
112
+ # class StudentsController < InheritedResources::Base
113
+ # belongs_to :graduation
114
+ #
115
+ # has_scope :featured, :on => :graduation, :boolean => true, :only => :index
116
+ # has_scope :by_degree, :on => :graduation, :only => :index
117
+ # end
118
+ #
119
+ # You can also do this in a block:
120
+ #
121
+ # class StudentsController < InheritedResources::Base
122
+ # belongs_to :graduation do
123
+ # has_scope :featured, :boolean => true, :only => :index
124
+ # has_scope :by_degree, :only => :index
125
+ # end
126
+ # end
127
+ #
128
+ # Or even better:
129
+ #
130
+ # class StudentsController < InheritedResources::Base
131
+ # belongs_to :graduation do
132
+ # load_scopes_from GraduationsController
133
+ # end
134
+ # end
135
+ #
136
+ # Another feature is that you can retrive the current scopes in use with
137
+ # the method <tt>current_scopes</tt> that returns a hash.
138
+ #
139
+ # == Options
140
+ #
141
+ # * <tt>:on</tt> - In each resource the scope is applied to. Defaults to the resource class.
142
+ #
143
+ # * <tt>:boolean</tt> - When set to true, call the scope only when the params is true or 1,
144
+ # and does not send the value as argument.
145
+ #
146
+ # * <tt>:only</tt> - In each actions the scope is applied. By default is :all.
147
+ #
148
+ # * <tt>:except</tt> - In each actions the scope is not applied. By default is :none.
149
+ #
150
+ # * <tt>:key</tt> - The key in the params hash expected to find the scope.
151
+ # Defaults to the scope name.
152
+ #
153
+ # * <tt>:default</tt> - Default value for the scope. Whenever supplied the scope
154
+ # is always called. This is useful to add easy pagination!
155
+ #
156
+ def has_scope(*scopes)
157
+ options = scopes.extract_options!
158
+
159
+ options.symbolize_keys!
160
+ options.assert_valid_keys(:on, :boolean, :key, :only, :except, :default)
161
+
162
+ acts_as_has_scopes!
163
+
164
+ scope_target = options.delete(:on) || @@_parent_block_name || self.resources_configuration[:self][:instance_name]
165
+ target_config = self.scopes_configuration[scope_target.to_sym] ||= {}
166
+
167
+ scopes.each do |scope|
168
+ target_config[scope] ||= {}
169
+ target_config[scope][:key] = options[:key] || scope
170
+ target_config[scope][:only] = Array(options[:only])
171
+ target_config[scope][:except] = Array(options[:except])
172
+ target_config[scope][:boolean] = options[:boolean] if options.key?(:boolean)
173
+ target_config[scope][:default] = options[:default] if options.key?(:default)
174
+ end
175
+ end
176
+
177
+ # Load scopes from another controller into the current controller.
178
+ #
179
+ # You can give :on as option if you want to load just a set of the another
180
+ # controller scope.
181
+ #
182
+ # class TasksController < InheritedResources::Base
183
+ # belongs_to :project
184
+ # load_scopes_from CompaniesController # load all scopes
185
+ # load_scopes_from ProjectsController, :on => :project # load scopes that apply on :project
186
+ # end
187
+ #
188
+ # Whenever called inside a belongs to block, the :on value is guessed:
189
+ #
190
+ # class TasksController < InheritedResources::Base
191
+ # belongs_to :project do
192
+ # load_scopes_from ProjectsController # load scopes that apply on :project
193
+ # end
194
+ #
195
+ # load_scopes_from CompaniesController # load all companies controller scopes
196
+ # end
197
+ #
198
+ def load_scopes_from(scopes_controller, options={})
199
+ to_merge = if on = options.delete(:on) || @@_parent_block_name
200
+ scopes_controller.send(:scopes_configuration).slice(on)
201
+ else
202
+ scopes_controller.send(:scopes_configuration)
203
+ end
204
+
205
+ acts_as_has_scopes! # Add the module before merging scopes.
206
+
207
+ self.scopes_configuration.deep_merge!(to_merge)
208
+ end
209
+
296
210
  # Defines that this controller belongs to another resource.
297
211
  #
298
212
  # belongs_to :projects
299
213
  #
214
+ # == Options
215
+ #
216
+ # * <tt>:parent_class</tt> - Allows you to specify what is the parent class.
217
+ #
218
+ # belongs_to :project, :parent_class => AdminProject
219
+ #
220
+ # * <tt>:class_name</tt> - Also allows you to specify the parent class, but you should
221
+ # give a string. Added for ActiveRecord belongs to compatibility.
222
+ #
223
+ # * <tt>:instance_name</tt> - The instance variable name. By default is the name of the association.
224
+ #
225
+ # belongs_to :project, :instance_name => :my_project
226
+ #
227
+ # * <tt>:finder</tt> - Specifies which method should be called to instantiate the parent.
228
+ #
229
+ # belongs_to :project, :finder => :find_by_title!
230
+ #
231
+ # This will make your projects be instantiated as:
232
+ #
233
+ # Project.find_by_title!(params[:project_id])
234
+ #
235
+ # Instead of:
236
+ #
237
+ # Project.find(params[:project_id])
238
+ #
239
+ # * <tt>:param</tt> - Allows you to specify params key to retrieve the id.
240
+ # Default is :association_id, which in this case is :project_id.
241
+ #
242
+ # * <tt>:route_name</tt> - Allows you to specify what is the route name in your url
243
+ # helper. By default is association name.
244
+ #
245
+ # * <tt>:collection_name</tt> - Tell how to retrieve the next collection. Let's
246
+ # suppose you have Tasks which belongs to Projects
247
+ # which belongs to companies. This will do somewhere
248
+ # down the road:
249
+ #
250
+ # @company.projects
251
+ #
252
+ # But if you want to retrieve instead:
253
+ #
254
+ # @company.admin_projects
255
+ #
256
+ # You supply the collection name.
257
+ #
258
+ # * <tt>:polymorphic</tt> - Tell the association is polymorphic.
259
+ #
260
+ # * <tt>:singleton</tt> - Tell it's a singleton association.
261
+ #
262
+ # * <tt>:optional</tt> - Tell the association is optional (it's a special
263
+ # type of polymorphic association)
264
+ #
300
265
  def belongs_to(*symbols, &block)
301
266
  options = symbols.extract_options!
302
267
 
@@ -309,21 +274,19 @@ module InheritedResources #:nodoc:
309
274
  singleton = options.delete(:singleton)
310
275
  polymorphic = options.delete(:polymorphic)
311
276
 
312
- # Add BelongsToHelpers if we haven't yet.
313
277
  include BelongsToHelpers if self.parents_symbols.empty?
314
278
 
315
279
  acts_as_singleton! if singleton
316
280
  acts_as_polymorphic! if polymorphic || optional
317
281
 
318
282
  raise ArgumentError, 'You have to give me at least one association name.' if symbols.empty?
319
- raise ArgumentError, 'You cannot define multiple associations with the options: #{options.keys.inspect}.' unless symbols.size == 1 || options.empty?
283
+ raise ArgumentError, 'You cannot define multiple associations with options: #{options.keys.inspect} to belongs to.' unless symbols.size == 1 || options.empty?
320
284
 
321
- # Set configuration default values
322
285
  symbols.each do |symbol|
323
286
  symbol = symbol.to_sym
324
287
 
325
288
  if polymorphic || optional
326
- self.parents_symbols << :polymorphic unless self.parents_symbols.include? :polymorphic
289
+ self.parents_symbols << :polymorphic unless self.parents_symbols.include?(:polymorphic)
327
290
  self.resources_configuration[:polymorphic][:symbols] << symbol
328
291
  self.resources_configuration[:polymorphic][:optional] ||= optional
329
292
  else
@@ -333,51 +296,84 @@ module InheritedResources #:nodoc:
333
296
  config = self.resources_configuration[symbol] = {}
334
297
  config[:parent_class] = options.delete(:parent_class)
335
298
  config[:parent_class] ||= (options.delete(:class_name) || symbol).to_s.classify.constantize rescue nil
336
- config[:collection_name] = (options.delete(:collection_name) || symbol.to_s.pluralize).to_sym
337
- config[:instance_name] = (options.delete(:instance_name) || symbol).to_sym
338
- config[:param] = (options.delete(:param) || "#{symbol}_id").to_sym
339
- config[:finder] = (options.delete(:finder) || :find).to_sym
340
- config[:route_name] = (options.delete(:route_name) || symbol).to_s
299
+ config[:collection_name] = options.delete(:collection_name) || symbol.to_s.pluralize.to_sym
300
+ config[:instance_name] = options.delete(:instance_name) || symbol
301
+ config[:param] = options.delete(:param) || :"#{symbol}_id"
302
+ config[:finder] = options.delete(:finder) || :find
303
+ config[:route_name] = options.delete(:route_name) || symbol
341
304
  end
342
305
 
343
- # Regenerate url helpers unless block is given
306
+ # Regenerate url helpers only once when blocks are given
344
307
  if block_given?
345
- class_eval(&block)
346
- else
347
- InheritedResources::UrlHelpers.create_resources_url_helpers!(self)
308
+ raise ArgumentError, "You cannot define multiple associations and give a block to belongs_to." if symbols.size > 1
309
+
310
+ unless @@_parent_block_name
311
+ @@_parent_block_name = symbols.first
312
+ class_eval(&block)
313
+ @@_parent_block_name = nil
314
+ else
315
+ class_eval(&block)
316
+ end
348
317
  end
318
+
319
+ InheritedResources::UrlHelpers.create_resources_url_helpers!(self) unless @@_parent_block_name
349
320
  end
350
321
  alias :nested_belongs_to :belongs_to
351
322
 
352
- private
323
+ # A quick method to declare polymorphic belongs to.
324
+ #
325
+ def polymorphic_belongs_to(*symbols, &block)
326
+ options = symbols.extract_options!
327
+ options.merge!(:polymorphic => true)
328
+ belongs_to(*symbols << options, &block)
329
+ end
353
330
 
354
- # Defines this controller as singleton.
355
- # You can call this method to define your controller as singleton.
331
+ # A quick method to declare singleton belongs to.
356
332
  #
357
- def acts_as_singleton!
358
- unless self.singleton
359
- self.singleton = true
333
+ def singleton_belongs_to(*symbols, &block)
334
+ options = symbols.extract_options!
335
+ options.merge!(:singleton => true)
336
+ belongs_to(*symbols << options, &block)
337
+ end
338
+
339
+ # A quick method to declare optional belongs to.
340
+ #
341
+ def optional_belongs_to(*symbols, &block)
342
+ options = symbols.extract_options!
343
+ options.merge!(:optional => true)
344
+ belongs_to(*symbols << options, &block)
345
+ end
346
+
347
+ private
348
+
349
+ def acts_as_singleton! #:nodoc:
350
+ unless self.resources_configuration[:self][:singleton]
351
+ self.resources_configuration[:self][:singleton] = true
360
352
  include SingletonHelpers
361
353
  actions :all, :except => :index
362
354
  end
363
355
  end
364
356
 
365
- # Defines this controller as polymorphic.
366
- # Do not call this method on your own.
367
- #
368
- def acts_as_polymorphic!
369
- unless self.parents_symbols.include? :polymorphic
357
+ def acts_as_polymorphic! #:nodoc:
358
+ unless self.parents_symbols.include?(:polymorphic)
370
359
  include PolymorphicHelpers
371
- helper_method :parent, :parent_type, :parent_class
360
+ helper_method :parent, :parent_type, :parent_class, :parent?
361
+ end
362
+ end
363
+
364
+ def acts_as_has_scopes! #:nodoc:
365
+ if self.scopes_configuration.empty?
366
+ include HasScopeHelpers
367
+ helper_method :current_scopes
372
368
  end
373
369
  end
374
370
 
375
- # Initialize resources class accessors by creating the accessors
376
- # and setting their default values.
371
+ # Initialize resources class accessors and set their default values.
377
372
  #
378
- def initialize_resources_class_accessors!(base)
373
+ def initialize_resources_class_accessors!(base) #:nodoc:
379
374
  # Add and protect class accessors
380
375
  base.class_eval do
376
+ @@_parent_block_name = nil # Initialize parent flag
381
377
  metaklass = (class << self; self; end)
382
378
 
383
379
  RESOURCES_CLASS_ACCESSORS.each do |cattr|
@@ -411,9 +407,9 @@ module InheritedResources #:nodoc:
411
407
  namespaces = base.controller_path.split('/')[0..-2]
412
408
  config[:route_prefix] = namespaces.join('_') unless namespaces.empty?
413
409
 
414
- # Initialize polymorphic, singleton and belongs_to parameters
415
- base.singleton = false
416
- base.parents_symbols = []
410
+ # Initialize polymorphic, singleton, scopes and belongs_to parameters
411
+ base.parents_symbols = []
412
+ base.scopes_configuration = {}
417
413
  base.resources_configuration[:polymorphic] = { :symbols => [], :optional => false }
418
414
 
419
415
  # Create helpers
@@ -1,9 +1,9 @@
1
- # = Dumb Responder
2
- #
3
- # This responder discards all messages sent to him.
4
- #
5
- module InheritedResources #:nodoc:
6
- class DumbResponder #:nodoc:
1
+ module InheritedResources
2
+ # = Dumb Responder
3
+ #
4
+ # This responder discards all messages sent to him.
5
+ #
6
+ class DumbResponder
7
7
 
8
8
  instance_methods.each do |m|
9
9
  undef_method m unless m =~ /^__/
@@ -11,6 +11,7 @@ module InheritedResources #:nodoc:
11
11
 
12
12
  # This is like a good husband, he will just listen everything that his wife
13
13
  # says (which is a lot) without complaining. :)
14
+ #
14
15
  def method_missing(*args)
15
16
  nil
16
17
  end