nileshtrivedi-safe_resource 0.5.3
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 +314 -0
- data/Rakefile +22 -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 +68 -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 +7 -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 +16 -0
- data/generators/scaffold_resource/templates/view_partial_index.html.erb +28 -0
- data/generators/scaffold_resource/templates/view_partial_new.html.erb +11 -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.rb +20 -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.rb +28 -0
- data/lib/resource_controller/helpers/current_objects.rb +73 -0
- data/lib/resource_controller/helpers/internal.rb +80 -0
- data/lib/resource_controller/helpers/nested.rb +67 -0
- data/lib/resource_controller/helpers/singleton_customizations.rb +64 -0
- data/lib/resource_controller/helpers/urls.rb +132 -0
- data/lib/resource_controller/response_collector.rb +27 -0
- data/lib/resource_controller/singleton.rb +15 -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 +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/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/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 +9 -0
- data/test/config/environment.rb +47 -0
- data/test/config/environments/development.rb +20 -0
- data/test/config/environments/test.rb +19 -0
- data/test/config/routes.rb +61 -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 +78 -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.rb +43 -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
- metadata +341 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
class <%= controller_class_name %>Controller < ResourceController::Base
|
|
2
|
+
before_filter :has_edit_permission, :only => [:edit]
|
|
3
|
+
before_filter :has_update_permission, :only => [:update]
|
|
4
|
+
before_filter :has_create_permission, :only => [:new, :create]
|
|
5
|
+
before_filter :has_view_permission, :only => [:show]
|
|
6
|
+
before_filter :has_delete_permission, :only => [:destroy]
|
|
7
|
+
before_filter :select_viewable_objects, :only => [:index]
|
|
8
|
+
|
|
9
|
+
private
|
|
10
|
+
|
|
11
|
+
def select_viewable_objects
|
|
12
|
+
#TODO: instead of Article.all, this should be chain.articles || Article.all as the case is
|
|
13
|
+
@viewable_<%= plural_name %> = end_of_association_chain.find(:all).select {|v| (v.viewable_by?(current_user, "id")) }
|
|
14
|
+
@viewable_<%= plural_name %> = @viewable_<%= plural_name %>.paginate(:page => params[:page], :per_page => 4)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def has_edit_permission
|
|
18
|
+
#TODO: infer permissions from updatable_by? whether to display the field for a given attribute or not
|
|
19
|
+
load_object
|
|
20
|
+
if(!@<%= singular_name %>.editable_by?(current_user))
|
|
21
|
+
flash[:notice] = "Permision denied."
|
|
22
|
+
redirect_to collection_url
|
|
23
|
+
return false
|
|
24
|
+
end
|
|
25
|
+
true
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def has_create_permission
|
|
29
|
+
build_object
|
|
30
|
+
load_object
|
|
31
|
+
if(!@<%= singular_name %>.creatable_by?(current_user))
|
|
32
|
+
flash[:notice] = "Permision denied."
|
|
33
|
+
redirect_to collection_url
|
|
34
|
+
return
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def has_view_permission
|
|
39
|
+
load_object
|
|
40
|
+
if(!@<%= singular_name %>.viewable_by?(current_user,"id"))
|
|
41
|
+
flash[:notice] = "Permision denied."
|
|
42
|
+
redirect_to collection_url
|
|
43
|
+
return
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def has_delete_permission
|
|
48
|
+
load_object
|
|
49
|
+
if(!@<%= singular_name %>.deletable_by?(current_user))
|
|
50
|
+
flash[:notice] = "Permision denied."
|
|
51
|
+
redirect_to collection_url
|
|
52
|
+
return
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def has_update_permission
|
|
57
|
+
load_object
|
|
58
|
+
#update attributes without saving to db so that we can call updatable_by?
|
|
59
|
+
#TODO: r_c will call update_attributes again even though simple save would be sufficient after the following line
|
|
60
|
+
@<%= singular_name %>.attributes = params[:article]
|
|
61
|
+
if(!@<%= singular_name %>.updatable_by?(current_user,@<%= singular_name %>))
|
|
62
|
+
flash[:notice] = "Permision denied."
|
|
63
|
+
redirect_to collection_url
|
|
64
|
+
return
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '<%= '/..' * controller_class_nesting_depth %>/../test_helper'
|
|
2
|
+
require '<%= controller_file_path %>_controller'
|
|
3
|
+
|
|
4
|
+
# Re-raise errors caught by the controller.
|
|
5
|
+
class <%= controller_class_name %>Controller; def rescue_action(e) raise e end; end
|
|
6
|
+
|
|
7
|
+
class <%= controller_class_name %>ControllerTest < Test::Unit::TestCase
|
|
8
|
+
fixtures :<%= table_name %>
|
|
9
|
+
|
|
10
|
+
def setup
|
|
11
|
+
@controller = <%= controller_class_name %>Controller.new
|
|
12
|
+
@request = ActionController::TestRequest.new
|
|
13
|
+
@response = ActionController::TestResponse.new
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_should_get_index
|
|
17
|
+
get :index
|
|
18
|
+
assert_response :success
|
|
19
|
+
assert assigns(:<%= table_name %>)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_should_get_new
|
|
23
|
+
get :new
|
|
24
|
+
assert_response :success
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test_should_create_<%= file_name %>
|
|
28
|
+
old_count = <%= class_name %>.count
|
|
29
|
+
post :create, :<%= file_name %> => { }
|
|
30
|
+
assert_equal old_count+1, <%= class_name %>.count
|
|
31
|
+
|
|
32
|
+
assert_redirected_to <%= file_name %>_path(assigns(:<%= file_name %>))
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_should_show_<%= file_name %>
|
|
36
|
+
get :show, :id => 1
|
|
37
|
+
assert_response :success
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def test_should_get_edit
|
|
41
|
+
get :edit, :id => 1
|
|
42
|
+
assert_response :success
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def test_should_update_<%= file_name %>
|
|
46
|
+
put :update, :id => 1, :<%= file_name %> => { }
|
|
47
|
+
assert_redirected_to <%= file_name %>_path(assigns(:<%= file_name %>))
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def test_should_destroy_<%= file_name %>
|
|
51
|
+
old_count = <%= class_name %>.count
|
|
52
|
+
delete :destroy, :id => 1
|
|
53
|
+
assert_equal old_count-1, <%= class_name %>.count
|
|
54
|
+
|
|
55
|
+
assert_redirected_to <%= table_name %>_path
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module <%= controller_class_name %>Helper
|
|
2
|
+
def safe_create_link
|
|
3
|
+
return link_to('New <%= singular_name.titleize %>', new_object_url) if <%= class_name %>.new.creatable_by?(current_user)
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def safe_show_link(<%= singular_name %>)
|
|
7
|
+
return link_to('Show', object_url(<%= singular_name %>)) if <%= singular_name %>.viewable_by?(current_user,"id")
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def safe_edit_link(<%= singular_name %>)
|
|
11
|
+
return link_to('Edit', edit_object_url(<%= singular_name %>)) if <%= singular_name %>.editable_by?(current_user)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def safe_delete_link(<%= singular_name %>)
|
|
15
|
+
return link_to('Delete', object_url(<%= singular_name %>), :confirm => 'Are you sure?', :method => :delete) if <%= singular_name %>.deletable_by?(current_user)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def safe_field_value(<%= singular_name %>, field)
|
|
19
|
+
return h(<%= singular_name %>.read_attribute(field)) if <%= singular_name %>.viewable_by?(current_user,field)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
class <%= migration_name %> < ActiveRecord::Migration
|
|
2
|
+
def self.up
|
|
3
|
+
create_table :<%= table_name %>, :force => true do |t|
|
|
4
|
+
<% for attribute in attributes -%>
|
|
5
|
+
t.<%= attribute.type %> :<%= attribute.name %>
|
|
6
|
+
<% end -%>
|
|
7
|
+
|
|
8
|
+
t.timestamps
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.down
|
|
13
|
+
drop_table :<%= table_name %>
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
class <%= class_name %> < ActiveRecord::Base
|
|
2
|
+
|
|
3
|
+
<% for attribute in attributes -%>
|
|
4
|
+
validates_presence_of :<%= attribute.name %>
|
|
5
|
+
<% end -%>
|
|
6
|
+
|
|
7
|
+
attr_accessible #Enable mass assignment for allowed fields manually in order to avoid security issues
|
|
8
|
+
|
|
9
|
+
# --- Hobo Permissions --- #
|
|
10
|
+
|
|
11
|
+
def creatable_by?(creator)
|
|
12
|
+
true
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def updatable_by?(updater, new)
|
|
16
|
+
true
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def deletable_by?(deleter)
|
|
20
|
+
true
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def viewable_by?(viewer, field)
|
|
24
|
+
true
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def editable_by?(editor)
|
|
28
|
+
#whether the edit link should be made visible to 'editor' user
|
|
29
|
+
#this is different from updatable_by? because user may have the permission to change some of the fields.
|
|
30
|
+
#TODO: investigate how Hobo determines whether to show edit link or not -> Hobo fakes an edit to use updatable_by? by setting the field to 'Hobo:Undefined'
|
|
31
|
+
true
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def same_fields?(other, *fields)
|
|
35
|
+
return true if other.nil?
|
|
36
|
+
|
|
37
|
+
fields = fields.flatten
|
|
38
|
+
fields.all?{|f| self.send(f) == other.send(f)}
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def only_changed_fields?(other, *changed_fields)
|
|
43
|
+
return true if other.nil?
|
|
44
|
+
|
|
45
|
+
changed_fields = changed_fields.flatten.*.to_s
|
|
46
|
+
all_cols = self.class.columns.*.name - []
|
|
47
|
+
all_cols.all?{|c| c.in?(changed_fields) || self.send(c) == other.send(c) }
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
protected
|
|
51
|
+
def validate
|
|
52
|
+
<% for attribute in attributes.select {|v| (v.name =~ /email$/ )} -%>
|
|
53
|
+
errors.add(:<%= attribute.name %>, "is not valid (use abc@abc.com)") unless <%= attribute.name %> =~ /\A([-a-z0-9]+[\w\.\-\+]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
|
|
54
|
+
<% end -%>
|
|
55
|
+
|
|
56
|
+
<% for attribute in attributes.select {|v| (v.name =~ /(website|url)$/ )} -%>
|
|
57
|
+
errors.add(:<%= attribute.name %>, "is not valid (use http://www.abc.com)") unless <%= attribute.name %> =~ /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix
|
|
58
|
+
<% end -%>
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
class <%= migration_name %> < ActiveRecord::Migration
|
|
2
|
+
def self.up
|
|
3
|
+
create_table :<%= table_name %>, :force => true do |t|
|
|
4
|
+
<% for attribute in attributes -%>
|
|
5
|
+
t.column :<%= attribute.name %>, :<%= attribute.type %>
|
|
6
|
+
<% end -%>
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.down
|
|
11
|
+
drop_table :<%= table_name %>
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * controller_class_nesting_depth %>/../spec_helper')
|
|
2
|
+
|
|
3
|
+
describe <%= controller_class_name %>Controller do
|
|
4
|
+
describe "handling GET /<%= table_name %>" do
|
|
5
|
+
|
|
6
|
+
before(:each) do
|
|
7
|
+
@<%= file_name %> = mock_model(<%= controller_class_name.singularize %>)
|
|
8
|
+
<%= controller_class_name.singularize %>.stub!(:find).and_return([@<%= file_name %>])
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def do_get
|
|
12
|
+
get :index
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "should be successful" do
|
|
16
|
+
do_get
|
|
17
|
+
response.should be_success
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "should render index template" do
|
|
21
|
+
do_get
|
|
22
|
+
response.should render_template('index')
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "should find all <%= table_name %>" do
|
|
26
|
+
<%= controller_class_name.singularize %>.should_receive(:find).with(:all).and_return([@<%= file_name %>])
|
|
27
|
+
do_get
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "should assign the found <%= table_name %> for the view" do
|
|
31
|
+
do_get
|
|
32
|
+
assigns[:<%= table_name %>].should == [@<%= file_name %>]
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
describe "handling GET /<%= table_name %>/1" do
|
|
37
|
+
|
|
38
|
+
before(:each) do
|
|
39
|
+
@<%= file_name %> = mock_model(<%= controller_class_name.singularize %>)
|
|
40
|
+
<%= controller_class_name.singularize %>.stub!(:find).and_return(@<%= file_name %>)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def do_get
|
|
44
|
+
get :show, :id => "1"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "should be successful" do
|
|
48
|
+
do_get
|
|
49
|
+
response.should be_success
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "should render show template" do
|
|
53
|
+
do_get
|
|
54
|
+
response.should render_template('show')
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "should find the <%= file_name %> requested" do
|
|
58
|
+
<%= controller_class_name.singularize %>.should_receive(:find).with("1").and_return(@<%= file_name %>)
|
|
59
|
+
do_get
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "should assign the found <%= file_name %> for the view" do
|
|
63
|
+
do_get
|
|
64
|
+
assigns[:<%= file_name %>].should equal(@<%= file_name %>)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
describe "handling GET /<%= table_name %>/new" do
|
|
69
|
+
|
|
70
|
+
before(:each) do
|
|
71
|
+
@<%= file_name %> = mock_model(<%= controller_class_name.singularize %>)
|
|
72
|
+
<%= controller_class_name.singularize %>.stub!(:new).and_return(@<%= file_name %>)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def do_get
|
|
76
|
+
get :new
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "should be successful" do
|
|
80
|
+
do_get
|
|
81
|
+
response.should be_success
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "should render new template" do
|
|
85
|
+
do_get
|
|
86
|
+
response.should render_template('new')
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "should create an new <%= file_name %>" do
|
|
90
|
+
<%= controller_class_name.singularize %>.should_receive(:new).and_return(@<%= file_name %>)
|
|
91
|
+
do_get
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it "should not save the new <%= file_name %>" do
|
|
95
|
+
@<%= file_name %>.should_not_receive(:save)
|
|
96
|
+
do_get
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it "should assign the new <%= file_name %> for the view" do
|
|
100
|
+
do_get
|
|
101
|
+
assigns[:<%= file_name %>].should equal(@<%= file_name %>)
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
describe "handling GET /<%= table_name %>/1/edit" do
|
|
106
|
+
|
|
107
|
+
before(:each) do
|
|
108
|
+
@<%= file_name %> = mock_model(<%= controller_class_name.singularize %>)
|
|
109
|
+
<%= controller_class_name.singularize %>.stub!(:find).and_return(@<%= file_name %>)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def do_get
|
|
113
|
+
get :edit, :id => "1"
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it "should be successful" do
|
|
117
|
+
do_get
|
|
118
|
+
response.should be_success
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
it "should render edit template" do
|
|
122
|
+
do_get
|
|
123
|
+
response.should render_template('edit')
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
it "should find the <%= file_name %> requested" do
|
|
127
|
+
<%= controller_class_name.singularize %>.should_receive(:find).and_return(@<%= file_name %>)
|
|
128
|
+
do_get
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it "should assign the found <%= controller_class_name %> for the view" do
|
|
132
|
+
do_get
|
|
133
|
+
assigns[:<%= file_name %>].should equal(@<%= file_name %>)
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
describe "handling POST /<%= table_name %>" do
|
|
138
|
+
|
|
139
|
+
before(:each) do
|
|
140
|
+
@<%= file_name %> = mock_model(<%= controller_class_name.singularize %>, :to_param => "1")
|
|
141
|
+
<%= controller_class_name.singularize %>.stub!(:new).and_return(@<%= file_name %>)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
describe "with successful save" do
|
|
145
|
+
|
|
146
|
+
def do_post
|
|
147
|
+
@<%= file_name %>.should_receive(:save).and_return(true)
|
|
148
|
+
post :create, :<%= file_name %> => {}
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
it "should create a new <%= file_name %>" do
|
|
152
|
+
<%= controller_class_name.singularize %>.should_receive(:new).with({}).and_return(@<%= file_name %>)
|
|
153
|
+
do_post
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
it "should redirect to the new <%= file_name %>" do
|
|
157
|
+
do_post
|
|
158
|
+
response.should redirect_to(<%= table_name.singularize %>_url("1"))
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
describe "with failed save" do
|
|
164
|
+
|
|
165
|
+
def do_post
|
|
166
|
+
@<%= file_name %>.should_receive(:save).and_return(false)
|
|
167
|
+
post :create, :<%= file_name %> => {}
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
it "should re-render 'new'" do
|
|
171
|
+
do_post
|
|
172
|
+
response.should render_template('new')
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
describe "handling PUT /<%= table_name %>/1" do
|
|
179
|
+
|
|
180
|
+
before(:each) do
|
|
181
|
+
@<%= file_name %> = mock_model(<%= controller_class_name.singularize %>, :to_param => "1")
|
|
182
|
+
<%= controller_class_name.singularize %>.stub!(:find).and_return(@<%= file_name %>)
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
describe "with successful update" do
|
|
186
|
+
|
|
187
|
+
def do_put
|
|
188
|
+
@<%= file_name %>.should_receive(:update_attributes).and_return(true)
|
|
189
|
+
put :update, :id => "1"
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
it "should find the <%= file_name %> requested" do
|
|
193
|
+
<%= controller_class_name.singularize %>.should_receive(:find).with("1").and_return(@<%= file_name %>)
|
|
194
|
+
do_put
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
it "should update the found <%= file_name %>" do
|
|
198
|
+
do_put
|
|
199
|
+
assigns(:<%= file_name %>).should equal(@<%= file_name %>)
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
it "should assign the found <%= file_name %> for the view" do
|
|
203
|
+
do_put
|
|
204
|
+
assigns(:<%= file_name %>).should equal(@<%= file_name %>)
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
it "should redirect to the <%= file_name %>" do
|
|
208
|
+
do_put
|
|
209
|
+
response.should redirect_to(<%= table_name.singularize %>_url("1"))
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
describe "with failed update" do
|
|
215
|
+
|
|
216
|
+
def do_put
|
|
217
|
+
@<%= file_name %>.should_receive(:update_attributes).and_return(false)
|
|
218
|
+
put :update, :id => "1"
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
it "should re-render 'edit'" do
|
|
222
|
+
do_put
|
|
223
|
+
response.should render_template('edit')
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
describe "handling DELETE /<%= table_name %>/1" do
|
|
230
|
+
|
|
231
|
+
before(:each) do
|
|
232
|
+
@<%= file_name %> = mock_model(<%= controller_class_name.singularize %>, :destroy => true)
|
|
233
|
+
<%= controller_class_name.singularize %>.stub!(:find).and_return(@<%= file_name %>)
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
def do_delete
|
|
237
|
+
delete :destroy, :id => "1"
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
it "should find the <%= file_name %> requested" do
|
|
241
|
+
<%= controller_class_name.singularize %>.should_receive(:find).with("1").and_return(@<%= file_name %>)
|
|
242
|
+
do_delete
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
it "should call destroy on the found <%= file_name %>" do
|
|
246
|
+
@<%= file_name %>.should_receive(:destroy).and_return(true)
|
|
247
|
+
do_delete
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
it "should redirect to the <%= table_name %> list" do
|
|
251
|
+
do_delete
|
|
252
|
+
response.should redirect_to(<%= table_name %>_url)
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
end
|