josevalim-inherited_resources 0.4.5 → 0.4.6
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.
- data/CHANGELOG +6 -1
- data/README +10 -1
- data/lib/inherited_resources/base.rb +10 -0
- data/lib/inherited_resources/class_methods.rb +17 -4
- data/lib/inherited_resources/url_helpers.rb +3 -0
- data/test/defaults_test.rb +68 -0
- data/test/url_helpers_test.rb +37 -0
- data/test/views/painters/edit.html.erb +1 -0
- data/test/views/painters/index.html.erb +1 -0
- data/test/views/painters/new.html.erb +1 -0
- data/test/views/painters/show.html.erb +1 -0
- metadata +7 -2
data/CHANGELOG
CHANGED
@@ -1,6 +1,11 @@
|
|
1
|
+
# Version 0.4.6
|
2
|
+
|
3
|
+
* Dealing with namespaced controllers out of the box;
|
4
|
+
* Added support to namespaced routes through :route_prefix.
|
5
|
+
|
1
6
|
# Version 0.4.5
|
2
7
|
|
3
|
-
* Added fix when resource_url is not defined
|
8
|
+
* Added fix when resource_url is not defined.
|
4
9
|
|
5
10
|
# Version 0.4.4
|
6
11
|
|
data/README
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Inherited Resources
|
2
2
|
License: MIT
|
3
|
-
Version: 0.4.
|
3
|
+
Version: 0.4.6
|
4
4
|
|
5
5
|
You can also read this README in pretty html at the GitHub project Wiki page:
|
6
6
|
|
@@ -111,6 +111,15 @@ just doing:
|
|
111
111
|
defaults :resource_class => User, :collection_name => 'users', :instance_name => 'user'
|
112
112
|
end
|
113
113
|
|
114
|
+
Namespaced controllers work out of the box, but if you need to specify a
|
115
|
+
different route prefix, you can do the following:
|
116
|
+
|
117
|
+
class Administrators::PeopleController < InheritedResources::Base
|
118
|
+
defaults :route_prefix => 'admin'
|
119
|
+
end
|
120
|
+
|
121
|
+
Then your named routes will be: 'admin_people_url', 'admin_person_url' and so on.
|
122
|
+
|
114
123
|
Further extensions is done by overwriting two methods. Let's suppose you want
|
115
124
|
to add pagination to your projects collection:
|
116
125
|
|
@@ -155,6 +155,16 @@
|
|
155
155
|
# defaults :resource_class => User, :instance_name => 'user', :collection_name => 'users'
|
156
156
|
# end
|
157
157
|
#
|
158
|
+
# Namespaced controllers work out of the box, but if you need to specify a
|
159
|
+
# different route prefix, you can do the following:
|
160
|
+
#
|
161
|
+
# class Administrators::PeopleController < InheritedResources::Base
|
162
|
+
# defaults :route_prefix => 'admin'
|
163
|
+
# end
|
164
|
+
#
|
165
|
+
# Then your named routes will be: 'admin_people_url', 'admin_person_url' and
|
166
|
+
# so on.
|
167
|
+
#
|
158
168
|
# Further customizations can be done replacing some methods. Check
|
159
169
|
# base_helpers.rb file for more information.
|
160
170
|
|
@@ -46,9 +46,15 @@
|
|
46
46
|
#
|
47
47
|
# * route_name => Allows you to specify what is the route name in your url
|
48
48
|
# helper. By default is 'project'. But if your url helper should be
|
49
|
-
# "
|
49
|
+
# "myproject_task_url" instead of "project_task_url", just do:
|
50
50
|
#
|
51
|
-
# belongs_to :project, :route_name => "
|
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".
|
52
58
|
#
|
53
59
|
# = nested_belongs_to
|
54
60
|
#
|
@@ -238,7 +244,8 @@ module InheritedResources #:nodoc:
|
|
238
244
|
raise ArgumentError, 'Class method :defaults expects a hash of options.' unless options.is_a? Hash
|
239
245
|
|
240
246
|
options.symbolize_keys!
|
241
|
-
options.assert_valid_keys(:resource_class, :collection_name, :instance_name,
|
247
|
+
options.assert_valid_keys(:resource_class, :collection_name, :instance_name,
|
248
|
+
:class_name, :route_prefix, :singleton)
|
242
249
|
|
243
250
|
# Checks for special argument :resource_class and :class_name and sets it right away.
|
244
251
|
self.resource_class = options.delete(:resource_class) if options[:resource_class]
|
@@ -285,7 +292,9 @@ module InheritedResources #:nodoc:
|
|
285
292
|
options = symbols.extract_options!
|
286
293
|
|
287
294
|
options.symbolize_keys!
|
288
|
-
options.assert_valid_keys(:class_name, :parent_class, :instance_name, :param,
|
295
|
+
options.assert_valid_keys(:class_name, :parent_class, :instance_name, :param,
|
296
|
+
:finder, :route_name, :collection_name, :singleton,
|
297
|
+
:polymorphic, :optional)
|
289
298
|
|
290
299
|
optional = options.delete(:optional)
|
291
300
|
singleton = options.delete(:singleton)
|
@@ -380,6 +389,10 @@ module InheritedResources #:nodoc:
|
|
380
389
|
config[:collection_name] = base.controller_name.to_sym
|
381
390
|
config[:instance_name] = base.controller_name.singularize.to_sym
|
382
391
|
|
392
|
+
# Deal with namespaced controllers
|
393
|
+
namespaces = base.controller_path.split('/')[0..-2]
|
394
|
+
config[:route_prefix] = namespaces.join('_') unless namespaces.empty?
|
395
|
+
|
383
396
|
# Initialize polymorphic, singleton and belongs_to parameters
|
384
397
|
base.singleton = false
|
385
398
|
base.parents_symbols = []
|
@@ -44,6 +44,9 @@ module InheritedResources #:nodoc:
|
|
44
44
|
resource_config = base.resources_configuration[:self]
|
45
45
|
polymorphic = false
|
46
46
|
|
47
|
+
# Add route_prefix if any.
|
48
|
+
resource_segments << resource_config[:route_prefix] if resource_config[:route_prefix]
|
49
|
+
|
47
50
|
# Deal with belongs_to associations and polymorphic associations.
|
48
51
|
# Remember that we don't have to build the segments in polymorphic cases,
|
49
52
|
# because the url will be polymorphic_url.
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class Malarz
|
4
|
+
def self.human_name; 'Painter'; end
|
5
|
+
end
|
6
|
+
|
7
|
+
class PaintersController < InheritedResources::Base
|
8
|
+
defaults :instance_name => 'malarz', :collection_name => 'malarze', :resource_class => Malarz
|
9
|
+
end
|
10
|
+
|
11
|
+
class DefaultsTest < TEST_CLASS
|
12
|
+
def setup
|
13
|
+
@controller = PaintersController.new
|
14
|
+
@controller.request = @request = ActionController::TestRequest.new
|
15
|
+
@controller.response = @response = ActionController::TestResponse.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_expose_all_painters_as_instance_variable
|
19
|
+
Malarz.expects(:find).with(:all).returns([mock_painter])
|
20
|
+
get :index
|
21
|
+
assert_equal [mock_painter], assigns(:malarze)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_expose_the_resquested_painter_on_show
|
25
|
+
Malarz.expects(:find).with('42').returns(mock_painter)
|
26
|
+
get :show, :id => '42'
|
27
|
+
assert_equal mock_painter, assigns(:malarz)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_expose_a_new_painter
|
31
|
+
Malarz.expects(:new).returns(mock_painter)
|
32
|
+
get :new
|
33
|
+
assert_equal mock_painter, assigns(:malarz)
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_expose_the_resquested_painter_on_edit
|
37
|
+
Malarz.expects(:find).with('42').returns(mock_painter)
|
38
|
+
get :edit, :id => '42'
|
39
|
+
assert_response :success
|
40
|
+
assert_equal mock_painter, assigns(:malarz)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_expose_a_newly_create_painter_when_saved_with_success
|
44
|
+
Malarz.expects(:new).with({'these' => 'params'}).returns(mock_painter(:save => true))
|
45
|
+
post :create, :malarz => {:these => 'params'}
|
46
|
+
assert_equal mock_painter, assigns(:malarz)
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_update_the_requested_object
|
50
|
+
Malarz.expects(:find).with('42').returns(mock_painter)
|
51
|
+
mock_painter.expects(:update_attributes).with({'these' => 'params'}).returns(true)
|
52
|
+
put :update, :id => '42', :malarz => {:these => 'params'}
|
53
|
+
assert_equal mock_painter, assigns(:malarz)
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_the_resquested_painter_is_destroyed
|
57
|
+
Malarz.expects(:find).with('42').returns(mock_painter)
|
58
|
+
mock_painter.expects(:destroy)
|
59
|
+
delete :destroy, :id => '42'
|
60
|
+
assert_equal mock_painter, assigns(:malarz)
|
61
|
+
end
|
62
|
+
|
63
|
+
protected
|
64
|
+
def mock_painter(stubs={})
|
65
|
+
@mock_painter ||= mock(stubs)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
data/test/url_helpers_test.rb
CHANGED
@@ -9,6 +9,11 @@ class House; end
|
|
9
9
|
class HousesController < InheritedResources::Base
|
10
10
|
end
|
11
11
|
|
12
|
+
class Backpack; end
|
13
|
+
module Admin; end
|
14
|
+
class Admin::BackpacksController < InheritedResources::Base
|
15
|
+
end
|
16
|
+
|
12
17
|
class Table; end
|
13
18
|
class TablesController < InheritedResources::Base
|
14
19
|
belongs_to :house
|
@@ -82,6 +87,38 @@ class UrlHelpersTest < ActiveSupport::TestCase
|
|
82
87
|
end
|
83
88
|
end
|
84
89
|
|
90
|
+
def test_url_helpers_on_simple_inherited_namespaced_resource
|
91
|
+
controller = Admin::BackpacksController.new
|
92
|
+
controller.instance_variable_set('@backpack', :backpack)
|
93
|
+
|
94
|
+
assert_equal 'admin', controller.class.resources_configuration[:self][:route_prefix]
|
95
|
+
|
96
|
+
[:url, :path].each do |path_or_url|
|
97
|
+
controller.expects("admin_backpacks_#{path_or_url}").with({}).once
|
98
|
+
controller.send("collection_#{path_or_url}")
|
99
|
+
|
100
|
+
controller.expects("admin_backpack_#{path_or_url}").with(:backpack, {}).once
|
101
|
+
controller.send("resource_#{path_or_url}")
|
102
|
+
|
103
|
+
controller.expects("new_admin_backpack_#{path_or_url}").with({}).once
|
104
|
+
controller.send("new_resource_#{path_or_url}")
|
105
|
+
|
106
|
+
controller.expects("edit_admin_backpack_#{path_or_url}").with(:backpack, {}).once
|
107
|
+
controller.send("edit_resource_#{path_or_url}")
|
108
|
+
|
109
|
+
# With arg
|
110
|
+
controller.expects("admin_backpack_#{path_or_url}").with(:arg, {}).once
|
111
|
+
controller.send("resource_#{path_or_url}", :arg)
|
112
|
+
|
113
|
+
controller.expects("admin_backpack_#{path_or_url}").with(:arg, {}).once
|
114
|
+
controller.send("resource_#{path_or_url}", :arg)
|
115
|
+
|
116
|
+
# With options
|
117
|
+
controller.expects("admin_backpack_#{path_or_url}").with(:arg, :page => 1).once
|
118
|
+
controller.send("resource_#{path_or_url}", :arg, :page => 1)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
85
122
|
def test_url_helpers_on_simple_inherited_singleton_resource
|
86
123
|
controller = UniversesController.new
|
87
124
|
controller.instance_variable_set('@universe', :universe)
|
@@ -0,0 +1 @@
|
|
1
|
+
Edit HTML
|
@@ -0,0 +1 @@
|
|
1
|
+
Index HTML
|
@@ -0,0 +1 @@
|
|
1
|
+
New HTML
|
@@ -0,0 +1 @@
|
|
1
|
+
Show HTML
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: josevalim-inherited_resources
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Jos\xC3\xA9 Valim"
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-03-
|
12
|
+
date: 2009-03-11 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -71,6 +71,7 @@ test_files:
|
|
71
71
|
- test/base_test.rb
|
72
72
|
- test/belongs_to_test.rb
|
73
73
|
- test/class_methods_test.rb
|
74
|
+
- test/defaults_test.rb
|
74
75
|
- test/nested_belongs_to_test.rb
|
75
76
|
- test/optional_belongs_to_test.rb
|
76
77
|
- test/polymorphic_test.rb
|
@@ -94,6 +95,10 @@ test_files:
|
|
94
95
|
- test/views/managers/edit.html.erb
|
95
96
|
- test/views/managers/new.html.erb
|
96
97
|
- test/views/managers/show.html.erb
|
98
|
+
- test/views/painters/edit.html.erb
|
99
|
+
- test/views/painters/index.html.erb
|
100
|
+
- test/views/painters/new.html.erb
|
101
|
+
- test/views/painters/show.html.erb
|
97
102
|
- test/views/pets/edit.html.erb
|
98
103
|
- test/views/products/edit.html.erb
|
99
104
|
- test/views/products/index.html.erb
|