nileshtrivedi-lp_resource_builder 0.5.1
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 +326 -0
- data/Rakefile +35 -0
- data/generators/scaffold_resource/USAGE +29 -0
- data/generators/scaffold_resource/scaffold_resource_generator.rb +183 -0
- data/generators/scaffold_resource/templates/controller.rb +69 -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 +22 -0
- data/generators/scaffold_resource/templates/migration.rb +15 -0
- data/generators/scaffold_resource/templates/model.rb +60 -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 +2 -0
- data/generators/scaffold_resource/templates/view_edit.haml +11 -0
- data/generators/scaffold_resource/templates/view_index.erb +2 -0
- data/generators/scaffold_resource/templates/view_index.haml +19 -0
- data/generators/scaffold_resource/templates/view_new.erb +2 -0
- data/generators/scaffold_resource/templates/view_new.haml +9 -0
- data/generators/scaffold_resource/templates/view_partial_edit.html.erb +18 -0
- data/generators/scaffold_resource/templates/view_partial_index.html.erb +28 -0
- data/generators/scaffold_resource/templates/view_partial_new.html.erb +13 -0
- data/generators/scaffold_resource/templates/view_partial_show.html.erb +9 -0
- data/generators/scaffold_resource/templates/view_show.erb +2 -0
- data/generators/scaffold_resource/templates/view_show.haml +9 -0
- data/init.rb +1 -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/class_methods.rb +24 -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 +69 -0
- data/lib/resource_controller/helpers/internal.rb +76 -0
- data/lib/resource_controller/helpers/nested.rb +63 -0
- data/lib/resource_controller/helpers/singleton_customizations.rb +60 -0
- data/lib/resource_controller/helpers/urls.rb +128 -0
- data/lib/resource_controller/helpers.rb +28 -0
- data/lib/resource_controller/response_collector.rb +27 -0
- data/lib/resource_controller/singleton.rb +15 -0
- data/lib/resource_controller/version.rb +9 -0
- data/lib/resource_controller.rb +20 -0
- data/lib/urligence.rb +50 -0
- data/rails/init.rb +6 -0
- data/test/Rakefile +10 -0
- data/test/app/controllers/accounts_controller.rb +6 -0
- data/test/app/controllers/application.rb +7 -0
- data/test/app/controllers/cms/options_controller.rb +3 -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 +11 -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/photo.rb +4 -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/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/boot.rb +109 -0
- data/test/config/database.yml +13 -0
- data/test/config/environment.rb +64 -0
- data/test/config/environments/development.rb +21 -0
- data/test/config/environments/test.rb +19 -0
- data/test/config/routes.rb +58 -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/schema.rb +72 -0
- data/test/script/console +3 -0
- data/test/script/destroy +3 -0
- data/test/script/generate +3 -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/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 +23 -0
- data/test/test/functional/cms/products_controller_test.rb +23 -0
- data/test/test/functional/comments_controller_test.rb +26 -0
- data/test/test/functional/images_controller_test.rb +37 -0
- data/test/test/functional/people_controller_test.rb +34 -0
- data/test/test/functional/photos_controller_test.rb +130 -0
- data/test/test/functional/posts_controller_test.rb +34 -0
- data/test/test/functional/projects_controller_test.rb +18 -0
- data/test/test/functional/somethings_controller_test.rb +28 -0
- data/test/test/functional/tags_controller_test.rb +64 -0
- data/test/test/functional/users_controller_test.rb +24 -0
- data/test/test/test_helper.rb +12 -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 +203 -0
- data/test/vendor/plugins/shoulda/Rakefile +32 -0
- data/test/vendor/plugins/shoulda/bin/convert_to_should_syntax +40 -0
- data/test/vendor/plugins/shoulda/init.rb +3 -0
- data/test/vendor/plugins/shoulda/lib/shoulda/active_record_helpers.rb +580 -0
- data/test/vendor/plugins/shoulda/lib/shoulda/color.rb +77 -0
- data/test/vendor/plugins/shoulda/lib/shoulda/controller_tests/controller_tests.rb +467 -0
- data/test/vendor/plugins/shoulda/lib/shoulda/controller_tests/formats/html.rb +201 -0
- data/test/vendor/plugins/shoulda/lib/shoulda/controller_tests/formats/xml.rb +170 -0
- data/test/vendor/plugins/shoulda/lib/shoulda/gem/proc_extensions.rb +14 -0
- data/test/vendor/plugins/shoulda/lib/shoulda/gem/shoulda.rb +239 -0
- data/test/vendor/plugins/shoulda/lib/shoulda/general.rb +118 -0
- data/test/vendor/plugins/shoulda/lib/shoulda/private_helpers.rb +22 -0
- data/test/vendor/plugins/shoulda/lib/shoulda.rb +43 -0
- metadata +342 -0
@@ -0,0 +1,11 @@
|
|
1
|
+
%h1 Editing <%= singular_name %>
|
2
|
+
|
3
|
+
= error_messages_for :<%= singular_name %>
|
4
|
+
|
5
|
+
- form_for(:<%= singular_name %>, :url => object_url, :html => { :method => :put }) do |f|
|
6
|
+
= render :partial => "form", :locals => { :f => f }
|
7
|
+
%p= submit_tag "Update"
|
8
|
+
|
9
|
+
= link_to 'Show', object_url
|
10
|
+
|
|
11
|
+
= link_to 'Back', collection_url
|
@@ -0,0 +1,19 @@
|
|
1
|
+
%h1 Listing <%= plural_name %>
|
2
|
+
|
3
|
+
%table
|
4
|
+
%tr
|
5
|
+
<% for attribute in attributes -%>
|
6
|
+
%th <%= attribute.column.human_name %>
|
7
|
+
<% end -%>
|
8
|
+
- @<%= plural_name %>.each do |<%= singular_name %>|
|
9
|
+
%tr
|
10
|
+
<% for attribute in attributes -%>
|
11
|
+
%td= h <%= singular_name %>.<%= attribute.name %>
|
12
|
+
<% end -%>
|
13
|
+
%td= link_to 'Show', object_url(<%= singular_name %>)
|
14
|
+
%td= link_to 'Edit', edit_object_url(<%= singular_name %>)
|
15
|
+
%td= link_to 'Destroy', object_url(<%= singular_name %>), :confirm => 'Are you sure?', :method => :delete
|
16
|
+
|
17
|
+
%br/
|
18
|
+
|
19
|
+
=link_to 'New <%= singular_name %>', new_object_url
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<%% if @<%= singular_name %>.editable_by?(current_user) %>
|
2
|
+
<h1>Editing <%= singular_name.titleize %></h1>
|
3
|
+
|
4
|
+
<%%= error_messages_for :<%= singular_name %> %>
|
5
|
+
|
6
|
+
<%% form_for(:<%= singular_name %>, :url => object_url, :html => { :method => :put }) do |f| %>
|
7
|
+
<%%= render(:partial => "form", :locals => {:f => f}) %>
|
8
|
+
<p>
|
9
|
+
<%%=submit_tag "Update"%>
|
10
|
+
</p>
|
11
|
+
<%% end %>
|
12
|
+
|
13
|
+
<br/>
|
14
|
+
|
15
|
+
<%%= safe_show_link(@<%= singular_name %>) %>
|
16
|
+
<%% end %> |
|
17
|
+
<%%= link_to 'Back', collection_url %>
|
18
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<h1>Listing <%= plural_name.titleize %></h1>
|
2
|
+
|
3
|
+
<table>
|
4
|
+
<tr>
|
5
|
+
<% for attribute in attributes -%>
|
6
|
+
<th><%= attribute.column.human_name %></th>
|
7
|
+
<% end -%>
|
8
|
+
<th>Show</th>
|
9
|
+
<th>Edit</th>
|
10
|
+
<th>Delete</th>
|
11
|
+
</tr>
|
12
|
+
|
13
|
+
<%% for <%= singular_name %> in @viewable_<%= plural_name %> %>
|
14
|
+
<tr>
|
15
|
+
<% for attribute in attributes -%>
|
16
|
+
<td><%%= safe_field_value(<%= singular_name %>, "<%= attribute.name %>") %></td>
|
17
|
+
<% end -%>
|
18
|
+
<td><%%= safe_show_link(<%= singular_name %>) %></td>
|
19
|
+
<td><%%= safe_edit_link(<%= singular_name %>) %></td>
|
20
|
+
<td><%%= safe_delete_link(<%= singular_name %>) %></td>
|
21
|
+
</tr>
|
22
|
+
<%% end %>
|
23
|
+
</table>
|
24
|
+
<%%= will_paginate @viewable_<%= plural_name %> %>
|
25
|
+
<br />
|
26
|
+
|
27
|
+
<%%= safe_create_link %>
|
28
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<h1>New <%= singular_name.titleize %></h1>
|
2
|
+
|
3
|
+
<%%= error_messages_for :<%= singular_name %> %>
|
4
|
+
|
5
|
+
<%% form_for(:<%= singular_name %>, :url => collection_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', collection_url %>
|
13
|
+
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<% for attribute in attributes -%>
|
2
|
+
<p>
|
3
|
+
<strong><%= attribute.column.human_name %>:</strong><%%= safe_field_value(@<%= singular_name %>, "<%= attribute.name %>") %>
|
4
|
+
</p>
|
5
|
+
<% end -%>
|
6
|
+
|
7
|
+
<%%= safe_edit_link(@<%= singular_name %>) %> |
|
8
|
+
<%%= link_to 'Back', collection_url %>
|
9
|
+
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require File.dirname(__FILE__)+'/rails/init.rb'
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module ResourceController # :nodoc:
|
2
|
+
module Accessors # :nodoc:
|
3
|
+
private
|
4
|
+
def block_accessor(*accessors)
|
5
|
+
accessors.each do |block_accessor|
|
6
|
+
class_eval <<-"end_eval", __FILE__, __LINE__
|
7
|
+
|
8
|
+
def #{block_accessor}(*args, &block)
|
9
|
+
unless args.empty? && block.nil?
|
10
|
+
args.push block if block_given?
|
11
|
+
@#{block_accessor} = [args].flatten
|
12
|
+
end
|
13
|
+
|
14
|
+
@#{block_accessor}
|
15
|
+
end
|
16
|
+
|
17
|
+
end_eval
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def scoping_reader(*accessor_names)
|
22
|
+
accessor_names.each do |accessor_name|
|
23
|
+
class_eval <<-"end_eval", __FILE__, __LINE__
|
24
|
+
def #{accessor_name}(&block)
|
25
|
+
@#{accessor_name}.instance_eval &block if block_given?
|
26
|
+
@#{accessor_name}
|
27
|
+
end
|
28
|
+
end_eval
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def class_scoping_reader(accessor_name, start_value)
|
33
|
+
write_inheritable_attribute accessor_name, start_value
|
34
|
+
|
35
|
+
class_eval <<-"end_eval", __FILE__, __LINE__
|
36
|
+
def self.#{accessor_name}(&block)
|
37
|
+
read_inheritable_attribute(:#{accessor_name}).instance_eval(&block) if block_given?
|
38
|
+
read_inheritable_attribute(:#{accessor_name})
|
39
|
+
end
|
40
|
+
end_eval
|
41
|
+
end
|
42
|
+
|
43
|
+
def reader_writer(accessor_name)
|
44
|
+
class_eval <<-"end_eval", __FILE__, __LINE__
|
45
|
+
def #{accessor_name}(*args, &block)
|
46
|
+
args << block unless block.nil?
|
47
|
+
@#{accessor_name} = args.first unless args.empty?
|
48
|
+
@#{accessor_name}
|
49
|
+
end
|
50
|
+
end_eval
|
51
|
+
end
|
52
|
+
|
53
|
+
def class_reader_writer(*accessor_names)
|
54
|
+
accessor_names.each do |accessor_name|
|
55
|
+
class_eval <<-"end_eval", __FILE__, __LINE__
|
56
|
+
def self.#{accessor_name}(*args)
|
57
|
+
unless args.empty?
|
58
|
+
write_inheritable_attribute :#{accessor_name}, args.first if args.length == 1
|
59
|
+
write_inheritable_attribute :#{accessor_name}, args if args.length > 1
|
60
|
+
end
|
61
|
+
|
62
|
+
read_inheritable_attribute :#{accessor_name}
|
63
|
+
end
|
64
|
+
|
65
|
+
def #{accessor_name}(*args)
|
66
|
+
unless args.empty?
|
67
|
+
self.class.write_inheritable_attribute :#{accessor_name}, args.first if args.length == 1
|
68
|
+
self.class.write_inheritable_attribute :#{accessor_name}, args if args.length > 1
|
69
|
+
end
|
70
|
+
|
71
|
+
self.class.read_inheritable_attribute :#{accessor_name}
|
72
|
+
end
|
73
|
+
end_eval
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module ResourceController
|
2
|
+
class ActionOptions
|
3
|
+
extend ResourceController::Accessors
|
4
|
+
|
5
|
+
reader_writer :flash
|
6
|
+
reader_writer :flash_now
|
7
|
+
|
8
|
+
block_accessor :after, :before
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@collector = ResourceController::ResponseCollector.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def response(*args, &block)
|
15
|
+
if !args.empty? || block_given?
|
16
|
+
@collector.clear
|
17
|
+
args.flatten.each { |symbol| @collector.send(symbol) }
|
18
|
+
block.call(@collector) if block_given?
|
19
|
+
end
|
20
|
+
|
21
|
+
@collector.responses
|
22
|
+
end
|
23
|
+
alias_method :respond_to, :response
|
24
|
+
alias_method :responds_to, :response
|
25
|
+
|
26
|
+
def wants
|
27
|
+
@collector
|
28
|
+
end
|
29
|
+
|
30
|
+
def dup
|
31
|
+
returning self.class.new do |duplicate|
|
32
|
+
duplicate.instance_variable_set(:@collector, wants.dup)
|
33
|
+
duplicate.instance_variable_set(:@before, before.dup) unless before.nil?
|
34
|
+
duplicate.instance_variable_set(:@after, after.dup) unless after.nil?
|
35
|
+
duplicate.instance_variable_set(:@flash, flash.dup) unless flash.nil?
|
36
|
+
duplicate.instance_variable_set(:@flash_now, flash_now.dup) unless flash_now.nil?
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module ResourceController
|
2
|
+
module Actions
|
3
|
+
|
4
|
+
def index
|
5
|
+
load_collection
|
6
|
+
before :index
|
7
|
+
response_for :index
|
8
|
+
end
|
9
|
+
|
10
|
+
def show
|
11
|
+
load_object
|
12
|
+
before :show
|
13
|
+
response_for :show
|
14
|
+
rescue ActiveRecord::RecordNotFound
|
15
|
+
response_for :show_fails
|
16
|
+
end
|
17
|
+
|
18
|
+
def create
|
19
|
+
build_object
|
20
|
+
load_object
|
21
|
+
before :create
|
22
|
+
if object.save
|
23
|
+
after :create
|
24
|
+
set_flash :create
|
25
|
+
response_for :create
|
26
|
+
else
|
27
|
+
after :create_fails
|
28
|
+
set_flash :create_fails
|
29
|
+
response_for :create_fails
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def update
|
34
|
+
load_object
|
35
|
+
before :update
|
36
|
+
if object.update_attributes object_params
|
37
|
+
after :update
|
38
|
+
set_flash :update
|
39
|
+
response_for :update
|
40
|
+
else
|
41
|
+
after :update_fails
|
42
|
+
set_flash :update_fails
|
43
|
+
response_for :update_fails
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def new
|
48
|
+
build_object
|
49
|
+
load_object
|
50
|
+
before :new_action
|
51
|
+
response_for :new_action
|
52
|
+
end
|
53
|
+
|
54
|
+
def edit
|
55
|
+
load_object
|
56
|
+
before :edit
|
57
|
+
response_for :edit
|
58
|
+
end
|
59
|
+
|
60
|
+
def destroy
|
61
|
+
load_object
|
62
|
+
before :destroy
|
63
|
+
if object.destroy
|
64
|
+
after :destroy
|
65
|
+
set_flash :destroy
|
66
|
+
response_for :destroy
|
67
|
+
else
|
68
|
+
after :destroy_fails
|
69
|
+
set_flash :destroy_fails
|
70
|
+
response_for :destroy_fails
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module ResourceController
|
2
|
+
|
3
|
+
# == ResourceController::Base
|
4
|
+
#
|
5
|
+
# Inherit from this class to create your RESTful controller. See the README for usage.
|
6
|
+
#
|
7
|
+
class Base < ApplicationController
|
8
|
+
unloadable
|
9
|
+
|
10
|
+
def self.inherited(subclass)
|
11
|
+
super
|
12
|
+
subclass.class_eval { resource_controller }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module ResourceController
|
2
|
+
module ClassMethods
|
3
|
+
|
4
|
+
# Use this method in your controller to specify which actions you'd like it to respond to.
|
5
|
+
#
|
6
|
+
# class PostsController < ResourceController::Base
|
7
|
+
# actions :all, :except => :create
|
8
|
+
# end
|
9
|
+
def actions(*opts)
|
10
|
+
config = {}
|
11
|
+
config.merge!(opts.pop) if opts.last.is_a?(Hash)
|
12
|
+
|
13
|
+
all_actions = (singleton? ? ResourceController::SINGLETON_ACTIONS : ResourceController::ACTIONS) - [:new_action] + [:new]
|
14
|
+
|
15
|
+
actions_to_remove = []
|
16
|
+
actions_to_remove += all_actions - opts unless opts.first == :all
|
17
|
+
actions_to_remove += [*config[:except]] if config[:except]
|
18
|
+
actions_to_remove.uniq!
|
19
|
+
|
20
|
+
actions_to_remove.each { |action| undef_method(action)}
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module ResourceController
|
2
|
+
module Controller
|
3
|
+
def self.included(subclass)
|
4
|
+
subclass.class_eval do
|
5
|
+
include ResourceController::Helpers
|
6
|
+
include ResourceController::Actions
|
7
|
+
extend ResourceController::Accessors
|
8
|
+
extend ResourceController::ClassMethods
|
9
|
+
|
10
|
+
class_reader_writer :belongs_to, *NAME_ACCESSORS
|
11
|
+
NAME_ACCESSORS.each { |accessor| send(accessor, controller_name.singularize.underscore) }
|
12
|
+
|
13
|
+
ACTIONS.each do |action|
|
14
|
+
class_scoping_reader action, FAILABLE_ACTIONS.include?(action) ? FailableActionOptions.new : ActionOptions.new
|
15
|
+
end
|
16
|
+
|
17
|
+
self.helper_method :object_url, :edit_object_url, :new_object_url, :collection_url, :object, :collection,
|
18
|
+
:parent, :parent_type, :parent_object, :parent_model, :model_name, :model, :object_path,
|
19
|
+
:edit_object_path, :new_object_path, :collection_path, :hash_for_collection_path, :hash_for_object_path,
|
20
|
+
:hash_for_edit_object_path, :hash_for_new_object_path, :hash_for_collection_url,
|
21
|
+
:hash_for_object_url, :hash_for_edit_object_url, :hash_for_new_object_url, :parent?,
|
22
|
+
:collection_url_options, :object_url_options, :new_object_url_options
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
init_default_actions(subclass)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
def self.init_default_actions(klass)
|
31
|
+
klass.class_eval do
|
32
|
+
index.wants.html
|
33
|
+
edit.wants.html
|
34
|
+
new_action.wants.html
|
35
|
+
|
36
|
+
show do
|
37
|
+
wants.html
|
38
|
+
|
39
|
+
failure.wants.html { render :text => "Member object not found." }
|
40
|
+
end
|
41
|
+
|
42
|
+
create do
|
43
|
+
flash "Successfully created!"
|
44
|
+
wants.html { redirect_to object_url }
|
45
|
+
|
46
|
+
failure.wants.html { render :action => "new" }
|
47
|
+
end
|
48
|
+
|
49
|
+
update do
|
50
|
+
flash "Successfully updated!"
|
51
|
+
wants.html { redirect_to object_url }
|
52
|
+
|
53
|
+
failure.wants.html { render :action => "edit" }
|
54
|
+
end
|
55
|
+
|
56
|
+
destroy do
|
57
|
+
flash "Successfully removed!"
|
58
|
+
wants.html { redirect_to collection_url }
|
59
|
+
end
|
60
|
+
|
61
|
+
class << self
|
62
|
+
def singleton?
|
63
|
+
false
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module ResourceController
|
2
|
+
class FailableActionOptions
|
3
|
+
extend ResourceController::Accessors
|
4
|
+
|
5
|
+
scoping_reader :success, :fails
|
6
|
+
alias_method :failure, :fails
|
7
|
+
|
8
|
+
block_accessor :before
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@success = ActionOptions.new
|
12
|
+
@fails = ActionOptions.new
|
13
|
+
end
|
14
|
+
|
15
|
+
delegate :flash, :flash_now, :after, :response, :wants, :to => :success
|
16
|
+
|
17
|
+
def dup
|
18
|
+
returning self.class.new do |duplicate|
|
19
|
+
duplicate.instance_variable_set(:@success, success.dup)
|
20
|
+
duplicate.instance_variable_set(:@fails, fails.dup)
|
21
|
+
duplicate.instance_variable_set(:@before, before.dup) unless before.nil?
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module ResourceController::Helpers::CurrentObjects
|
2
|
+
protected
|
3
|
+
# Used internally to return the model for your resource.
|
4
|
+
#
|
5
|
+
def model
|
6
|
+
model_name.to_s.camelize.constantize
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
# Used to fetch the collection for the index method
|
11
|
+
#
|
12
|
+
# In order to customize the way the collection is fetched, to add something like pagination, for example, override this method.
|
13
|
+
#
|
14
|
+
def collection
|
15
|
+
end_of_association_chain.find(:all)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Returns the current param.
|
19
|
+
#
|
20
|
+
# Defaults to params[:id].
|
21
|
+
#
|
22
|
+
# Override this method if you'd like to use an alternate param name.
|
23
|
+
#
|
24
|
+
def param
|
25
|
+
params[:id]
|
26
|
+
end
|
27
|
+
|
28
|
+
# Used to fetch the current member object in all of the singular methods that operate on an existing member.
|
29
|
+
#
|
30
|
+
# Override this method if you'd like to fetch your objects in some alternate way, like using a permalink.
|
31
|
+
#
|
32
|
+
# class PostsController < ResourceController::Base
|
33
|
+
# private
|
34
|
+
# def object
|
35
|
+
# @object ||= end_of_association_chain.find_by_permalink(param)
|
36
|
+
# end
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
def object
|
40
|
+
@object ||= end_of_association_chain.find(param) unless param.nil?
|
41
|
+
@object
|
42
|
+
end
|
43
|
+
|
44
|
+
# Used internally to load the member object in to an instance variable @#{model_name} (i.e. @post)
|
45
|
+
#
|
46
|
+
def load_object
|
47
|
+
instance_variable_set "@#{parent_type}", parent_object if parent?
|
48
|
+
instance_variable_set "@#{object_name}", object
|
49
|
+
end
|
50
|
+
|
51
|
+
# Used internally to load the collection in to an instance variable @#{model_name.pluralize} (i.e. @posts)
|
52
|
+
#
|
53
|
+
def load_collection
|
54
|
+
instance_variable_set "@#{parent_type}", parent_object if parent?
|
55
|
+
instance_variable_set "@#{object_name.to_s.pluralize}", collection
|
56
|
+
end
|
57
|
+
|
58
|
+
# Returns the form params. Defaults to params[model_name] (i.e. params["post"])
|
59
|
+
#
|
60
|
+
def object_params
|
61
|
+
params["#{object_name}"]
|
62
|
+
end
|
63
|
+
|
64
|
+
# Builds the object, but doesn't save it, during the new, and create action.
|
65
|
+
#
|
66
|
+
def build_object
|
67
|
+
@object ||= end_of_association_chain.send parent? ? :build : :new, object_params
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# Internal action lifecycle management.
|
2
|
+
#
|
3
|
+
# All of these methods are used internally to execute the options, set by the user in ActionOptions and FailableActionOptions
|
4
|
+
#
|
5
|
+
module ResourceController::Helpers::Internal
|
6
|
+
protected
|
7
|
+
# Used to actually pass the responses along to the controller's respond_to method.
|
8
|
+
#
|
9
|
+
def response_for(action)
|
10
|
+
respond_to do |wants|
|
11
|
+
options_for(action).response.each do |method, block|
|
12
|
+
if block.nil?
|
13
|
+
wants.send(method)
|
14
|
+
else
|
15
|
+
wants.send(method) { instance_eval(&block) }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Calls the after callbacks for the action, if one is present.
|
22
|
+
#
|
23
|
+
def after(action)
|
24
|
+
invoke_callbacks *options_for(action).after
|
25
|
+
end
|
26
|
+
|
27
|
+
# Calls the before block for the action, if one is present.
|
28
|
+
#
|
29
|
+
def before(action)
|
30
|
+
invoke_callbacks *self.class.send(action).before
|
31
|
+
end
|
32
|
+
|
33
|
+
# Sets the flash and flash_now for the action, if it is present.
|
34
|
+
#
|
35
|
+
def set_flash(action)
|
36
|
+
set_normal_flash(action)
|
37
|
+
set_flash_now(action)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Sets the regular flash (i.e. flash[:notice] = '...')
|
41
|
+
#
|
42
|
+
def set_normal_flash(action)
|
43
|
+
if f = options_for(action).flash
|
44
|
+
flash[:notice] = f.is_a?(Proc) ? instance_eval(&f) : options_for(action).flash
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Sets the flash.now (i.e. flash.now[:notice] = '...')
|
49
|
+
#
|
50
|
+
def set_flash_now(action)
|
51
|
+
if f = options_for(action).flash_now
|
52
|
+
flash.now[:notice] = f.is_a?(Proc) ? instance_eval(&f) : options_for(action).flash_now
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Returns the options for an action, which is a symbol.
|
57
|
+
#
|
58
|
+
# Manages splitting things like :create_fails.
|
59
|
+
#
|
60
|
+
def options_for(action)
|
61
|
+
action = action == :new_action ? [action] : "#{action}".split('_').map(&:to_sym)
|
62
|
+
options = self.class.send(action.first)
|
63
|
+
options = options.send(action.last == :fails ? :fails : :success) if ResourceController::FAILABLE_ACTIONS.include? action.first
|
64
|
+
|
65
|
+
options
|
66
|
+
end
|
67
|
+
|
68
|
+
def invoke_callbacks(*callbacks)
|
69
|
+
unless callbacks.empty?
|
70
|
+
callbacks.select { |callback| callback.is_a? Symbol }.each { |symbol| send(symbol) }
|
71
|
+
|
72
|
+
block = callbacks.detect { |callback| callback.is_a? Proc }
|
73
|
+
instance_eval &block unless block.nil?
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|