resources_controller 1.0.2
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/LICENSE +22 -0
- data/README.rdoc +330 -0
- data/TODO +0 -0
- data/VERSION.yml +4 -0
- data/generators/scaffold_resource/USAGE +29 -0
- data/generators/scaffold_resource/scaffold_resource_generator.rb +179 -0
- data/generators/scaffold_resource/templates/controller.rb +2 -0
- data/generators/scaffold_resource/templates/fixtures.yml +10 -0
- data/generators/scaffold_resource/templates/functional_test.rb +57 -0
- data/generators/scaffold_resource/templates/helper.rb +2 -0
- data/generators/scaffold_resource/templates/migration.rb +15 -0
- data/generators/scaffold_resource/templates/model.rb +2 -0
- data/generators/scaffold_resource/templates/old_migration.rb +13 -0
- data/generators/scaffold_resource/templates/rspec/functional_spec.rb +255 -0
- data/generators/scaffold_resource/templates/rspec/helper_spec.rb +11 -0
- data/generators/scaffold_resource/templates/rspec/routing_spec.rb +61 -0
- data/generators/scaffold_resource/templates/rspec/unit_spec.rb +11 -0
- data/generators/scaffold_resource/templates/rspec/views/edit_spec.rb +28 -0
- data/generators/scaffold_resource/templates/rspec/views/index_spec.rb +26 -0
- data/generators/scaffold_resource/templates/rspec/views/new_spec.rb +30 -0
- data/generators/scaffold_resource/templates/rspec/views/show_spec.rb +25 -0
- data/generators/scaffold_resource/templates/shoulda_functional_test.rb +19 -0
- data/generators/scaffold_resource/templates/unit_test.rb +7 -0
- data/generators/scaffold_resource/templates/view__form.erb +6 -0
- data/generators/scaffold_resource/templates/view__form.haml +5 -0
- data/generators/scaffold_resource/templates/view_edit.erb +16 -0
- data/generators/scaffold_resource/templates/view_edit.haml +11 -0
- data/generators/scaffold_resource/templates/view_index.erb +22 -0
- data/generators/scaffold_resource/templates/view_index.haml +19 -0
- data/generators/scaffold_resource/templates/view_new.erb +12 -0
- data/generators/scaffold_resource/templates/view_new.haml +9 -0
- data/generators/scaffold_resource/templates/view_show.erb +9 -0
- data/generators/scaffold_resource/templates/view_show.haml +9 -0
- data/lib/resource_controller/accessors.rb +77 -0
- data/lib/resource_controller/action_options.rb +40 -0
- data/lib/resource_controller/actions.rb +75 -0
- data/lib/resource_controller/base.rb +15 -0
- data/lib/resource_controller/controller.rb +69 -0
- data/lib/resource_controller/failable_action_options.rb +25 -0
- data/lib/resource_controller/helpers/current_objects.rb +82 -0
- data/lib/resource_controller/helpers/internal.rb +80 -0
- data/lib/resource_controller/helpers/nested.rb +82 -0
- data/lib/resource_controller/helpers/singleton_customizations.rb +64 -0
- data/lib/resource_controller/helpers/urls.rb +132 -0
- data/lib/resource_controller/helpers.rb +34 -0
- data/lib/resource_controller/response_collector.rb +27 -0
- data/lib/resource_controller/singleton.rb +15 -0
- data/lib/resource_controller.rb +54 -0
- data/lib/urligence.rb +52 -0
- data/rails/init.rb +6 -0
- data/test/Gemfile +11 -0
- data/test/Rakefile +10 -0
- data/test/app/controllers/accounts_controller.rb +6 -0
- data/test/app/controllers/application_controller.rb +5 -0
- data/test/app/controllers/cms/options_controller.rb +3 -0
- data/test/app/controllers/cms/personnel_controller.rb +2 -0
- data/test/app/controllers/cms/photos_controller.rb +6 -0
- data/test/app/controllers/cms/products_controller.rb +3 -0
- data/test/app/controllers/comments_controller.rb +3 -0
- data/test/app/controllers/images_controller.rb +4 -0
- data/test/app/controllers/options_controller.rb +8 -0
- data/test/app/controllers/people_controller.rb +9 -0
- data/test/app/controllers/photos_controller.rb +12 -0
- data/test/app/controllers/posts_controller.rb +10 -0
- data/test/app/controllers/projects_controller.rb +3 -0
- data/test/app/controllers/somethings_controller.rb +3 -0
- data/test/app/controllers/tags_controller.rb +13 -0
- data/test/app/controllers/users_controller.rb +12 -0
- data/test/app/helpers/accounts_helper.rb +2 -0
- data/test/app/helpers/application_helper.rb +3 -0
- data/test/app/helpers/cms/products_helper.rb +2 -0
- data/test/app/helpers/comments_helper.rb +2 -0
- data/test/app/helpers/images_helper.rb +2 -0
- data/test/app/helpers/options_helper.rb +2 -0
- data/test/app/helpers/people_helper.rb +2 -0
- data/test/app/helpers/photos_helper.rb +2 -0
- data/test/app/helpers/posts_helper.rb +2 -0
- data/test/app/helpers/projects_helper.rb +2 -0
- data/test/app/helpers/somethings_helper.rb +2 -0
- data/test/app/helpers/tags_helper.rb +2 -0
- data/test/app/helpers/users_helper.rb +2 -0
- data/test/app/models/account.rb +4 -0
- data/test/app/models/comment.rb +3 -0
- data/test/app/models/image.rb +3 -0
- data/test/app/models/option.rb +3 -0
- data/test/app/models/personnel.rb +3 -0
- data/test/app/models/photo.rb +5 -0
- data/test/app/models/post.rb +3 -0
- data/test/app/models/product.rb +3 -0
- data/test/app/models/project.rb +2 -0
- data/test/app/models/something.rb +2 -0
- data/test/app/models/tag.rb +3 -0
- data/test/app/models/user.rb +3 -0
- data/test/app/views/accounts/_form.html.erb +4 -0
- data/test/app/views/accounts/edit.html.erb +14 -0
- data/test/app/views/accounts/new.html.erb +12 -0
- data/test/app/views/accounts/show.html.erb +5 -0
- data/test/app/views/cms/options/edit.rhtml +17 -0
- data/test/app/views/cms/options/index.rhtml +20 -0
- data/test/app/views/cms/options/new.rhtml +16 -0
- data/test/app/views/cms/options/show.rhtml +8 -0
- data/test/app/views/cms/photos/edit.rhtml +17 -0
- data/test/app/views/cms/photos/index.rhtml +20 -0
- data/test/app/views/cms/photos/new.rhtml +16 -0
- data/test/app/views/cms/photos/show.rhtml +8 -0
- data/test/app/views/cms/products/edit.rhtml +17 -0
- data/test/app/views/cms/products/index.rhtml +20 -0
- data/test/app/views/cms/products/new.rhtml +16 -0
- data/test/app/views/cms/products/show.rhtml +8 -0
- data/test/app/views/comments/edit.rhtml +27 -0
- data/test/app/views/comments/index.rhtml +24 -0
- data/test/app/views/comments/new.rhtml +26 -0
- data/test/app/views/comments/show.rhtml +18 -0
- data/test/app/views/images/_form.html.erb +4 -0
- data/test/app/views/images/edit.html.erb +14 -0
- data/test/app/views/images/new.html.erb +12 -0
- data/test/app/views/layouts/application.rhtml +17 -0
- data/test/app/views/layouts/comments.rhtml +17 -0
- data/test/app/views/layouts/options.rhtml +17 -0
- data/test/app/views/layouts/people.rhtml +17 -0
- data/test/app/views/layouts/photos.rhtml +17 -0
- data/test/app/views/layouts/projects.rhtml +17 -0
- data/test/app/views/layouts/somethings.rhtml +17 -0
- data/test/app/views/layouts/tags.rhtml +17 -0
- data/test/app/views/options/_form.html.erb +8 -0
- data/test/app/views/options/edit.html.erb +16 -0
- data/test/app/views/options/index.html.erb +21 -0
- data/test/app/views/options/new.html.erb +12 -0
- data/test/app/views/options/show.html.erb +10 -0
- data/test/app/views/people/edit.rhtml +17 -0
- data/test/app/views/people/index.rhtml +20 -0
- data/test/app/views/people/new.rhtml +16 -0
- data/test/app/views/people/show.rhtml +8 -0
- data/test/app/views/photos/edit.rhtml +17 -0
- data/test/app/views/photos/index.rhtml +20 -0
- data/test/app/views/photos/new.rhtml +16 -0
- data/test/app/views/photos/show.rhtml +8 -0
- data/test/app/views/posts/edit.rhtml +22 -0
- data/test/app/views/posts/index.rhtml +22 -0
- data/test/app/views/posts/new.rhtml +21 -0
- data/test/app/views/posts/show.rhtml +13 -0
- data/test/app/views/projects/edit.rhtml +17 -0
- data/test/app/views/projects/index.rhtml +20 -0
- data/test/app/views/projects/new.rhtml +16 -0
- data/test/app/views/projects/show.rhtml +8 -0
- data/test/app/views/somethings/edit.rhtml +17 -0
- data/test/app/views/somethings/index.rhtml +20 -0
- data/test/app/views/somethings/new.rhtml +16 -0
- data/test/app/views/somethings/show.rhtml +8 -0
- data/test/app/views/tags/edit.rhtml +17 -0
- data/test/app/views/tags/index.rhtml +20 -0
- data/test/app/views/tags/index.rjs +0 -0
- data/test/app/views/tags/new.rhtml +16 -0
- data/test/app/views/tags/show.rhtml +8 -0
- data/test/app/views/users/edit.rhtml +17 -0
- data/test/app/views/users/index.rhtml +20 -0
- data/test/app/views/users/new.rhtml +16 -0
- data/test/app/views/users/show.rhtml +8 -0
- data/test/config/application.rb +41 -0
- data/test/config/boot.rb +6 -0
- data/test/config/database.yml +9 -0
- data/test/config/environment.rb +5 -0
- data/test/config/environments/development.rb +19 -0
- data/test/config/environments/test.rb +32 -0
- data/test/config/initializers/inflections.rb +14 -0
- data/test/config/initializers/secret_token.rb +7 -0
- data/test/config/initializers/session_store.rb +8 -0
- data/test/config/routes.rb +35 -0
- data/test/config.ru +4 -0
- data/test/db/migrate/001_create_posts.rb +12 -0
- data/test/db/migrate/002_create_products.rb +11 -0
- data/test/db/migrate/003_create_comments.rb +13 -0
- data/test/db/migrate/004_create_options.rb +13 -0
- data/test/db/migrate/005_create_photos.rb +11 -0
- data/test/db/migrate/006_create_tags.rb +17 -0
- data/test/db/migrate/007_create_somethings.rb +11 -0
- data/test/db/migrate/008_create_accounts.rb +11 -0
- data/test/db/migrate/009_add_account_id_to_photos.rb +9 -0
- data/test/db/migrate/010_create_projects.rb +11 -0
- data/test/db/migrate/011_create_images.rb +12 -0
- data/test/db/migrate/012_create_users.rb +11 -0
- data/test/db/migrate/013_create_personnel.rb +11 -0
- data/test/db/migrate/014_add_personnel_id_to_photos.rb +9 -0
- data/test/db/schema.rb +78 -0
- data/test/script/console +3 -0
- data/test/script/destroy +3 -0
- data/test/script/generate +3 -0
- data/test/script/rails +6 -0
- data/test/script/server +3 -0
- data/test/test/fixtures/accounts.yml +7 -0
- data/test/test/fixtures/comments.yml +11 -0
- data/test/test/fixtures/images.yml +6 -0
- data/test/test/fixtures/options.yml +9 -0
- data/test/test/fixtures/personnel.yml +5 -0
- data/test/test/fixtures/photos.yml +9 -0
- data/test/test/fixtures/photos_tags.yml +3 -0
- data/test/test/fixtures/posts.yml +9 -0
- data/test/test/fixtures/products.yml +7 -0
- data/test/test/fixtures/projects.yml +7 -0
- data/test/test/fixtures/somethings.yml +7 -0
- data/test/test/fixtures/tags.yml +7 -0
- data/test/test/fixtures/users.yml +5 -0
- data/test/test/functional/cms/options_controller_test.rb +140 -0
- data/test/test/functional/cms/photos_controller_test.rb +37 -0
- data/test/test/functional/cms/products_controller_test.rb +37 -0
- data/test/test/functional/comments_controller_test.rb +140 -0
- data/test/test/functional/images_controller_test.rb +30 -0
- data/test/test/functional/people_controller_test.rb +147 -0
- data/test/test/functional/photos_controller_test.rb +199 -0
- data/test/test/functional/posts_controller_test.rb +21 -0
- data/test/test/functional/projects_controller_test.rb +137 -0
- data/test/test/functional/somethings_controller_test.rb +15 -0
- data/test/test/functional/tags_controller_test.rb +53 -0
- data/test/test/functional/users_controller_test.rb +137 -0
- data/test/test/test_helper.rb +14 -0
- data/test/test/unit/accessors_test.rb +110 -0
- data/test/test/unit/account_test.rb +7 -0
- data/test/test/unit/action_options_test.rb +109 -0
- data/test/test/unit/base_test.rb +11 -0
- data/test/test/unit/comment_test.rb +10 -0
- data/test/test/unit/failable_action_options_test.rb +77 -0
- data/test/test/unit/helpers/current_objects_test.rb +133 -0
- data/test/test/unit/helpers/internal_test.rb +106 -0
- data/test/test/unit/helpers/nested_test.rb +86 -0
- data/test/test/unit/helpers/singleton_current_objects_test.rb +68 -0
- data/test/test/unit/helpers/singleton_nested_test.rb +77 -0
- data/test/test/unit/helpers/singleton_urls_test.rb +67 -0
- data/test/test/unit/helpers/urls_test.rb +75 -0
- data/test/test/unit/helpers_test.rb +25 -0
- data/test/test/unit/image_test.rb +7 -0
- data/test/test/unit/option_test.rb +10 -0
- data/test/test/unit/photo_test.rb +10 -0
- data/test/test/unit/post_test.rb +10 -0
- data/test/test/unit/project_test.rb +10 -0
- data/test/test/unit/response_collector_test.rb +49 -0
- data/test/test/unit/something_test.rb +10 -0
- data/test/test/unit/tag_test.rb +10 -0
- data/test/test/unit/urligence_test.rb +205 -0
- data/test/vendor/plugins/d +1 -0
- data/test/vendor/plugins/dynamic_form/MIT-LICENSE +20 -0
- data/test/vendor/plugins/dynamic_form/README +13 -0
- data/test/vendor/plugins/dynamic_form/Rakefile +10 -0
- data/test/vendor/plugins/dynamic_form/init.rb +5 -0
- data/test/vendor/plugins/dynamic_form/lib/action_view/helpers/dynamic_form.rb +300 -0
- data/test/vendor/plugins/dynamic_form/lib/action_view/locale/en.yml +8 -0
- data/test/vendor/plugins/dynamic_form/test/dynamic_form_i18n_test.rb +42 -0
- data/test/vendor/plugins/dynamic_form/test/dynamic_form_test.rb +370 -0
- data/test/vendor/plugins/dynamic_form/test/test_helper.rb +9 -0
- metadata +403 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# Thanks to Urligence, you get some free url helpers.
|
|
2
|
+
#
|
|
3
|
+
# No matter what your controller looks like...
|
|
4
|
+
#
|
|
5
|
+
# [edit_|new_]object_url # is the equivalent of saying [edit_|new_]post_url(@post)
|
|
6
|
+
# [edit_|new_]object_url(some_other_object) # allows you to specify an object, but still maintain any paths or namespaces that are present
|
|
7
|
+
#
|
|
8
|
+
# collection_url # is like saying posts_url
|
|
9
|
+
#
|
|
10
|
+
# Url helpers are especially useful when working with polymorphic controllers.
|
|
11
|
+
#
|
|
12
|
+
# # /posts/1/comments
|
|
13
|
+
# object_url #=> /posts/1/comments/#{@comment.to_param}
|
|
14
|
+
# object_url(comment) #=> /posts/1/comments/#{comment.to_param}
|
|
15
|
+
# edit_object_url #=> /posts/1/comments/#{@comment.to_param}/edit
|
|
16
|
+
# collection_url #=> /posts/1/comments
|
|
17
|
+
#
|
|
18
|
+
# # /products/1/comments
|
|
19
|
+
# object_url #=> /products/1/comments/#{@comment.to_param}
|
|
20
|
+
# object_url(comment) #=> /products/1/comments/#{comment.to_param}
|
|
21
|
+
# edit_object_url #=> /products/1/comments/#{@comment.to_param}/edit
|
|
22
|
+
# collection_url #=> /products/1/comments
|
|
23
|
+
#
|
|
24
|
+
# # /comments
|
|
25
|
+
# object_url #=> /comments/#{@comment.to_param}
|
|
26
|
+
# object_url(comment) #=> /comments/#{comment.to_param}
|
|
27
|
+
# edit_object_url #=> /comments/#{@comment.to_param}/edit
|
|
28
|
+
# collection_url #=> /comments
|
|
29
|
+
#
|
|
30
|
+
# Or with namespaced, nested controllers...
|
|
31
|
+
#
|
|
32
|
+
# # /admin/products/1/options
|
|
33
|
+
# object_url #=> /admin/products/1/options/#{@option.to_param}
|
|
34
|
+
# object_url(option) #=> /admin/products/1/options/#{option.to_param}
|
|
35
|
+
# edit_object_url #=> /admin/products/1/options/#{@option.to_param}/edit
|
|
36
|
+
# collection_url #=> /admin/products/1/options
|
|
37
|
+
#
|
|
38
|
+
# You get the idea. Everything is automagical! All parameters are inferred.
|
|
39
|
+
#
|
|
40
|
+
module ResourceController
|
|
41
|
+
module Helpers
|
|
42
|
+
module Urls
|
|
43
|
+
protected
|
|
44
|
+
['', 'edit_'].each do |type|
|
|
45
|
+
symbol = type.blank? ? nil : type.gsub(/_/, '').to_sym
|
|
46
|
+
|
|
47
|
+
define_method("#{type}object_url") do |*alternate_object|
|
|
48
|
+
smart_url *object_url_options(symbol, alternate_object.first)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
define_method("#{type}object_path") do |*alternate_object|
|
|
52
|
+
smart_path *object_url_options(symbol, alternate_object.first)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
define_method("hash_for_#{type}object_url") do |*alternate_object|
|
|
56
|
+
hash_for_smart_url *object_url_options(symbol, alternate_object.first)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
define_method("hash_for_#{type}object_path") do |*alternate_object|
|
|
60
|
+
hash_for_smart_path *object_url_options(symbol, alternate_object.first)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def new_object_url
|
|
65
|
+
smart_url *new_object_url_options
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def new_object_path
|
|
69
|
+
smart_path *new_object_url_options
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def hash_for_new_object_url
|
|
73
|
+
hash_for_smart_url *new_object_url_options
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def hash_for_new_object_path
|
|
77
|
+
hash_for_smart_path *new_object_url_options
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def collection_url
|
|
81
|
+
smart_url *collection_url_options
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def collection_path
|
|
85
|
+
smart_path *collection_url_options
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def hash_for_collection_url
|
|
89
|
+
hash_for_smart_url *collection_url_options
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def hash_for_collection_path
|
|
93
|
+
hash_for_smart_path *collection_url_options
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Used internally to provide the options to smart_url from Urligence.
|
|
97
|
+
#
|
|
98
|
+
def collection_url_options
|
|
99
|
+
namespaces + [parent_url_options, route_name.to_s.pluralize.to_sym]
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Used internally to provide the options to smart_url from Urligence.
|
|
103
|
+
#
|
|
104
|
+
def object_url_options(action_prefix = nil, alternate_object = nil)
|
|
105
|
+
[action_prefix] + namespaces + [parent_url_options, [route_name.to_sym, alternate_object || object]]
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Used internally to provide the options to smart_url from Urligence.
|
|
109
|
+
#
|
|
110
|
+
def new_object_url_options
|
|
111
|
+
[:new] + namespaces + [parent_url_options, route_name.to_sym]
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def parent_url_options
|
|
115
|
+
if parent?
|
|
116
|
+
parent_singleton? ? parent_type.to_sym : [parent_type.to_sym, parent_object]
|
|
117
|
+
else
|
|
118
|
+
nil
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Returns all of the current namespaces of the current controller, symbolized, in array form.
|
|
123
|
+
#
|
|
124
|
+
def namespaces
|
|
125
|
+
names = self.class.name.split("::")
|
|
126
|
+
names.pop
|
|
127
|
+
|
|
128
|
+
names.map(&:underscore).map(&:to_sym)
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module ResourceController
|
|
2
|
+
# == ResourceController::Helpers
|
|
3
|
+
#
|
|
4
|
+
# Included in Base.
|
|
5
|
+
#
|
|
6
|
+
# These helpers are used internally to manage objects, generate urls, and manage parent resource associations.
|
|
7
|
+
#
|
|
8
|
+
# If you want to customize certain controller behaviour, like member-object, and collection fetching, overriding these methods is all it takes.
|
|
9
|
+
#
|
|
10
|
+
# See the docs below, and the README for examples
|
|
11
|
+
#
|
|
12
|
+
# *Please Note: many of these helpers build on top of each other, and require that behaviour to be maintained, in order for other functionality to work properly.*
|
|
13
|
+
#
|
|
14
|
+
# e.g. All fetching must be done on top of the method end_of_association_chain, or else parent resources (including polymorphic ones) won't function correctly.
|
|
15
|
+
#
|
|
16
|
+
# class PostsController < ResourceController::Base
|
|
17
|
+
# private
|
|
18
|
+
# def object
|
|
19
|
+
# @object ||= end_of_association_chain.find_by_permalink(param)
|
|
20
|
+
# end
|
|
21
|
+
# end
|
|
22
|
+
module Helpers
|
|
23
|
+
autoload :Urls, 'resource_controller/helpers/urls'
|
|
24
|
+
autoload :Internal, 'resource_controller/helpers/internal'
|
|
25
|
+
autoload :Nested, 'resource_controller/helpers/nested'
|
|
26
|
+
autoload :CurrentObjects, 'resource_controller/helpers/current_objects'
|
|
27
|
+
autoload :SingletonCustomizations, 'resource_controller/helpers/singleton_customizations'
|
|
28
|
+
|
|
29
|
+
include ResourceController::Helpers::Urls
|
|
30
|
+
include ResourceController::Helpers::Internal
|
|
31
|
+
include ResourceController::Helpers::Nested
|
|
32
|
+
include ResourceController::Helpers::CurrentObjects
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module ResourceController
|
|
2
|
+
class ResponseCollector
|
|
3
|
+
|
|
4
|
+
attr_reader :responses
|
|
5
|
+
|
|
6
|
+
delegate :clear, :to => :responses
|
|
7
|
+
|
|
8
|
+
def initialize
|
|
9
|
+
@responses = []
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def method_missing(method_name, &block)
|
|
13
|
+
@responses.delete self[method_name]
|
|
14
|
+
@responses << [method_name, block || nil]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def [](symbol)
|
|
18
|
+
@responses.find { |method, block| method == symbol }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def dup
|
|
22
|
+
ResponseCollector.new.tap do |duplicate|
|
|
23
|
+
duplicate.instance_variable_set(:@responses, responses.dup)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module ResourceController
|
|
2
|
+
|
|
3
|
+
# == ResourceController::Singleton
|
|
4
|
+
#
|
|
5
|
+
# Inherit from this class to create your RESTful singleton controller. See the README for usage.
|
|
6
|
+
#
|
|
7
|
+
class Singleton < ::ApplicationController
|
|
8
|
+
unloadable
|
|
9
|
+
|
|
10
|
+
def self.inherited(subclass)
|
|
11
|
+
super
|
|
12
|
+
subclass.class_eval { resource_controller :singleton }
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
module ResourceController
|
|
2
|
+
ACTIONS = [:index, :show, :new_action, :create, :edit, :update, :destroy].freeze
|
|
3
|
+
SINGLETON_ACTIONS = (ACTIONS - [:index]).freeze
|
|
4
|
+
FAILABLE_ACTIONS = ACTIONS - [:index, :new_action, :edit].freeze
|
|
5
|
+
NAME_ACCESSORS = [:model_name, :route_name, :object_name]
|
|
6
|
+
|
|
7
|
+
autoload :Accessors, 'resource_controller/accessors'
|
|
8
|
+
autoload :ActionOptions, 'resource_controller/action_options'
|
|
9
|
+
autoload :Actions, 'resource_controller/actions'
|
|
10
|
+
autoload :Base, 'resource_controller/base'
|
|
11
|
+
autoload :Controller, 'resource_controller/controller'
|
|
12
|
+
autoload :FailableActionOptions, 'resource_controller/failable_action_options'
|
|
13
|
+
autoload :Helpers, 'resource_controller/helpers'
|
|
14
|
+
autoload :ResponseCollector, 'resource_controller/response_collector'
|
|
15
|
+
autoload :Singleton, 'resource_controller/singleton'
|
|
16
|
+
autoload :Urligence, 'urligence'
|
|
17
|
+
class Railtie < Rails::Railtie
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
class ActionController::Base
|
|
22
|
+
|
|
23
|
+
def self.resource_controller(*args)
|
|
24
|
+
include ResourceController::Controller
|
|
25
|
+
include ResourceController::Urligence
|
|
26
|
+
helper_method :smart_url
|
|
27
|
+
|
|
28
|
+
if args.include?(:singleton)
|
|
29
|
+
include ResourceController::Helpers::SingletonCustomizations
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Use this method in your controller to specify which actions you'd like it to respond to.
|
|
34
|
+
#
|
|
35
|
+
# class PostsController < ResourceController::Base
|
|
36
|
+
# actions :all, :except => :create
|
|
37
|
+
# end
|
|
38
|
+
def self.actions(*opts)
|
|
39
|
+
config = {}
|
|
40
|
+
config.merge!(opts.pop) if opts.last.is_a?(Hash)
|
|
41
|
+
|
|
42
|
+
all_actions = (singleton? ? ResourceController::SINGLETON_ACTIONS : ResourceController::ACTIONS) - [:new_action] + [:new]
|
|
43
|
+
|
|
44
|
+
actions_to_remove = []
|
|
45
|
+
actions_to_remove += all_actions - opts unless opts.first == :all
|
|
46
|
+
actions_to_remove += [*config[:except]] if config[:except]
|
|
47
|
+
actions_to_remove.uniq!
|
|
48
|
+
|
|
49
|
+
actions_to_remove.each { |action| undef_method(action) if method_defined?(action) }
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
|
data/lib/urligence.rb
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
module ResourceController
|
|
2
|
+
module Urligence
|
|
3
|
+
def smart_url(*objects)
|
|
4
|
+
urligence(*objects.push(:url))
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def smart_path(*objects)
|
|
8
|
+
urligence(*objects.push(:path))
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def hash_for_smart_url(*objects)
|
|
12
|
+
urligence(*objects.unshift(:hash_for).push(:url).push({:type => :hash}))
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def hash_for_smart_path(*objects)
|
|
16
|
+
urligence(*objects.unshift(:hash_for).push(:path).push({:type => :hash}))
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def urligence(*objects)
|
|
20
|
+
config = {}
|
|
21
|
+
config.merge!(objects.pop) if objects.last.is_a?(Hash)
|
|
22
|
+
|
|
23
|
+
objects.reject! { |object| object.nil? }
|
|
24
|
+
|
|
25
|
+
url_fragments = objects.collect do |obj|
|
|
26
|
+
if obj.is_a? Symbol
|
|
27
|
+
obj
|
|
28
|
+
elsif obj.is_a? Array
|
|
29
|
+
obj.first
|
|
30
|
+
else
|
|
31
|
+
obj.class.name.underscore.to_sym
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
unless config[:type] == :hash
|
|
36
|
+
send url_fragments.join("_"), *objects.flatten.select { |obj| !obj.is_a? Symbol }
|
|
37
|
+
else
|
|
38
|
+
params = {}
|
|
39
|
+
unparsed_params = objects.select { |obj| !obj.is_a? Symbol }
|
|
40
|
+
unparsed_params.each_with_index do |obj, i|
|
|
41
|
+
unless i == (unparsed_params.length-1)
|
|
42
|
+
params.merge!((obj.is_a? Array) ? {"#{obj.first}_id".to_sym => obj[1].to_param} : {"#{obj.class.name.underscore}_id".to_sym => obj.to_param})
|
|
43
|
+
else
|
|
44
|
+
params.merge!((obj.is_a? Array) ? {:id => obj[1].to_param} : {:id => obj.to_param})
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
send url_fragments.join("_"), params
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
data/rails/init.rb
ADDED
data/test/Gemfile
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
source 'http://rubygems.org'
|
|
2
|
+
|
|
3
|
+
gem 'rails', '3.0.0.beta4'
|
|
4
|
+
gem 'sqlite3-ruby', :require => 'sqlite3'
|
|
5
|
+
gem "resource_controller", :require => "resource_controller", :path => "../"
|
|
6
|
+
|
|
7
|
+
group :test do
|
|
8
|
+
gem "shoulda", :git => "git://github.com/thoughtbot/shoulda.git"
|
|
9
|
+
gem "mocha"
|
|
10
|
+
gem "ruby-debug"
|
|
11
|
+
end
|
data/test/Rakefile
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
|
2
|
+
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
|
3
|
+
|
|
4
|
+
require File.expand_path('../config/application', __FILE__)
|
|
5
|
+
|
|
6
|
+
require 'rake'
|
|
7
|
+
require 'rake/testtask'
|
|
8
|
+
require 'rake/rdoctask'
|
|
9
|
+
|
|
10
|
+
Rails::Application.load_tasks
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<h1>Editing Account</h1>
|
|
2
|
+
|
|
3
|
+
<%= error_messages_for :account %>
|
|
4
|
+
|
|
5
|
+
<%= form_for(:account, :url => object_url, :html => { :method => :put }) do |f| %>
|
|
6
|
+
<%= render :partial => "form", :locals => { :f => f } %>
|
|
7
|
+
<p>
|
|
8
|
+
<%=submit_tag "Update"%>
|
|
9
|
+
</p>
|
|
10
|
+
<% end %>
|
|
11
|
+
|
|
12
|
+
<br/>
|
|
13
|
+
|
|
14
|
+
<%= link_to 'Show', object_url %>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<h1>New Account</h1>
|
|
2
|
+
|
|
3
|
+
<%= error_messages_for :account %>
|
|
4
|
+
|
|
5
|
+
<%= form_for(:account, :url => object_url) do |f| %>
|
|
6
|
+
<%= render :partial => "form", :locals => { :f => f } %>
|
|
7
|
+
<p>
|
|
8
|
+
<%= submit_tag "Create" %>
|
|
9
|
+
</p>
|
|
10
|
+
<% end %>
|
|
11
|
+
<br/>
|
|
12
|
+
<%= link_to 'Back', object_url %>
|