robert-shoulda 2.10.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.
Files changed (169) hide show
  1. data/CONTRIBUTION_GUIDELINES.rdoc +10 -0
  2. data/MIT-LICENSE +22 -0
  3. data/README.rdoc +171 -0
  4. data/Rakefile +72 -0
  5. data/bin/convert_to_should_syntax +42 -0
  6. data/lib/shoulda/action_controller/macros.rb +240 -0
  7. data/lib/shoulda/action_controller/matchers/assign_to_matcher.rb +109 -0
  8. data/lib/shoulda/action_controller/matchers/filter_param_matcher.rb +57 -0
  9. data/lib/shoulda/action_controller/matchers/render_with_layout_matcher.rb +81 -0
  10. data/lib/shoulda/action_controller/matchers/respond_with_content_type_matcher.rb +74 -0
  11. data/lib/shoulda/action_controller/matchers/respond_with_matcher.rb +81 -0
  12. data/lib/shoulda/action_controller/matchers/route_matcher.rb +93 -0
  13. data/lib/shoulda/action_controller/matchers/set_session_matcher.rb +87 -0
  14. data/lib/shoulda/action_controller/matchers/set_the_flash_matcher.rb +85 -0
  15. data/lib/shoulda/action_controller/matchers.rb +37 -0
  16. data/lib/shoulda/action_controller.rb +26 -0
  17. data/lib/shoulda/action_mailer/assertions.rb +38 -0
  18. data/lib/shoulda/action_mailer.rb +10 -0
  19. data/lib/shoulda/action_view/macros.rb +61 -0
  20. data/lib/shoulda/action_view.rb +10 -0
  21. data/lib/shoulda/active_record/assertions.rb +69 -0
  22. data/lib/shoulda/active_record/helpers.rb +27 -0
  23. data/lib/shoulda/active_record/macros.rb +571 -0
  24. data/lib/shoulda/active_record/matchers/allow_mass_assignment_of_matcher.rb +83 -0
  25. data/lib/shoulda/active_record/matchers/allow_value_matcher.rb +102 -0
  26. data/lib/shoulda/active_record/matchers/association_matcher.rb +226 -0
  27. data/lib/shoulda/active_record/matchers/ensure_inclusion_of_matcher.rb +87 -0
  28. data/lib/shoulda/active_record/matchers/ensure_length_of_matcher.rb +141 -0
  29. data/lib/shoulda/active_record/matchers/have_db_column_matcher.rb +169 -0
  30. data/lib/shoulda/active_record/matchers/have_db_index_matcher.rb +112 -0
  31. data/lib/shoulda/active_record/matchers/have_named_scope_matcher.rb +128 -0
  32. data/lib/shoulda/active_record/matchers/have_readonly_attribute_matcher.rb +59 -0
  33. data/lib/shoulda/active_record/matchers/validate_acceptance_of_matcher.rb +41 -0
  34. data/lib/shoulda/active_record/matchers/validate_format_of_matcher.rb +67 -0
  35. data/lib/shoulda/active_record/matchers/validate_numericality_of_matcher.rb +39 -0
  36. data/lib/shoulda/active_record/matchers/validate_presence_of_matcher.rb +60 -0
  37. data/lib/shoulda/active_record/matchers/validate_uniqueness_of_matcher.rb +148 -0
  38. data/lib/shoulda/active_record/matchers/validation_matcher.rb +57 -0
  39. data/lib/shoulda/active_record/matchers.rb +43 -0
  40. data/lib/shoulda/active_record.rb +16 -0
  41. data/lib/shoulda/assertions.rb +71 -0
  42. data/lib/shoulda/autoload_macros.rb +46 -0
  43. data/lib/shoulda/context.rb +413 -0
  44. data/lib/shoulda/helpers.rb +8 -0
  45. data/lib/shoulda/macros.rb +133 -0
  46. data/lib/shoulda/private_helpers.rb +13 -0
  47. data/lib/shoulda/proc_extensions.rb +14 -0
  48. data/lib/shoulda/rails.rb +13 -0
  49. data/lib/shoulda/rspec.rb +11 -0
  50. data/lib/shoulda/tasks/list_tests.rake +29 -0
  51. data/lib/shoulda/tasks/yaml_to_shoulda.rake +28 -0
  52. data/lib/shoulda/tasks.rb +3 -0
  53. data/lib/shoulda/test_unit.rb +22 -0
  54. data/lib/shoulda.rb +9 -0
  55. data/rails/init.rb +7 -0
  56. data/test/README +36 -0
  57. data/test/fail_macros.rb +39 -0
  58. data/test/fixtures/addresses.yml +3 -0
  59. data/test/fixtures/friendships.yml +0 -0
  60. data/test/fixtures/posts.yml +5 -0
  61. data/test/fixtures/products.yml +0 -0
  62. data/test/fixtures/taggings.yml +0 -0
  63. data/test/fixtures/tags.yml +9 -0
  64. data/test/fixtures/users.yml +6 -0
  65. data/test/functional/posts_controller_test.rb +121 -0
  66. data/test/functional/users_controller_test.rb +19 -0
  67. data/test/matchers/active_record/allow_mass_assignment_of_matcher_test.rb +68 -0
  68. data/test/matchers/active_record/allow_value_matcher_test.rb +64 -0
  69. data/test/matchers/active_record/association_matcher_test.rb +263 -0
  70. data/test/matchers/active_record/ensure_inclusion_of_matcher_test.rb +80 -0
  71. data/test/matchers/active_record/ensure_length_of_matcher_test.rb +158 -0
  72. data/test/matchers/active_record/have_db_column_matcher_test.rb +169 -0
  73. data/test/matchers/active_record/have_db_index_matcher_test.rb +91 -0
  74. data/test/matchers/active_record/have_named_scope_matcher_test.rb +65 -0
  75. data/test/matchers/active_record/have_readonly_attributes_matcher_test.rb +29 -0
  76. data/test/matchers/active_record/validate_acceptance_of_matcher_test.rb +44 -0
  77. data/test/matchers/active_record/validate_format_of_matcher_test.rb +39 -0
  78. data/test/matchers/active_record/validate_numericality_of_matcher_test.rb +52 -0
  79. data/test/matchers/active_record/validate_presence_of_matcher_test.rb +86 -0
  80. data/test/matchers/active_record/validate_uniqueness_of_matcher_test.rb +147 -0
  81. data/test/matchers/controller/assign_to_matcher_test.rb +35 -0
  82. data/test/matchers/controller/filter_param_matcher_test.rb +32 -0
  83. data/test/matchers/controller/render_with_layout_matcher_test.rb +33 -0
  84. data/test/matchers/controller/respond_with_content_type_matcher_test.rb +32 -0
  85. data/test/matchers/controller/respond_with_matcher_test.rb +106 -0
  86. data/test/matchers/controller/route_matcher_test.rb +75 -0
  87. data/test/matchers/controller/set_session_matcher_test.rb +38 -0
  88. data/test/matchers/controller/set_the_flash_matcher.rb +41 -0
  89. data/test/model_builder.rb +106 -0
  90. data/test/other/autoload_macro_test.rb +18 -0
  91. data/test/other/context_test.rb +203 -0
  92. data/test/other/convert_to_should_syntax_test.rb +63 -0
  93. data/test/other/helpers_test.rb +340 -0
  94. data/test/other/private_helpers_test.rb +32 -0
  95. data/test/other/should_test.rb +271 -0
  96. data/test/rails_root/app/controllers/application_controller.rb +25 -0
  97. data/test/rails_root/app/controllers/posts_controller.rb +87 -0
  98. data/test/rails_root/app/controllers/users_controller.rb +84 -0
  99. data/test/rails_root/app/helpers/application_helper.rb +3 -0
  100. data/test/rails_root/app/helpers/posts_helper.rb +2 -0
  101. data/test/rails_root/app/helpers/users_helper.rb +2 -0
  102. data/test/rails_root/app/models/address.rb +7 -0
  103. data/test/rails_root/app/models/flea.rb +3 -0
  104. data/test/rails_root/app/models/friendship.rb +4 -0
  105. data/test/rails_root/app/models/pets/cat.rb +7 -0
  106. data/test/rails_root/app/models/pets/dog.rb +10 -0
  107. data/test/rails_root/app/models/post.rb +12 -0
  108. data/test/rails_root/app/models/product.rb +12 -0
  109. data/test/rails_root/app/models/profile.rb +2 -0
  110. data/test/rails_root/app/models/registration.rb +2 -0
  111. data/test/rails_root/app/models/tag.rb +8 -0
  112. data/test/rails_root/app/models/tagging.rb +4 -0
  113. data/test/rails_root/app/models/treat.rb +3 -0
  114. data/test/rails_root/app/models/user.rb +32 -0
  115. data/test/rails_root/app/views/layouts/posts.rhtml +19 -0
  116. data/test/rails_root/app/views/layouts/users.rhtml +17 -0
  117. data/test/rails_root/app/views/layouts/wide.html.erb +1 -0
  118. data/test/rails_root/app/views/posts/edit.rhtml +27 -0
  119. data/test/rails_root/app/views/posts/index.rhtml +25 -0
  120. data/test/rails_root/app/views/posts/new.rhtml +26 -0
  121. data/test/rails_root/app/views/posts/show.rhtml +18 -0
  122. data/test/rails_root/app/views/users/edit.rhtml +22 -0
  123. data/test/rails_root/app/views/users/index.rhtml +22 -0
  124. data/test/rails_root/app/views/users/new.rhtml +21 -0
  125. data/test/rails_root/app/views/users/show.rhtml +13 -0
  126. data/test/rails_root/config/boot.rb +110 -0
  127. data/test/rails_root/config/database.yml +4 -0
  128. data/test/rails_root/config/environment.rb +18 -0
  129. data/test/rails_root/config/environments/test.rb +0 -0
  130. data/test/rails_root/config/initializers/new_rails_defaults.rb +15 -0
  131. data/test/rails_root/config/initializers/shoulda.rb +8 -0
  132. data/test/rails_root/config/routes.rb +6 -0
  133. data/test/rails_root/db/migrate/001_create_users.rb +19 -0
  134. data/test/rails_root/db/migrate/002_create_posts.rb +13 -0
  135. data/test/rails_root/db/migrate/003_create_taggings.rb +12 -0
  136. data/test/rails_root/db/migrate/004_create_tags.rb +11 -0
  137. data/test/rails_root/db/migrate/005_create_dogs.rb +12 -0
  138. data/test/rails_root/db/migrate/006_create_addresses.rb +14 -0
  139. data/test/rails_root/db/migrate/007_create_fleas.rb +11 -0
  140. data/test/rails_root/db/migrate/008_create_dogs_fleas.rb +12 -0
  141. data/test/rails_root/db/migrate/009_create_products.rb +17 -0
  142. data/test/rails_root/db/migrate/010_create_friendships.rb +14 -0
  143. data/test/rails_root/db/migrate/011_create_treats.rb +12 -0
  144. data/test/rails_root/db/migrate/20090506203502_create_profiles.rb +12 -0
  145. data/test/rails_root/db/migrate/20090506203536_create_registrations.rb +14 -0
  146. data/test/rails_root/db/migrate/20090513104502_create_cats.rb +12 -0
  147. data/test/rails_root/db/schema.rb +0 -0
  148. data/test/rails_root/log/test.log +8963 -0
  149. data/test/rails_root/public/404.html +30 -0
  150. data/test/rails_root/public/422.html +30 -0
  151. data/test/rails_root/public/500.html +30 -0
  152. data/test/rails_root/script/console +3 -0
  153. data/test/rails_root/script/generate +3 -0
  154. data/test/rails_root/test/shoulda_macros/custom_macro.rb +6 -0
  155. data/test/rails_root/vendor/gems/gem_with_macro-0.0.1/shoulda_macros/gem_macro.rb +6 -0
  156. data/test/rails_root/vendor/plugins/plugin_with_macro/shoulda_macros/plugin_macro.rb +6 -0
  157. data/test/rspec_test.rb +207 -0
  158. data/test/test_helper.rb +28 -0
  159. data/test/unit/address_test.rb +15 -0
  160. data/test/unit/cat_test.rb +7 -0
  161. data/test/unit/dog_test.rb +9 -0
  162. data/test/unit/flea_test.rb +6 -0
  163. data/test/unit/friendship_test.rb +6 -0
  164. data/test/unit/post_test.rb +19 -0
  165. data/test/unit/product_test.rb +23 -0
  166. data/test/unit/tag_test.rb +15 -0
  167. data/test/unit/tagging_test.rb +6 -0
  168. data/test/unit/user_test.rb +80 -0
  169. metadata +225 -0
@@ -0,0 +1,87 @@
1
+ class PostsController < ApplicationController
2
+ before_filter :ensure_logged_in
3
+ before_filter :load_user
4
+
5
+ def index
6
+ @posts = @user.posts
7
+
8
+ respond_to do |format|
9
+ format.html # index.rhtml
10
+ format.xml { render :xml => @posts.to_xml }
11
+ format.rss do
12
+ headers['Content-Type'] = 'application/rss+xml'
13
+ session[:special] = '$2 off your next purchase'
14
+ session[:special_user_id] = @user.id
15
+ session[:false_var] = false
16
+ head :ok
17
+ end
18
+ end
19
+ end
20
+
21
+ def show
22
+ @post = @user.posts.find(params[:id])
23
+ @false_flag = false
24
+
25
+ respond_to do |format|
26
+ format.html { render :layout => 'wide' }
27
+ format.xml { render :xml => @post.to_xml }
28
+ end
29
+ end
30
+
31
+ def new
32
+ @post = @user.posts.build
33
+ render :layout => false
34
+ end
35
+
36
+ def edit
37
+ @post = @user.posts.find(params[:id])
38
+ end
39
+
40
+ def create
41
+ @post = @user.posts.build(params[:post])
42
+
43
+ respond_to do |format|
44
+ if @post.save
45
+ flash[:notice] = 'Post was successfully created.'
46
+ format.html { redirect_to user_post_url(@post.user, @post) }
47
+ format.xml { head :created, :location => user_post_url(@post.user, @post) }
48
+ else
49
+ format.html { render :action => "new" }
50
+ format.xml { render :xml => @post.errors.to_xml }
51
+ end
52
+ end
53
+ end
54
+
55
+ def update
56
+ @post = @user.posts.find(params[:id])
57
+
58
+ respond_to do |format|
59
+ if @post.update_attributes(params[:post])
60
+ flash[:notice] = 'Post was successfully updated.'
61
+ format.html { redirect_to user_post_url(@post.user, @post) }
62
+ format.xml { head :ok }
63
+ else
64
+ format.html { render :action => "edit" }
65
+ format.xml { render :xml => @post.errors.to_xml }
66
+ end
67
+ end
68
+ end
69
+
70
+ def destroy
71
+ @post = @user.posts.find(params[:id])
72
+ @post.destroy
73
+
74
+ flash[:notice] = "Post was removed"
75
+
76
+ respond_to do |format|
77
+ format.html { redirect_to user_posts_url(@post.user) }
78
+ format.xml { head :ok }
79
+ end
80
+ end
81
+
82
+ private
83
+
84
+ def load_user
85
+ @user = User.find(params[:user_id])
86
+ end
87
+ end
@@ -0,0 +1,84 @@
1
+ class UsersController < ApplicationController
2
+
3
+ filter_parameter_logging :ssn
4
+
5
+ # GET /users
6
+ # GET /users.xml
7
+ def index
8
+ @users = User.find(:all)
9
+
10
+ respond_to do |format|
11
+ format.html # index.rhtml
12
+ format.xml { render :xml => @users.to_xml }
13
+ end
14
+ end
15
+
16
+ # GET /users/1
17
+ # GET /users/1.xml
18
+ def show
19
+ @user = User.find(params[:id])
20
+
21
+ respond_to do |format|
22
+ format.html # show.rhtml
23
+ format.xml { render :xml => @user.to_xml }
24
+ end
25
+ end
26
+
27
+ # GET /users/new
28
+ def new
29
+ @user = User.new
30
+ end
31
+
32
+ # GET /users/1;edit
33
+ def edit
34
+ @user = User.find(params[:id])
35
+ end
36
+
37
+ # POST /users
38
+ # POST /users.xml
39
+ def create
40
+ @user = User.new(params[:user])
41
+
42
+ respond_to do |format|
43
+ if @user.save
44
+ flash[:notice] = 'User was successfully created.'
45
+ format.html { redirect_to user_url(@user) }
46
+ format.xml { head :created, :location => user_url(@user) }
47
+ else
48
+ format.html { render :action => "new" }
49
+ format.xml { render :xml => @user.errors.to_xml }
50
+ end
51
+ end
52
+ end
53
+
54
+ # PUT /users/1
55
+ # PUT /users/1.xml
56
+ def update
57
+ @user = User.find(params[:id])
58
+
59
+ respond_to do |format|
60
+ if @user.update_attributes(params[:user])
61
+ flash[:notice] = 'User was successfully updated.'
62
+ format.html { redirect_to user_url(@user) }
63
+ format.xml { head :ok }
64
+ else
65
+ format.html { render :action => "edit" }
66
+ format.xml { render :xml => @user.errors.to_xml }
67
+ end
68
+ end
69
+ end
70
+
71
+ # DELETE /users/1
72
+ # DELETE /users/1.xml
73
+ def destroy
74
+ @user = User.find(params[:id])
75
+ @user.destroy
76
+
77
+ flash[:notice] = "User was removed"
78
+
79
+ respond_to do |format|
80
+ format.html { redirect_to users_url }
81
+ format.xml { head :ok }
82
+ end
83
+ end
84
+ 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
@@ -0,0 +1,2 @@
1
+ module PostsHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ module UsersHelper
2
+ end
@@ -0,0 +1,7 @@
1
+ class Address < ActiveRecord::Base
2
+ belongs_to :addressable, :polymorphic => true
3
+ validates_uniqueness_of :title, :scope => [:addressable_type, :addressable_id]
4
+
5
+ validates_length_of :zip, :minimum => 5
6
+ validates_numericality_of :zip
7
+ end
@@ -0,0 +1,3 @@
1
+ class Flea < ActiveRecord::Base
2
+ has_and_belongs_to_many :dogs
3
+ end
@@ -0,0 +1,4 @@
1
+ class Friendship < ActiveRecord::Base
2
+ belongs_to :user
3
+ belongs_to :friend, :class_name => "User"
4
+ end
@@ -0,0 +1,7 @@
1
+ module Pets
2
+ class Cat < ActiveRecord::Base
3
+ belongs_to :owner, :class_name => 'User'
4
+ belongs_to :address, :dependent => :destroy
5
+ validates_presence_of :owner_id
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ module Pets
2
+ class Dog < ActiveRecord::Base
3
+ belongs_to :user, :foreign_key => :owner_id
4
+ belongs_to :address, :dependent => :destroy
5
+ has_many :treats
6
+ has_and_belongs_to_many :fleas, :join_table => :fleas
7
+ validates_presence_of :treats, :fleas
8
+ validates_presence_of :owner_id
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ class Post < ActiveRecord::Base
2
+ belongs_to :user
3
+ belongs_to :owner, :foreign_key => :user_id, :class_name => 'User'
4
+ has_many :taggings
5
+ has_many :tags, :through => :taggings
6
+ has_many :through_tags, :through => :taggings, :source => :tag
7
+
8
+ validates_uniqueness_of :title
9
+ validates_presence_of :title
10
+ validates_presence_of :body, :message => 'Seriously, wtf'
11
+ validates_numericality_of :user_id
12
+ end
@@ -0,0 +1,12 @@
1
+ class Product < ActiveRecord::Base
2
+ validates_presence_of :title
3
+
4
+ validates_inclusion_of :price, :in => 0..99, :unless => :tangible
5
+ validates_format_of :size, :with => /^\d+\D+$/, :unless => :tangible
6
+
7
+ validates_presence_of :price, :if => :tangible
8
+ validates_inclusion_of :price, :in => 1..9999, :if => :tangible
9
+ validates_inclusion_of :weight, :in => 1..100, :if => :tangible
10
+ validates_format_of :size, :with => /.+x.+x.+/, :if => :tangible
11
+ validates_length_of :size, :in => 5..20, :if => :tangible
12
+ end
@@ -0,0 +1,2 @@
1
+ class Profile < ActiveRecord::Base
2
+ end
@@ -0,0 +1,2 @@
1
+ class Registration < ActiveRecord::Base
2
+ end
@@ -0,0 +1,8 @@
1
+ class Tag < ActiveRecord::Base
2
+ has_many :taggings, :dependent => :destroy
3
+ has_many :posts, :through => :taggings
4
+
5
+ validates_length_of :name, :minimum => 2
6
+
7
+ attr_accessible :name
8
+ end
@@ -0,0 +1,4 @@
1
+ class Tagging < ActiveRecord::Base
2
+ belongs_to :post
3
+ belongs_to :tag
4
+ end
@@ -0,0 +1,3 @@
1
+ class Treat < ActiveRecord::Base
2
+
3
+ end
@@ -0,0 +1,32 @@
1
+ class User < ActiveRecord::Base
2
+ has_many :posts
3
+ has_many :dogs, :foreign_key => :owner_id, :class_name => "Pets::Dog"
4
+ has_many :cats, :foreign_key => :owner_id, :class_name => "Pets::Cat"
5
+
6
+ has_many :friendships
7
+ has_many :friends, :through => :friendships
8
+
9
+ has_one :address, :as => :addressable, :dependent => :destroy
10
+ has_one :registration
11
+ has_one :profile, :through => :registration
12
+
13
+ named_scope :old, :conditions => "age > 50"
14
+ named_scope :eighteen, :conditions => { :age => 18 }
15
+ named_scope :recent, lambda {|count| { :limit => count } }
16
+
17
+ def self.recent_via_method(count)
18
+ scoped(:limit => count)
19
+ end
20
+
21
+ attr_protected :password
22
+ attr_readonly :name
23
+
24
+ validates_format_of :email, :with => /\w*@\w*.com/
25
+ validates_length_of :email, :in => 1..100
26
+ validates_numericality_of :age, :greater_than_or_equal_to => 1,
27
+ :less_than_or_equal_to => 100
28
+ validates_acceptance_of :eula
29
+ validates_uniqueness_of :email, :scope => :name, :case_sensitive => false
30
+ validates_length_of :ssn, :is => 9, :message => "Social Security Number is not the right length"
31
+ validates_numericality_of :ssn
32
+ end
@@ -0,0 +1,19 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+ <head>
6
+ <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
7
+ <meta name="description" content="Posts, posts and more posts" />
8
+ <meta name='keywords' content='posts' />
9
+ <title>Posts: <%= controller.action_name %></title>
10
+ <%= stylesheet_link_tag 'scaffold' %>
11
+ </head>
12
+ <body>
13
+
14
+ <p style="color: green"><%= flash[:notice] %></p>
15
+
16
+ <%= yield %>
17
+
18
+ </body>
19
+ </html>
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+
4
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
5
+ <head>
6
+ <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
7
+ <title>Users: <%= controller.action_name %></title>
8
+ <%= stylesheet_link_tag 'scaffold' %>
9
+ </head>
10
+ <body>
11
+
12
+ <p style="color: green"><%= flash[:notice] %></p>
13
+
14
+ <%= yield %>
15
+
16
+ </body>
17
+ </html>
@@ -0,0 +1 @@
1
+ <html><%= yield %></html>
@@ -0,0 +1,27 @@
1
+ <h1>Editing post</h1>
2
+
3
+ <%= error_messages_for :post %>
4
+
5
+ <% form_for(:post, :url => user_post_path(@post.user, @post), :html => { :method => :put }) do |f| %>
6
+ <p>
7
+ <b>User</b><br />
8
+ <%= f.text_field :user_id %>
9
+ </p>
10
+
11
+ <p>
12
+ <b>Title</b><br />
13
+ <%= f.text_field :title %>
14
+ </p>
15
+
16
+ <p>
17
+ <b>Body</b><br />
18
+ <%= f.text_area :body %>
19
+ </p>
20
+
21
+ <p>
22
+ <%= submit_tag "Update" %>
23
+ </p>
24
+ <% end %>
25
+
26
+ <%= link_to 'Show', user_post_path(@post.user, @post) %> |
27
+ <%= link_to 'Back', user_posts_path(@post.user) %>
@@ -0,0 +1,25 @@
1
+ <h1>Listing posts</h1>
2
+
3
+ <table>
4
+ <tr>
5
+ <th>User</th>
6
+ <th>Title</th>
7
+ <th>Body</th>
8
+ </tr>
9
+
10
+ <% for post in @posts %>
11
+ <tr>
12
+ <td><%=h post.user_id %></td>
13
+ <td><%=h post.title %></td>
14
+ <td><%=h post.body %></td>
15
+ <td><%= link_to 'Show', user_post_path(post.user, post) %></td>
16
+ <td><%= link_to 'Edit', edit_user_post_path(post.user, post) %></td>
17
+ <td><%= link_to 'Destroy', user_post_path(post.user, post), :confirm => 'Are you sure?',
18
+ :method => :delete %></td>
19
+ </tr>
20
+ <% end %>
21
+ </table>
22
+
23
+ <br />
24
+
25
+ <%= link_to 'New post', new_user_post_path(post.user) %>
@@ -0,0 +1,26 @@
1
+ <h1>New post</h1>
2
+
3
+ <%= error_messages_for :post %>
4
+
5
+ <% form_for(:post, :url => user_posts_path(@user)) do |f| %>
6
+ <p>
7
+ <b>User</b><br />
8
+ <%= f.text_field :user_id %>
9
+ </p>
10
+
11
+ <p>
12
+ <b>Title</b><br />
13
+ <%= f.text_field :title %>
14
+ </p>
15
+
16
+ <p>
17
+ <b>Body</b><br />
18
+ <%= f.text_area :body %>
19
+ </p>
20
+
21
+ <p>
22
+ <%= submit_tag "Create" %>
23
+ </p>
24
+ <% end %>
25
+
26
+ <%= link_to 'Back', user_posts_path(@user) %>
@@ -0,0 +1,18 @@
1
+ <p>
2
+ <b>User:</b>
3
+ <%=h @post.user_id %>
4
+ </p>
5
+
6
+ <p>
7
+ <b>Title:</b>
8
+ <%=h @post.title %>
9
+ </p>
10
+
11
+ <p>
12
+ <b>Body:</b>
13
+ <%=h @post.body %>
14
+ </p>
15
+
16
+
17
+ <%= link_to 'Edit', edit_user_post_path(@post.user, @post) %> |
18
+ <%= link_to 'Back', user_posts_path(@post.user) %>
@@ -0,0 +1,22 @@
1
+ <h1>Editing user</h1>
2
+
3
+ <%= error_messages_for :user %>
4
+
5
+ <% form_for(:user, :url => user_path(@user), :html => { :method => :put }) do |f| %>
6
+ <p>
7
+ <b>Email</b><br />
8
+ <%= f.text_field :email %>
9
+ </p>
10
+
11
+ <p>
12
+ <b>Age</b><br />
13
+ <%= f.text_field :age %>
14
+ </p>
15
+
16
+ <p>
17
+ <%= submit_tag "Update" %>
18
+ </p>
19
+ <% end %>
20
+
21
+ <%= link_to 'Show', user_path(@user) %> |
22
+ <%= link_to 'Back', users_path %>
@@ -0,0 +1,22 @@
1
+ <h1>Listing users</h1>
2
+
3
+ <table>
4
+ <tr>
5
+ <th>Email</th>
6
+ <th>Age</th>
7
+ </tr>
8
+
9
+ <% for user in @users %>
10
+ <tr>
11
+ <td><%=h user.email %></td>
12
+ <td><%=h user.age %></td>
13
+ <td><%= link_to 'Show', user_path(user) %></td>
14
+ <td><%= link_to 'Edit', edit_user_path(user) %></td>
15
+ <td><%= link_to 'Destroy', user_path(user), :confirm => 'Are you sure?', :method => :delete %></td>
16
+ </tr>
17
+ <% end %>
18
+ </table>
19
+
20
+ <br />
21
+
22
+ <%= link_to 'New user', new_user_path %>
@@ -0,0 +1,21 @@
1
+ <h1>New user</h1>
2
+
3
+ <%= error_messages_for :user %>
4
+
5
+ <% form_for(:user, :url => users_path) do |f| %>
6
+ <p>
7
+ <b>Email</b><br />
8
+ <%= f.text_field :email %>
9
+ </p>
10
+
11
+ <p>
12
+ <b>Age</b><br />
13
+ <%= f.text_field :age %>
14
+ </p>
15
+
16
+ <p>
17
+ <%= submit_tag "Create" %>
18
+ </p>
19
+ <% end %>
20
+
21
+ <%= link_to 'Back', users_path %>
@@ -0,0 +1,13 @@
1
+ <p>
2
+ <b>Email:</b>
3
+ <%=h @user.email %>
4
+ </p>
5
+
6
+ <p>
7
+ <b>Age:</b>
8
+ <%=h @user.age %>
9
+ </p>
10
+
11
+
12
+ <%= link_to 'Edit', edit_user_path(@user) %> |
13
+ <%= link_to 'Back', users_path %>
@@ -0,0 +1,110 @@
1
+ # Don't change this file!
2
+ # Configure your app in config/environment.rb and config/environments/*.rb
3
+
4
+ RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
5
+
6
+ module Rails
7
+ class << self
8
+ def boot!
9
+ unless booted?
10
+ preinitialize
11
+ pick_boot.run
12
+ end
13
+ end
14
+
15
+ def booted?
16
+ defined? Rails::Initializer
17
+ end
18
+
19
+ def pick_boot
20
+ (vendor_rails? ? VendorBoot : GemBoot).new
21
+ end
22
+
23
+ def vendor_rails?
24
+ File.exist?("#{RAILS_ROOT}/vendor/rails")
25
+ end
26
+
27
+ def preinitialize
28
+ load(preinitializer_path) if File.exist?(preinitializer_path)
29
+ end
30
+
31
+ def preinitializer_path
32
+ "#{RAILS_ROOT}/config/preinitializer.rb"
33
+ end
34
+ end
35
+
36
+ class Boot
37
+ def run
38
+ load_initializer
39
+ Rails::Initializer.run(:set_load_path)
40
+ end
41
+ end
42
+
43
+ class VendorBoot < Boot
44
+ def load_initializer
45
+ require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
46
+ Rails::Initializer.run(:install_gem_spec_stubs)
47
+ Rails::GemDependency.add_frozen_gem_path
48
+ end
49
+ end
50
+
51
+ class GemBoot < Boot
52
+ def load_initializer
53
+ self.class.load_rubygems
54
+ load_rails_gem
55
+ require 'initializer'
56
+ end
57
+
58
+ def load_rails_gem
59
+ if version = self.class.gem_version
60
+ gem 'rails', version
61
+ else
62
+ gem 'rails'
63
+ end
64
+ rescue Gem::LoadError => load_error
65
+ $stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
66
+ exit 1
67
+ end
68
+
69
+ class << self
70
+ def rubygems_version
71
+ Gem::RubyGemsVersion rescue nil
72
+ end
73
+
74
+ def gem_version
75
+ if defined? RAILS_GEM_VERSION
76
+ RAILS_GEM_VERSION
77
+ elsif ENV.include?('RAILS_GEM_VERSION')
78
+ ENV['RAILS_GEM_VERSION']
79
+ else
80
+ parse_gem_version(read_environment_rb)
81
+ end
82
+ end
83
+
84
+ def load_rubygems
85
+ require 'rubygems'
86
+ min_version = '1.3.1'
87
+ unless rubygems_version >= min_version
88
+ $stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.)
89
+ exit 1
90
+ end
91
+
92
+ rescue LoadError
93
+ $stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org)
94
+ exit 1
95
+ end
96
+
97
+ def parse_gem_version(text)
98
+ $1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
99
+ end
100
+
101
+ private
102
+ def read_environment_rb
103
+ File.read("#{RAILS_ROOT}/config/environment.rb")
104
+ end
105
+ end
106
+ end
107
+ end
108
+
109
+ # All that for this:
110
+ Rails.boot!
@@ -0,0 +1,4 @@
1
+ test:
2
+ :adapter: sqlite3
3
+ # :dbfile: db/sqlite3.db
4
+ :dbfile: ":memory:"
@@ -0,0 +1,18 @@
1
+ # Specifies gem version of Rails to use when vendor/rails is not present
2
+ old_verbose, $VERBOSE = $VERBOSE, nil
3
+ RAILS_GEM_VERSION = '>= 2.3.2' unless defined? RAILS_GEM_VERSION
4
+ $VERBOSE = old_verbose
5
+
6
+ require File.join(File.dirname(__FILE__), 'boot')
7
+
8
+ Rails::Initializer.run do |config|
9
+ config.log_level = :debug
10
+ config.cache_classes = false
11
+ config.whiny_nils = true
12
+ config.action_controller.session = {
13
+ :key => 'shoulda_session',
14
+ :secret => 'ceae6058a816b1446e09ce90d8372511'
15
+ }
16
+ end
17
+
18
+ # Dependencies.log_activity = true
File without changes