akitaonrails-resource_controller 0.5.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.
Files changed (238) hide show
  1. data/LICENSE +22 -0
  2. data/README.rdoc +326 -0
  3. data/Rakefile +35 -0
  4. data/generators/scaffold_resource/USAGE +29 -0
  5. data/generators/scaffold_resource/scaffold_resource_generator.rb +184 -0
  6. data/generators/scaffold_resource/templates/controller.rb +2 -0
  7. data/generators/scaffold_resource/templates/fixtures.yml +10 -0
  8. data/generators/scaffold_resource/templates/functional_test.rb +57 -0
  9. data/generators/scaffold_resource/templates/helper.rb +2 -0
  10. data/generators/scaffold_resource/templates/layout.html.erb +17 -0
  11. data/generators/scaffold_resource/templates/migration.rb +15 -0
  12. data/generators/scaffold_resource/templates/model.rb +2 -0
  13. data/generators/scaffold_resource/templates/old_migration.rb +13 -0
  14. data/generators/scaffold_resource/templates/rspec/functional_spec.rb +255 -0
  15. data/generators/scaffold_resource/templates/rspec/helper_spec.rb +11 -0
  16. data/generators/scaffold_resource/templates/rspec/routing_spec.rb +61 -0
  17. data/generators/scaffold_resource/templates/rspec/unit_spec.rb +11 -0
  18. data/generators/scaffold_resource/templates/rspec/views/edit_spec.rb +28 -0
  19. data/generators/scaffold_resource/templates/rspec/views/index_spec.rb +26 -0
  20. data/generators/scaffold_resource/templates/rspec/views/new_spec.rb +30 -0
  21. data/generators/scaffold_resource/templates/rspec/views/show_spec.rb +25 -0
  22. data/generators/scaffold_resource/templates/shoulda_functional_test.rb +19 -0
  23. data/generators/scaffold_resource/templates/style.css +54 -0
  24. data/generators/scaffold_resource/templates/unit_test.rb +7 -0
  25. data/generators/scaffold_resource/templates/view__form.erb +6 -0
  26. data/generators/scaffold_resource/templates/view__form.haml +5 -0
  27. data/generators/scaffold_resource/templates/view_edit.erb +16 -0
  28. data/generators/scaffold_resource/templates/view_edit.haml +11 -0
  29. data/generators/scaffold_resource/templates/view_index.erb +22 -0
  30. data/generators/scaffold_resource/templates/view_index.haml +19 -0
  31. data/generators/scaffold_resource/templates/view_new.erb +12 -0
  32. data/generators/scaffold_resource/templates/view_new.haml +9 -0
  33. data/generators/scaffold_resource/templates/view_show.erb +9 -0
  34. data/generators/scaffold_resource/templates/view_show.haml +9 -0
  35. data/init.rb +1 -0
  36. data/lib/resource_controller.rb +22 -0
  37. data/lib/resource_controller/accessors.rb +77 -0
  38. data/lib/resource_controller/action_options.rb +40 -0
  39. data/lib/resource_controller/actions.rb +75 -0
  40. data/lib/resource_controller/base.rb +15 -0
  41. data/lib/resource_controller/class_methods.rb +24 -0
  42. data/lib/resource_controller/controller.rb +69 -0
  43. data/lib/resource_controller/failable_action_options.rb +25 -0
  44. data/lib/resource_controller/helpers.rb +28 -0
  45. data/lib/resource_controller/helpers/current_objects.rb +69 -0
  46. data/lib/resource_controller/helpers/internal.rb +76 -0
  47. data/lib/resource_controller/helpers/nested.rb +63 -0
  48. data/lib/resource_controller/helpers/singleton_customizations.rb +60 -0
  49. data/lib/resource_controller/helpers/urls.rb +128 -0
  50. data/lib/resource_controller/response_collector.rb +27 -0
  51. data/lib/resource_controller/singleton.rb +15 -0
  52. data/lib/resource_controller/version.rb +9 -0
  53. data/lib/urligence.rb +50 -0
  54. data/rails/init.rb +6 -0
  55. data/test/Rakefile +10 -0
  56. data/test/app/controllers/accounts_controller.rb +6 -0
  57. data/test/app/controllers/application.rb +7 -0
  58. data/test/app/controllers/cms/options_controller.rb +3 -0
  59. data/test/app/controllers/cms/products_controller.rb +3 -0
  60. data/test/app/controllers/comments_controller.rb +3 -0
  61. data/test/app/controllers/images_controller.rb +4 -0
  62. data/test/app/controllers/options_controller.rb +8 -0
  63. data/test/app/controllers/people_controller.rb +9 -0
  64. data/test/app/controllers/photos_controller.rb +11 -0
  65. data/test/app/controllers/posts_controller.rb +10 -0
  66. data/test/app/controllers/projects_controller.rb +3 -0
  67. data/test/app/controllers/somethings_controller.rb +3 -0
  68. data/test/app/controllers/tags_controller.rb +13 -0
  69. data/test/app/controllers/users_controller.rb +12 -0
  70. data/test/app/helpers/accounts_helper.rb +2 -0
  71. data/test/app/helpers/application_helper.rb +3 -0
  72. data/test/app/helpers/cms/products_helper.rb +2 -0
  73. data/test/app/helpers/comments_helper.rb +2 -0
  74. data/test/app/helpers/images_helper.rb +2 -0
  75. data/test/app/helpers/options_helper.rb +2 -0
  76. data/test/app/helpers/people_helper.rb +2 -0
  77. data/test/app/helpers/photos_helper.rb +2 -0
  78. data/test/app/helpers/posts_helper.rb +2 -0
  79. data/test/app/helpers/projects_helper.rb +2 -0
  80. data/test/app/helpers/somethings_helper.rb +2 -0
  81. data/test/app/helpers/tags_helper.rb +2 -0
  82. data/test/app/helpers/users_helper.rb +2 -0
  83. data/test/app/models/account.rb +4 -0
  84. data/test/app/models/comment.rb +3 -0
  85. data/test/app/models/image.rb +3 -0
  86. data/test/app/models/option.rb +3 -0
  87. data/test/app/models/photo.rb +4 -0
  88. data/test/app/models/post.rb +3 -0
  89. data/test/app/models/product.rb +3 -0
  90. data/test/app/models/project.rb +2 -0
  91. data/test/app/models/something.rb +2 -0
  92. data/test/app/models/tag.rb +3 -0
  93. data/test/app/models/user.rb +3 -0
  94. data/test/app/views/accounts/_form.html.erb +4 -0
  95. data/test/app/views/accounts/edit.html.erb +14 -0
  96. data/test/app/views/accounts/new.html.erb +12 -0
  97. data/test/app/views/accounts/show.html.erb +5 -0
  98. data/test/app/views/cms/options/edit.rhtml +17 -0
  99. data/test/app/views/cms/options/index.rhtml +20 -0
  100. data/test/app/views/cms/options/new.rhtml +16 -0
  101. data/test/app/views/cms/options/show.rhtml +8 -0
  102. data/test/app/views/cms/products/edit.rhtml +17 -0
  103. data/test/app/views/cms/products/index.rhtml +20 -0
  104. data/test/app/views/cms/products/new.rhtml +16 -0
  105. data/test/app/views/cms/products/show.rhtml +8 -0
  106. data/test/app/views/comments/edit.rhtml +27 -0
  107. data/test/app/views/comments/index.rhtml +24 -0
  108. data/test/app/views/comments/new.rhtml +26 -0
  109. data/test/app/views/comments/show.rhtml +18 -0
  110. data/test/app/views/images/_form.html.erb +4 -0
  111. data/test/app/views/images/edit.html.erb +14 -0
  112. data/test/app/views/images/new.html.erb +12 -0
  113. data/test/app/views/layouts/application.rhtml +17 -0
  114. data/test/app/views/layouts/comments.rhtml +17 -0
  115. data/test/app/views/layouts/options.rhtml +17 -0
  116. data/test/app/views/layouts/people.rhtml +17 -0
  117. data/test/app/views/layouts/photos.rhtml +17 -0
  118. data/test/app/views/layouts/projects.rhtml +17 -0
  119. data/test/app/views/layouts/somethings.rhtml +17 -0
  120. data/test/app/views/layouts/tags.rhtml +17 -0
  121. data/test/app/views/options/_form.html.erb +8 -0
  122. data/test/app/views/options/edit.html.erb +16 -0
  123. data/test/app/views/options/index.html.erb +21 -0
  124. data/test/app/views/options/new.html.erb +12 -0
  125. data/test/app/views/options/show.html.erb +10 -0
  126. data/test/app/views/people/edit.rhtml +17 -0
  127. data/test/app/views/people/index.rhtml +20 -0
  128. data/test/app/views/people/new.rhtml +16 -0
  129. data/test/app/views/people/show.rhtml +8 -0
  130. data/test/app/views/photos/edit.rhtml +17 -0
  131. data/test/app/views/photos/index.rhtml +20 -0
  132. data/test/app/views/photos/new.rhtml +16 -0
  133. data/test/app/views/photos/show.rhtml +8 -0
  134. data/test/app/views/posts/edit.rhtml +22 -0
  135. data/test/app/views/posts/index.rhtml +22 -0
  136. data/test/app/views/posts/new.rhtml +21 -0
  137. data/test/app/views/posts/show.rhtml +13 -0
  138. data/test/app/views/projects/edit.rhtml +17 -0
  139. data/test/app/views/projects/index.rhtml +20 -0
  140. data/test/app/views/projects/new.rhtml +16 -0
  141. data/test/app/views/projects/show.rhtml +8 -0
  142. data/test/app/views/somethings/edit.rhtml +17 -0
  143. data/test/app/views/somethings/index.rhtml +20 -0
  144. data/test/app/views/somethings/new.rhtml +16 -0
  145. data/test/app/views/somethings/show.rhtml +8 -0
  146. data/test/app/views/tags/edit.rhtml +17 -0
  147. data/test/app/views/tags/index.rhtml +20 -0
  148. data/test/app/views/tags/index.rjs +0 -0
  149. data/test/app/views/tags/new.rhtml +16 -0
  150. data/test/app/views/tags/show.rhtml +8 -0
  151. data/test/app/views/users/edit.rhtml +17 -0
  152. data/test/app/views/users/index.rhtml +20 -0
  153. data/test/app/views/users/new.rhtml +16 -0
  154. data/test/app/views/users/show.rhtml +8 -0
  155. data/test/config/boot.rb +109 -0
  156. data/test/config/database.yml +13 -0
  157. data/test/config/environment.rb +64 -0
  158. data/test/config/environments/development.rb +21 -0
  159. data/test/config/environments/test.rb +19 -0
  160. data/test/config/routes.rb +58 -0
  161. data/test/db/migrate/001_create_posts.rb +12 -0
  162. data/test/db/migrate/002_create_products.rb +11 -0
  163. data/test/db/migrate/003_create_comments.rb +13 -0
  164. data/test/db/migrate/004_create_options.rb +13 -0
  165. data/test/db/migrate/005_create_photos.rb +11 -0
  166. data/test/db/migrate/006_create_tags.rb +17 -0
  167. data/test/db/migrate/007_create_somethings.rb +11 -0
  168. data/test/db/migrate/008_create_accounts.rb +11 -0
  169. data/test/db/migrate/009_add_account_id_to_photos.rb +9 -0
  170. data/test/db/migrate/010_create_projects.rb +11 -0
  171. data/test/db/migrate/011_create_images.rb +12 -0
  172. data/test/db/migrate/012_create_users.rb +11 -0
  173. data/test/db/schema.rb +72 -0
  174. data/test/script/console +3 -0
  175. data/test/script/destroy +3 -0
  176. data/test/script/generate +3 -0
  177. data/test/script/server +3 -0
  178. data/test/test/fixtures/accounts.yml +7 -0
  179. data/test/test/fixtures/comments.yml +11 -0
  180. data/test/test/fixtures/images.yml +6 -0
  181. data/test/test/fixtures/options.yml +9 -0
  182. data/test/test/fixtures/photos.yml +9 -0
  183. data/test/test/fixtures/photos_tags.yml +3 -0
  184. data/test/test/fixtures/posts.yml +9 -0
  185. data/test/test/fixtures/products.yml +7 -0
  186. data/test/test/fixtures/projects.yml +7 -0
  187. data/test/test/fixtures/somethings.yml +7 -0
  188. data/test/test/fixtures/tags.yml +7 -0
  189. data/test/test/fixtures/users.yml +5 -0
  190. data/test/test/functional/cms/options_controller_test.rb +23 -0
  191. data/test/test/functional/cms/products_controller_test.rb +23 -0
  192. data/test/test/functional/comments_controller_test.rb +26 -0
  193. data/test/test/functional/images_controller_test.rb +37 -0
  194. data/test/test/functional/people_controller_test.rb +34 -0
  195. data/test/test/functional/photos_controller_test.rb +130 -0
  196. data/test/test/functional/posts_controller_test.rb +34 -0
  197. data/test/test/functional/projects_controller_test.rb +18 -0
  198. data/test/test/functional/somethings_controller_test.rb +28 -0
  199. data/test/test/functional/tags_controller_test.rb +64 -0
  200. data/test/test/functional/users_controller_test.rb +24 -0
  201. data/test/test/test_helper.rb +12 -0
  202. data/test/test/unit/accessors_test.rb +110 -0
  203. data/test/test/unit/account_test.rb +7 -0
  204. data/test/test/unit/action_options_test.rb +109 -0
  205. data/test/test/unit/base_test.rb +11 -0
  206. data/test/test/unit/comment_test.rb +10 -0
  207. data/test/test/unit/failable_action_options_test.rb +77 -0
  208. data/test/test/unit/helpers/current_objects_test.rb +133 -0
  209. data/test/test/unit/helpers/internal_test.rb +106 -0
  210. data/test/test/unit/helpers/nested_test.rb +86 -0
  211. data/test/test/unit/helpers/singleton_current_objects_test.rb +68 -0
  212. data/test/test/unit/helpers/singleton_nested_test.rb +77 -0
  213. data/test/test/unit/helpers/singleton_urls_test.rb +67 -0
  214. data/test/test/unit/helpers/urls_test.rb +75 -0
  215. data/test/test/unit/helpers_test.rb +25 -0
  216. data/test/test/unit/image_test.rb +7 -0
  217. data/test/test/unit/option_test.rb +10 -0
  218. data/test/test/unit/photo_test.rb +10 -0
  219. data/test/test/unit/post_test.rb +10 -0
  220. data/test/test/unit/project_test.rb +10 -0
  221. data/test/test/unit/response_collector_test.rb +49 -0
  222. data/test/test/unit/something_test.rb +10 -0
  223. data/test/test/unit/tag_test.rb +10 -0
  224. data/test/test/unit/urligence_test.rb +203 -0
  225. data/test/vendor/plugins/shoulda/Rakefile +32 -0
  226. data/test/vendor/plugins/shoulda/bin/convert_to_should_syntax +40 -0
  227. data/test/vendor/plugins/shoulda/init.rb +3 -0
  228. data/test/vendor/plugins/shoulda/lib/shoulda.rb +43 -0
  229. data/test/vendor/plugins/shoulda/lib/shoulda/active_record_helpers.rb +580 -0
  230. data/test/vendor/plugins/shoulda/lib/shoulda/color.rb +77 -0
  231. data/test/vendor/plugins/shoulda/lib/shoulda/controller_tests/controller_tests.rb +467 -0
  232. data/test/vendor/plugins/shoulda/lib/shoulda/controller_tests/formats/html.rb +201 -0
  233. data/test/vendor/plugins/shoulda/lib/shoulda/controller_tests/formats/xml.rb +170 -0
  234. data/test/vendor/plugins/shoulda/lib/shoulda/gem/proc_extensions.rb +14 -0
  235. data/test/vendor/plugins/shoulda/lib/shoulda/gem/shoulda.rb +239 -0
  236. data/test/vendor/plugins/shoulda/lib/shoulda/general.rb +118 -0
  237. data/test/vendor/plugins/shoulda/lib/shoulda/private_helpers.rb +22 -0
  238. metadata +344 -0
@@ -0,0 +1,60 @@
1
+ # Singleton Resource Helpers
2
+ #
3
+ # Used internally to transform a plural RESTful controller into a singleton
4
+ #
5
+ module ResourceController::Helpers::SingletonCustomizations
6
+ def self.included(subclass)
7
+ subclass.class_eval do
8
+ methods_to_undefine = [:param, :index, :collection, :load_collection, :collection_url,
9
+ :collection_path, :hash_for_collection_url, :hash_for_collection_path]
10
+ methods_to_undefine.each { |method| undef_method(method) if method_defined? method }
11
+
12
+ class << self
13
+ def singleton?
14
+ true
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ protected
21
+ # Used to fetch the current object in a singleton controller.
22
+ #
23
+ # By defult this method is able to fetch the current object for resources nested with the :has_one association only. (i.e. /users/1/image # => @user.image)
24
+ # In other cases you should override this method and provide your custom code to fetch a singleton resource object, like using a session hash.
25
+ #
26
+ # class AccountsController < ResourceController::Singleton
27
+ # private
28
+ # def object
29
+ # @object ||= Account.find(session[:account_id])
30
+ # end
31
+ # end
32
+ #
33
+ def object
34
+ @object ||= parent? ? end_of_association_chain : nil
35
+ end
36
+
37
+ # Returns the :has_one association proxy of the parent. (i.e. /users/1/image # => @user.image)
38
+ #
39
+ def parent_association
40
+ @parent_association ||= parent_object.send(model_name.to_sym)
41
+ end
42
+
43
+ # Used internally to provide the options to smart_url in a singleton controller.
44
+ #
45
+ def object_url_options(action_prefix = nil, alternate_object = nil)
46
+ [action_prefix] + namespaces + [parent_url_options, route_name.to_sym]
47
+ end
48
+
49
+ # Builds the object, but doesn't save it, during the new, and create action.
50
+ #
51
+ def build_object
52
+ @object ||= singleton_build_object_base.send parent? ? "build_#{model_name}".to_sym : :new, object_params
53
+ end
54
+
55
+ # Singleton controllers don't build off of association proxy, so we can't use end_of_association_chain here
56
+ #
57
+ def singleton_build_object_base
58
+ parent? ? parent_object : model
59
+ end
60
+ end
@@ -0,0 +1,128 @@
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::Helpers::Urls
41
+ protected
42
+ ['', 'edit_'].each do |type|
43
+ symbol = type.blank? ? nil : type.gsub(/_/, '').to_sym
44
+
45
+ define_method("#{type}object_url") do |*alternate_object|
46
+ smart_url *object_url_options(symbol, alternate_object.first)
47
+ end
48
+
49
+ define_method("#{type}object_path") do |*alternate_object|
50
+ smart_path *object_url_options(symbol, alternate_object.first)
51
+ end
52
+
53
+ define_method("hash_for_#{type}object_url") do |*alternate_object|
54
+ hash_for_smart_url *object_url_options(symbol, alternate_object.first)
55
+ end
56
+
57
+ define_method("hash_for_#{type}object_path") do |*alternate_object|
58
+ hash_for_smart_path *object_url_options(symbol, alternate_object.first)
59
+ end
60
+ end
61
+
62
+ def new_object_url
63
+ smart_url *new_object_url_options
64
+ end
65
+
66
+ def new_object_path
67
+ smart_path *new_object_url_options
68
+ end
69
+
70
+ def hash_for_new_object_url
71
+ hash_for_smart_url *new_object_url_options
72
+ end
73
+
74
+ def hash_for_new_object_path
75
+ hash_for_smart_path *new_object_url_options
76
+ end
77
+
78
+ def collection_url
79
+ smart_url *collection_url_options
80
+ end
81
+
82
+ def collection_path
83
+ smart_path *collection_url_options
84
+ end
85
+
86
+ def hash_for_collection_url
87
+ hash_for_smart_url *collection_url_options
88
+ end
89
+
90
+ def hash_for_collection_path
91
+ hash_for_smart_path *collection_url_options
92
+ end
93
+
94
+ # Used internally to provide the options to smart_url from Urligence.
95
+ #
96
+ def collection_url_options
97
+ namespaces + [parent_url_options, route_name.to_s.pluralize.to_sym]
98
+ end
99
+
100
+ # Used internally to provide the options to smart_url from Urligence.
101
+ #
102
+ def object_url_options(action_prefix = nil, alternate_object = nil)
103
+ [action_prefix] + namespaces + [parent_url_options, [route_name.to_sym, alternate_object || object]]
104
+ end
105
+
106
+ # Used internally to provide the options to smart_url from Urligence.
107
+ #
108
+ def new_object_url_options
109
+ [:new] + namespaces + [parent_url_options, route_name.to_sym]
110
+ end
111
+
112
+ def parent_url_options
113
+ if parent?
114
+ parent_singleton? ? parent_type.to_sym : [parent_type.to_sym, parent_object]
115
+ else
116
+ nil
117
+ end
118
+ end
119
+
120
+ # Returns all of the current namespaces of the current controller, symbolized, in array form.
121
+ #
122
+ def namespaces
123
+ names = self.class.name.split("::")
124
+ names.pop
125
+
126
+ names.map(&:underscore).map(&:to_sym)
127
+ end
128
+ 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
+ returning ResponseCollector.new 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,9 @@
1
+ module ResourceController
2
+ module VERSION
3
+ MAJOR = 0
4
+ MINOR = 5
5
+ TINY = 2
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join('.')
8
+ end
9
+ end
@@ -0,0 +1,50 @@
1
+ module Urligence
2
+ def smart_url(*objects)
3
+ urligence(*objects.push(:url))
4
+ end
5
+
6
+ def smart_path(*objects)
7
+ urligence(*objects.push(:path))
8
+ end
9
+
10
+ def hash_for_smart_url(*objects)
11
+ urligence(*objects.unshift(:hash_for).push(:url).push({:type => :hash}))
12
+ end
13
+
14
+ def hash_for_smart_path(*objects)
15
+ urligence(*objects.unshift(:hash_for).push(:path).push({:type => :hash}))
16
+ end
17
+
18
+ def urligence(*objects)
19
+ config = {}
20
+ config.merge!(objects.pop) if objects.last.is_a?(Hash)
21
+
22
+ objects.reject! { |object| object.nil? }
23
+
24
+ url_fragments = objects.collect do |obj|
25
+ if obj.is_a? Symbol
26
+ obj
27
+ elsif obj.is_a? Array
28
+ obj.first
29
+ else
30
+ obj.class.name.underscore.to_sym
31
+ end
32
+ end
33
+
34
+ unless config[:type] == :hash
35
+ send url_fragments.join("_"), *objects.flatten.select { |obj| !obj.is_a? Symbol }
36
+ else
37
+ params = {}
38
+ unparsed_params = objects.select { |obj| !obj.is_a? Symbol }
39
+ unparsed_params.each_with_index do |obj, i|
40
+ unless i == (unparsed_params.length-1)
41
+ 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})
42
+ else
43
+ params.merge!((obj.is_a? Array) ? {:id => obj[1].to_param} : {:id => obj.to_param})
44
+ end
45
+ end
46
+
47
+ send url_fragments.join("_"), params
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,6 @@
1
+ ActionController::Base.class_eval do
2
+ include Urligence
3
+ helper_method :smart_url
4
+
5
+ extend ResourceController::ActionControllerExtension
6
+ end
@@ -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.join(File.dirname(__FILE__), 'config', 'boot'))
5
+
6
+ require 'rake'
7
+ require 'rake/testtask'
8
+ require 'rake/rdoctask'
9
+
10
+ require 'tasks/rails'
@@ -0,0 +1,6 @@
1
+ class AccountsController < ResourceController::Singleton
2
+ protected
3
+ def object
4
+ Account.find(:first)
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ # Filters added to this controller apply to all controllers in the application.
2
+ # Likewise, all the methods added will be available for all controllers.
3
+
4
+ class ApplicationController < ActionController::Base
5
+ # Pick a unique cookie name to distinguish our session data from others'
6
+ session :session_key => '_myapp_session'
7
+ end
@@ -0,0 +1,3 @@
1
+ class Cms::OptionsController < ResourceController::Base
2
+ belongs_to :product
3
+ end
@@ -0,0 +1,3 @@
1
+ class Cms::ProductsController < ResourceController::Base
2
+ create.flash 'something'
3
+ end
@@ -0,0 +1,3 @@
1
+ class CommentsController < ResourceController::Base
2
+ belongs_to :post
3
+ end
@@ -0,0 +1,4 @@
1
+ class ImagesController < ResourceController::Singleton
2
+ belongs_to :user
3
+ actions :create
4
+ end
@@ -0,0 +1,8 @@
1
+ class OptionsController < ResourceController::Base
2
+ belongs_to :account
3
+
4
+ protected
5
+ def parent_object
6
+ Account.find(:first)
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ class PeopleController < ResourceController::Base
2
+ create.before :name_person
3
+ model_name :account
4
+
5
+ private
6
+ def name_person
7
+ @person.name = "Bob Loblaw"
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ class PhotosController < ResourceController::Base
2
+ actions :all, :except => :update
3
+
4
+ belongs_to :user
5
+ create.flash { "#{@photo.title} was created!" }
6
+
7
+ private
8
+ def parent_model
9
+ Account
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ class PostsController < ResourceController::Base
2
+ actions :all
3
+
4
+ create.before(:name_post) { @post.body = '...' }
5
+
6
+ private
7
+ def name_post
8
+ @post.title = 'a great post'
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ class ProjectsController < ApplicationController
2
+ resource_controller
3
+ end
@@ -0,0 +1,3 @@
1
+ class SomethingsController < ResourceController::Base
2
+ actions :index, :show
3
+ end
@@ -0,0 +1,13 @@
1
+ class TagsController < ResourceController::Base
2
+ belongs_to :photo
3
+
4
+ index.wants.js
5
+
6
+ index do
7
+ before { @products = Product.find :all }
8
+ end
9
+
10
+ create.after do
11
+ @photo.tags << @tag if parent_type == :photo
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ class UsersController < ResourceController::Base
2
+ object_name :dude
3
+ route_name :dude
4
+ private
5
+ def route_name
6
+ 'dude'
7
+ end
8
+
9
+ def model_name
10
+ 'account'
11
+ end
12
+ end
@@ -0,0 +1,2 @@
1
+ module AccountsHelper
2
+ end
@@ -0,0 +1,3 @@
1
+ # Methods added to this helper will be available to all templates in the application.
2
+ module ApplicationHelper
3
+ end