rails 2.2.3 → 2.3.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rails might be problematic. Click here for more details.

Files changed (229) hide show
  1. data/CHANGELOG +272 -191
  2. data/MIT-LICENSE +1 -1
  3. data/README +6 -19
  4. data/Rakefile +24 -71
  5. data/bin/rails +1 -0
  6. data/builtin/rails_info/rails/info.rb +12 -8
  7. data/configs/databases/mysql.yml +3 -0
  8. data/configs/initializers/backtrace_silencers.rb +7 -0
  9. data/configs/initializers/new_rails_defaults.rb +2 -0
  10. data/configs/initializers/session_store.rb +15 -0
  11. data/dispatches/config.ru +7 -0
  12. data/doc/README_FOR_APP +2 -5
  13. data/environments/boot.rb +1 -0
  14. data/environments/environment.rb +14 -48
  15. data/environments/production.rb +11 -7
  16. data/environments/test.rb +6 -0
  17. data/helpers/application_controller.rb +10 -0
  18. data/helpers/test_helper.rb +1 -1
  19. data/html/500.html +0 -3
  20. data/html/index.html +1 -0
  21. data/lib/commands/about.rb +1 -1
  22. data/lib/commands/dbconsole.rb +18 -2
  23. data/lib/commands/plugin.rb +4 -3
  24. data/lib/commands/runner.rb +13 -7
  25. data/lib/commands/server.rb +98 -33
  26. data/lib/console_app.rb +4 -4
  27. data/lib/console_with_helpers.rb +2 -23
  28. data/lib/dispatcher.rb +1 -1
  29. data/lib/fcgi_handler.rb +12 -10
  30. data/lib/initializer.rb +108 -41
  31. data/lib/rails/backtrace_cleaner.rb +54 -0
  32. data/lib/rails/gem_dependency.rb +124 -94
  33. data/lib/rails/plugin.rb +49 -6
  34. data/lib/rails/plugin/loader.rb +66 -27
  35. data/lib/rails/plugin/locator.rb +1 -1
  36. data/lib/rails/rack.rb +3 -1
  37. data/lib/rails/rack/debugger.rb +21 -0
  38. data/lib/rails/rack/log_tailer.rb +35 -0
  39. data/lib/rails/rack/metal.rb +51 -0
  40. data/lib/rails/rack/static.rb +15 -4
  41. data/lib/rails/version.rb +2 -2
  42. data/lib/rails_generator/base.rb +3 -0
  43. data/lib/rails_generator/commands.rb +8 -3
  44. data/lib/rails_generator/generators/applications/app/app_generator.rb +210 -136
  45. data/lib/rails_generator/generators/applications/app/scm/git.rb +16 -0
  46. data/lib/rails_generator/generators/applications/app/scm/scm.rb +8 -0
  47. data/lib/rails_generator/generators/applications/app/scm/svn.rb +7 -0
  48. data/lib/rails_generator/generators/applications/app/template_runner.rb +401 -0
  49. data/lib/rails_generator/generators/components/controller/USAGE +12 -11
  50. data/lib/rails_generator/generators/components/controller/controller_generator.rb +7 -1
  51. data/lib/rails_generator/generators/components/controller/templates/helper_test.rb +4 -0
  52. data/lib/rails_generator/generators/components/helper/USAGE +24 -0
  53. data/lib/rails_generator/generators/components/helper/helper_generator.rb +25 -0
  54. data/lib/rails_generator/generators/components/helper/templates/helper.rb +2 -0
  55. data/lib/rails_generator/generators/components/helper/templates/helper_test.rb +4 -0
  56. data/lib/rails_generator/generators/components/metal/USAGE +8 -0
  57. data/lib/rails_generator/generators/components/metal/metal_generator.rb +8 -0
  58. data/lib/rails_generator/generators/components/metal/templates/metal.rb +12 -0
  59. data/lib/rails_generator/generators/components/resource/USAGE +2 -2
  60. data/lib/rails_generator/generators/components/resource/resource_generator.rb +2 -0
  61. data/lib/rails_generator/generators/components/resource/templates/helper_test.rb +4 -0
  62. data/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb +2 -0
  63. data/lib/rails_generator/generators/components/scaffold/templates/controller.rb +1 -1
  64. data/lib/rails_generator/generators/components/scaffold/templates/functional_test.rb +4 -4
  65. data/lib/rails_generator/generators/components/scaffold/templates/helper_test.rb +4 -0
  66. data/lib/rails_generator/generators/components/scaffold/templates/layout.html.erb +1 -1
  67. data/lib/rails_generator/generators/components/scaffold/templates/view_edit.html.erb +2 -2
  68. data/lib/rails_generator/generators/components/scaffold/templates/view_index.html.erb +2 -2
  69. data/lib/rails_generator/generators/components/scaffold/templates/view_new.html.erb +2 -2
  70. data/lib/rails_generator/generators/components/scaffold/templates/view_show.html.erb +1 -1
  71. data/lib/rails_generator/secret_key_generator.rb +2 -0
  72. data/lib/tasks/databases.rake +13 -6
  73. data/lib/tasks/documentation.rake +2 -9
  74. data/lib/tasks/framework.rake +26 -1
  75. data/lib/tasks/gems.rake +33 -48
  76. data/lib/tasks/middleware.rake +7 -0
  77. data/lib/tasks/misc.rake +7 -0
  78. data/lib/tasks/statistics.rake +0 -1
  79. data/lib/tasks/testing.rake +5 -5
  80. data/lib/tasks/tmp.rake +2 -2
  81. data/lib/test_help.rb +16 -8
  82. metadata +92 -159
  83. data/bin/performance/request +0 -3
  84. data/bin/process/inspector +0 -3
  85. data/bin/process/reaper +0 -3
  86. data/bin/process/spawner +0 -3
  87. data/config.ru +0 -17
  88. data/configs/apache.conf +0 -40
  89. data/configs/lighttpd.conf +0 -54
  90. data/doc/guides/html/2_2_release_notes.html +0 -1185
  91. data/doc/guides/html/actioncontroller_basics.html +0 -1270
  92. data/doc/guides/html/activerecord_validations_callbacks.html +0 -749
  93. data/doc/guides/html/association_basics.html +0 -2585
  94. data/doc/guides/html/authors.html +0 -240
  95. data/doc/guides/html/benchmarking_and_profiling.html +0 -1018
  96. data/doc/guides/html/caching_with_rails.html +0 -583
  97. data/doc/guides/html/command_line.html +0 -434
  98. data/doc/guides/html/configuring.html +0 -438
  99. data/doc/guides/html/creating_plugins.html +0 -1594
  100. data/doc/guides/html/debugging_rails_applications.html +0 -1175
  101. data/doc/guides/html/finders.html +0 -1090
  102. data/doc/guides/html/form_helpers.html +0 -638
  103. data/doc/guides/html/getting_started_with_rails.html +0 -2066
  104. data/doc/guides/html/index.html +0 -349
  105. data/doc/guides/html/layouts_and_rendering.html +0 -1406
  106. data/doc/guides/html/migrations.html +0 -921
  107. data/doc/guides/html/routing_outside_in.html +0 -2213
  108. data/doc/guides/html/security.html +0 -1346
  109. data/doc/guides/html/testing_rails_applications.html +0 -1859
  110. data/doc/guides/source/2_2_release_notes.txt +0 -435
  111. data/doc/guides/source/actioncontroller_basics/changelog.txt +0 -5
  112. data/doc/guides/source/actioncontroller_basics/cookies.txt +0 -34
  113. data/doc/guides/source/actioncontroller_basics/csrf.txt +0 -32
  114. data/doc/guides/source/actioncontroller_basics/filters.txt +0 -119
  115. data/doc/guides/source/actioncontroller_basics/http_auth.txt +0 -24
  116. data/doc/guides/source/actioncontroller_basics/index.txt +0 -40
  117. data/doc/guides/source/actioncontroller_basics/introduction.txt +0 -9
  118. data/doc/guides/source/actioncontroller_basics/methods.txt +0 -39
  119. data/doc/guides/source/actioncontroller_basics/parameter_filtering.txt +0 -14
  120. data/doc/guides/source/actioncontroller_basics/params.txt +0 -93
  121. data/doc/guides/source/actioncontroller_basics/request_response_objects.txt +0 -43
  122. data/doc/guides/source/actioncontroller_basics/rescue.txt +0 -67
  123. data/doc/guides/source/actioncontroller_basics/session.txt +0 -187
  124. data/doc/guides/source/actioncontroller_basics/streaming.txt +0 -91
  125. data/doc/guides/source/actioncontroller_basics/verification.txt +0 -40
  126. data/doc/guides/source/active_record_basics.txt +0 -181
  127. data/doc/guides/source/activerecord_validations_callbacks.txt +0 -404
  128. data/doc/guides/source/association_basics.txt +0 -1840
  129. data/doc/guides/source/authors.txt +0 -39
  130. data/doc/guides/source/benchmarking_and_profiling/appendix.txt +0 -95
  131. data/doc/guides/source/benchmarking_and_profiling/digging_deeper.txt +0 -105
  132. data/doc/guides/source/benchmarking_and_profiling/edge_rails_features.txt +0 -185
  133. data/doc/guides/source/benchmarking_and_profiling/gameplan.txt +0 -27
  134. data/doc/guides/source/benchmarking_and_profiling/index.txt +0 -242
  135. data/doc/guides/source/benchmarking_and_profiling/rubyprof.txt +0 -179
  136. data/doc/guides/source/benchmarking_and_profiling/statistics.txt +0 -57
  137. data/doc/guides/source/caching_with_rails.txt +0 -367
  138. data/doc/guides/source/command_line.txt +0 -147
  139. data/doc/guides/source/configuring.txt +0 -225
  140. data/doc/guides/source/creating_plugins/acts_as_yaffle.txt +0 -191
  141. data/doc/guides/source/creating_plugins/appendix.txt +0 -46
  142. data/doc/guides/source/creating_plugins/controllers.txt +0 -59
  143. data/doc/guides/source/creating_plugins/core_ext.txt +0 -123
  144. data/doc/guides/source/creating_plugins/custom_route.txt +0 -69
  145. data/doc/guides/source/creating_plugins/gem.txt +0 -1
  146. data/doc/guides/source/creating_plugins/generator_method.txt +0 -89
  147. data/doc/guides/source/creating_plugins/helpers.txt +0 -51
  148. data/doc/guides/source/creating_plugins/index.txt +0 -52
  149. data/doc/guides/source/creating_plugins/migration_generator.txt +0 -156
  150. data/doc/guides/source/creating_plugins/models.txt +0 -76
  151. data/doc/guides/source/creating_plugins/odds_and_ends.txt +0 -69
  152. data/doc/guides/source/creating_plugins/test_setup.txt +0 -230
  153. data/doc/guides/source/debugging_rails_applications.txt +0 -733
  154. data/doc/guides/source/finders.txt +0 -668
  155. data/doc/guides/source/form_helpers.txt +0 -345
  156. data/doc/guides/source/getting_started_with_rails.txt +0 -1256
  157. data/doc/guides/source/images/belongs_to.png +0 -0
  158. data/doc/guides/source/images/bullet.gif +0 -0
  159. data/doc/guides/source/images/csrf.png +0 -0
  160. data/doc/guides/source/images/habtm.png +0 -0
  161. data/doc/guides/source/images/has_many.png +0 -0
  162. data/doc/guides/source/images/has_many_through.png +0 -0
  163. data/doc/guides/source/images/has_one.png +0 -0
  164. data/doc/guides/source/images/has_one_through.png +0 -0
  165. data/doc/guides/source/images/header_backdrop.png +0 -0
  166. data/doc/guides/source/images/icons/README +0 -5
  167. data/doc/guides/source/images/icons/callouts/1.png +0 -0
  168. data/doc/guides/source/images/icons/callouts/10.png +0 -0
  169. data/doc/guides/source/images/icons/callouts/11.png +0 -0
  170. data/doc/guides/source/images/icons/callouts/12.png +0 -0
  171. data/doc/guides/source/images/icons/callouts/13.png +0 -0
  172. data/doc/guides/source/images/icons/callouts/14.png +0 -0
  173. data/doc/guides/source/images/icons/callouts/15.png +0 -0
  174. data/doc/guides/source/images/icons/callouts/2.png +0 -0
  175. data/doc/guides/source/images/icons/callouts/3.png +0 -0
  176. data/doc/guides/source/images/icons/callouts/4.png +0 -0
  177. data/doc/guides/source/images/icons/callouts/5.png +0 -0
  178. data/doc/guides/source/images/icons/callouts/6.png +0 -0
  179. data/doc/guides/source/images/icons/callouts/7.png +0 -0
  180. data/doc/guides/source/images/icons/callouts/8.png +0 -0
  181. data/doc/guides/source/images/icons/callouts/9.png +0 -0
  182. data/doc/guides/source/images/icons/caution.png +0 -0
  183. data/doc/guides/source/images/icons/example.png +0 -0
  184. data/doc/guides/source/images/icons/home.png +0 -0
  185. data/doc/guides/source/images/icons/important.png +0 -0
  186. data/doc/guides/source/images/icons/next.png +0 -0
  187. data/doc/guides/source/images/icons/note.png +0 -0
  188. data/doc/guides/source/images/icons/prev.png +0 -0
  189. data/doc/guides/source/images/icons/tip.png +0 -0
  190. data/doc/guides/source/images/icons/up.png +0 -0
  191. data/doc/guides/source/images/icons/warning.png +0 -0
  192. data/doc/guides/source/images/polymorphic.png +0 -0
  193. data/doc/guides/source/images/rails_logo_remix.gif +0 -0
  194. data/doc/guides/source/images/ruby_on_rails_by_mike_rundle2.gif +0 -0
  195. data/doc/guides/source/images/session_fixation.png +0 -0
  196. data/doc/guides/source/index.txt +0 -118
  197. data/doc/guides/source/layouts_and_rendering.txt +0 -982
  198. data/doc/guides/source/migrations/anatomy_of_a_migration.txt +0 -85
  199. data/doc/guides/source/migrations/changelog.txt +0 -5
  200. data/doc/guides/source/migrations/creating_a_migration.txt +0 -109
  201. data/doc/guides/source/migrations/foreign_keys.txt +0 -8
  202. data/doc/guides/source/migrations/index.txt +0 -22
  203. data/doc/guides/source/migrations/rakeing_around.txt +0 -111
  204. data/doc/guides/source/migrations/scheming.txt +0 -47
  205. data/doc/guides/source/migrations/using_models_in_migrations.txt +0 -46
  206. data/doc/guides/source/migrations/writing_a_migration.txt +0 -159
  207. data/doc/guides/source/routing_outside_in.txt +0 -986
  208. data/doc/guides/source/security.txt +0 -984
  209. data/doc/guides/source/stylesheets/base.css +0 -358
  210. data/doc/guides/source/stylesheets/forms.css +0 -35
  211. data/doc/guides/source/stylesheets/more.css +0 -82
  212. data/doc/guides/source/templates/guides.html.erb +0 -97
  213. data/doc/guides/source/templates/inline.css +0 -165
  214. data/doc/guides/source/testing_rails_applications.txt +0 -995
  215. data/helpers/application.rb +0 -15
  216. data/lib/commands/performance/request.rb +0 -6
  217. data/lib/commands/process/inspector.rb +0 -68
  218. data/lib/commands/process/reaper.rb +0 -149
  219. data/lib/commands/process/spawner.rb +0 -219
  220. data/lib/commands/process/spinner.rb +0 -57
  221. data/lib/commands/servers/base.rb +0 -31
  222. data/lib/commands/servers/lighttpd.rb +0 -94
  223. data/lib/commands/servers/mongrel.rb +0 -69
  224. data/lib/commands/servers/new_mongrel.rb +0 -16
  225. data/lib/commands/servers/thin.rb +0 -25
  226. data/lib/commands/servers/webrick.rb +0 -66
  227. data/lib/rails/mongrel_server/commands.rb +0 -342
  228. data/lib/rails/mongrel_server/handler.rb +0 -55
  229. data/lib/rails/rack/logger.rb +0 -28
@@ -1,59 +0,0 @@
1
- == Add a controller ==
2
-
3
- This section describes how to add a controller named 'woodpeckers' to your plugin that will behave the same as a controller in your main app. This is very similar to adding a model.
4
-
5
- You can test your plugin's controller as you would test any other controller:
6
-
7
- *vendor/plugins/yaffle/yaffle/woodpeckers_controller_test.rb:*
8
-
9
- [source, ruby]
10
- ----------------------------------------------
11
- require File.dirname(__FILE__) + '/test_helper.rb'
12
- require 'woodpeckers_controller'
13
- require 'action_controller/test_process'
14
-
15
- class WoodpeckersController; def rescue_action(e) raise e end; end
16
-
17
- class WoodpeckersControllerTest < Test::Unit::TestCase
18
- def setup
19
- @controller = WoodpeckersController.new
20
- @request = ActionController::TestRequest.new
21
- @response = ActionController::TestResponse.new
22
- end
23
-
24
- def test_index
25
- get :index
26
- assert_response :success
27
- end
28
- end
29
- ----------------------------------------------
30
-
31
- This is just a simple test to make sure the controller is being loaded correctly. After watching it fail with `rake`, you can make it pass like so:
32
-
33
- *vendor/plugins/yaffle/lib/yaffle.rb:*
34
-
35
- [source, ruby]
36
- ----------------------------------------------
37
- %w{ models controllers }.each do |dir|
38
- path = File.join(File.dirname(__FILE__), 'app', dir)
39
- $LOAD_PATH << path
40
- ActiveSupport::Dependencies.load_paths << path
41
- ActiveSupport::Dependencies.load_once_paths.delete(path)
42
- end
43
- ----------------------------------------------
44
-
45
-
46
- *vendor/plugins/yaffle/lib/app/controllers/woodpeckers_controller.rb:*
47
-
48
- [source, ruby]
49
- ----------------------------------------------
50
- class WoodpeckersController < ActionController::Base
51
-
52
- def index
53
- render :text => "Squawk!"
54
- end
55
-
56
- end
57
- ----------------------------------------------
58
-
59
- Now your test should be passing, and you should be able to use the Woodpeckers controller in your app. If you add a route for the woodpeckers controller you can start up your server and go to http://localhost:3000/woodpeckers to see your controller in action.
@@ -1,123 +0,0 @@
1
- == Extending core classes ==
2
-
3
- This section will explain how to add a method to String that will be available anywhere in your rails app by:
4
-
5
- * Writing tests for the desired behavior
6
- * Creating and requiring the correct files
7
-
8
- === Creating the test ===
9
-
10
- In this example you will add a method to String named `to_squawk`. To begin, create a new test file with a few assertions:
11
-
12
- *vendor/plugins/yaffle/test/core_ext_test.rb*
13
-
14
- [source, ruby]
15
- --------------------------------------------------------
16
- require File.dirname(__FILE__) + '/test_helper.rb'
17
-
18
- class CoreExtTest < Test::Unit::TestCase
19
- def test_to_squawk_prepends_the_word_squawk
20
- assert_equal "squawk! Hello World", "Hello World".to_squawk
21
- end
22
- end
23
- --------------------------------------------------------
24
-
25
- Navigate to your plugin directory and run `rake test`:
26
-
27
- --------------------------------------------------------
28
- cd vendor/plugins/yaffle
29
- rake test
30
- --------------------------------------------------------
31
-
32
- The test above should fail with the message:
33
-
34
- --------------------------------------------------------
35
- 1) Error:
36
- test_to_squawk_prepends_the_word_squawk(CoreExtTest):
37
- NoMethodError: undefined method `to_squawk' for "Hello World":String
38
- ./test/core_ext_test.rb:5:in `test_to_squawk_prepends_the_word_squawk'
39
- --------------------------------------------------------
40
-
41
- Great - now you are ready to start development.
42
-
43
- === Organize your files ===
44
-
45
- A common pattern in rails plugins is to set up the file structure like this:
46
-
47
- --------------------------------------------------------
48
- |-- lib
49
- | |-- yaffle
50
- | | `-- core_ext.rb
51
- | `-- yaffle.rb
52
- --------------------------------------------------------
53
-
54
- The first thing we need to to is to require our 'lib/yaffle.rb' file from 'rails/init.rb':
55
-
56
- *vendor/plugins/yaffle/rails/init.rb*
57
-
58
- [source, ruby]
59
- --------------------------------------------------------
60
- require 'yaffle'
61
- --------------------------------------------------------
62
-
63
- Then in 'lib/yaffle.rb' require 'lib/core_ext.rb':
64
-
65
- *vendor/plugins/yaffle/lib/yaffle.rb*
66
-
67
- [source, ruby]
68
- --------------------------------------------------------
69
- require "yaffle/core_ext"
70
- --------------------------------------------------------
71
-
72
- Finally, create the 'core_ext.rb' file and add the 'to_squawk' method:
73
-
74
- *vendor/plugins/yaffle/lib/yaffle/core_ext.rb*
75
-
76
- [source, ruby]
77
- --------------------------------------------------------
78
- String.class_eval do
79
- def to_squawk
80
- "squawk! #{self}".strip
81
- end
82
- end
83
- --------------------------------------------------------
84
-
85
- To test that your method does what it says it does, run the unit tests with `rake` from your plugin directory. To see this in action, fire up a console and start squawking:
86
-
87
- --------------------------------------------------------
88
- $ ./script/console
89
- >> "Hello World".to_squawk
90
- => "squawk! Hello World"
91
- --------------------------------------------------------
92
-
93
- === Working with init.rb ===
94
-
95
- When rails loads plugins it looks for the file named init.rb. However, when the plugin is initialized, 'init.rb' is invoked via `eval` (not `require`) so it has slightly different behavior.
96
-
97
- Under certain circumstances if you reopen classes or modules in 'init.rb' you may inadvertently create a new class, rather than reopening an existing class. A better alternative is to reopen the class in a different file, and require that file from `init.rb`, as shown above.
98
-
99
- If you must reopen a class in `init.rb` you can use `module_eval` or `class_eval` to avoid any issues:
100
-
101
- *vendor/plugins/yaffle/init.rb*
102
-
103
- [source, ruby]
104
- ---------------------------------------------------
105
- Hash.class_eval do
106
- def is_a_special_hash?
107
- true
108
- end
109
- end
110
- ---------------------------------------------------
111
-
112
- Another way is to explicitly define the top-level module space for all modules and classes, like `::Hash`:
113
-
114
- *vendor/plugins/yaffle/init.rb*
115
-
116
- [source, ruby]
117
- ---------------------------------------------------
118
- class ::Hash
119
- def is_a_special_hash?
120
- true
121
- end
122
- end
123
- ---------------------------------------------------
@@ -1,69 +0,0 @@
1
- == Add a Custom Route ==
2
-
3
- Testing routes in plugins can be complex, especially if the controllers are also in the plugin itself. Jamis Buck showed a great example of this in http://weblog.jamisbuck.org/2006/10/26/monkey-patching-rails-extending-routes-2.
4
-
5
- *vendor/plugins/yaffle/test/routing_test.rb*
6
-
7
- [source, ruby]
8
- --------------------------------------------------------
9
- require "#{File.dirname(__FILE__)}/test_helper"
10
-
11
- class RoutingTest < Test::Unit::TestCase
12
-
13
- def setup
14
- ActionController::Routing::Routes.draw do |map|
15
- map.yaffles
16
- end
17
- end
18
-
19
- def test_yaffles_route
20
- assert_recognition :get, "/yaffles", :controller => "yaffles_controller", :action => "index"
21
- end
22
-
23
- private
24
-
25
- # yes, I know about assert_recognizes, but it has proven problematic to
26
- # use in these tests, since it uses RouteSet#recognize (which actually
27
- # tries to instantiate the controller) and because it uses an awkward
28
- # parameter order.
29
- def assert_recognition(method, path, options)
30
- result = ActionController::Routing::Routes.recognize_path(path, :method => method)
31
- assert_equal options, result
32
- end
33
- end
34
- --------------------------------------------------------
35
-
36
- *vendor/plugins/yaffle/init.rb*
37
-
38
- [source, ruby]
39
- --------------------------------------------------------
40
- require "routing"
41
- ActionController::Routing::RouteSet::Mapper.send :include, Yaffle::Routing::MapperExtensions
42
- --------------------------------------------------------
43
-
44
- *vendor/plugins/yaffle/lib/routing.rb*
45
-
46
- [source, ruby]
47
- --------------------------------------------------------
48
- module Yaffle #:nodoc:
49
- module Routing #:nodoc:
50
- module MapperExtensions
51
- def yaffles
52
- @set.add_route("/yaffles", {:controller => "yaffles_controller", :action => "index"})
53
- end
54
- end
55
- end
56
- end
57
- --------------------------------------------------------
58
-
59
- *config/routes.rb*
60
-
61
- [source, ruby]
62
- --------------------------------------------------------
63
- ActionController::Routing::Routes.draw do |map|
64
- ...
65
- map.yaffles
66
- end
67
- --------------------------------------------------------
68
-
69
- You can also see if your routes work by running `rake routes` from your app directory.
@@ -1 +0,0 @@
1
- http://www.mbleigh.com/2008/6/11/gemplugins-a-brief-introduction-to-the-future-of-rails-plugins
@@ -1,89 +0,0 @@
1
- == Add a custom generator command ==
2
-
3
- You may have noticed above that you can used one of the built-in rails migration commands `migration_template`. If your plugin needs to add and remove lines of text from existing files you will need to write your own generator methods.
4
-
5
- This section describes how you you can create your own commands to add and remove a line of text from 'routes.rb'. This example creates a very simple method that adds or removes a text file.
6
-
7
- To start, add the following test method:
8
-
9
- *vendor/plugins/yaffle/test/generator_test.rb*
10
-
11
- [source, ruby]
12
- -----------------------------------------------------------
13
- def test_generates_definition
14
- Rails::Generator::Scripts::Generate.new.run(["yaffle", "bird"], :destination => fake_rails_root)
15
- definition = File.read(File.join(fake_rails_root, "definition.txt"))
16
- assert_match /Yaffle\:/, definition
17
- end
18
- -----------------------------------------------------------
19
-
20
- Run `rake` to watch the test fail, then make the test pass add the following:
21
-
22
- *vendor/plugins/yaffle/generators/yaffle/templates/definition.txt*
23
-
24
- -----------------------------------------------------------
25
- Yaffle: A bird
26
- -----------------------------------------------------------
27
-
28
- *vendor/plugins/yaffle/lib/yaffle.rb*
29
-
30
- [source, ruby]
31
- -----------------------------------------------------------
32
- require "yaffle/commands"
33
- -----------------------------------------------------------
34
-
35
- *vendor/plugins/yaffle/lib/commands.rb*
36
-
37
- [source, ruby]
38
- -----------------------------------------------------------
39
- require 'rails_generator'
40
- require 'rails_generator/commands'
41
-
42
- module Yaffle #:nodoc:
43
- module Generator #:nodoc:
44
- module Commands #:nodoc:
45
- module Create
46
- def yaffle_definition
47
- file("definition.txt", "definition.txt")
48
- end
49
- end
50
-
51
- module Destroy
52
- def yaffle_definition
53
- file("definition.txt", "definition.txt")
54
- end
55
- end
56
-
57
- module List
58
- def yaffle_definition
59
- file("definition.txt", "definition.txt")
60
- end
61
- end
62
-
63
- module Update
64
- def yaffle_definition
65
- file("definition.txt", "definition.txt")
66
- end
67
- end
68
- end
69
- end
70
- end
71
-
72
- Rails::Generator::Commands::Create.send :include, Yaffle::Generator::Commands::Create
73
- Rails::Generator::Commands::Destroy.send :include, Yaffle::Generator::Commands::Destroy
74
- Rails::Generator::Commands::List.send :include, Yaffle::Generator::Commands::List
75
- Rails::Generator::Commands::Update.send :include, Yaffle::Generator::Commands::Update
76
- -----------------------------------------------------------
77
-
78
- Finally, call your new method in the manifest:
79
-
80
- *vendor/plugins/yaffle/generators/yaffle/yaffle_generator.rb*
81
-
82
- [source, ruby]
83
- -----------------------------------------------------------
84
- class YaffleGenerator < Rails::Generator::NamedBase
85
- def manifest
86
- m.yaffle_definition
87
- end
88
- end
89
- -----------------------------------------------------------
@@ -1,51 +0,0 @@
1
- == Add a helper ==
2
-
3
- This section describes how to add a helper named 'WoodpeckersHelper' to your plugin that will behave the same as a helper in your main app. This is very similar to adding a model and a controller.
4
-
5
- You can test your plugin's helper as you would test any other helper:
6
-
7
- *vendor/plugins/yaffle/test/woodpeckers_helper_test.rb*
8
-
9
- [source, ruby]
10
- ---------------------------------------------------------------
11
- require File.dirname(__FILE__) + '/test_helper.rb'
12
- include WoodpeckersHelper
13
-
14
- class WoodpeckersHelperTest < Test::Unit::TestCase
15
- def test_tweet
16
- assert_equal "Tweet! Hello", tweet("Hello")
17
- end
18
- end
19
- ---------------------------------------------------------------
20
-
21
- This is just a simple test to make sure the helper is being loaded correctly. After watching it fail with `rake`, you can make it pass like so:
22
-
23
- *vendor/plugins/yaffle/lib/yaffle.rb:*
24
-
25
- [source, ruby]
26
- ----------------------------------------------
27
- %w{ models controllers helpers }.each do |dir|
28
- path = File.join(File.dirname(__FILE__), 'app', dir)
29
- $LOAD_PATH << path
30
- ActiveSupport::Dependencies.load_paths << path
31
- ActiveSupport::Dependencies.load_once_paths.delete(path)
32
- end
33
-
34
- ActionView::Base.send :include, WoodpeckersHelper
35
- ----------------------------------------------
36
-
37
-
38
- *vendor/plugins/yaffle/lib/app/helpers/woodpeckers_helper.rb:*
39
-
40
- [source, ruby]
41
- ----------------------------------------------
42
- module WoodpeckersHelper
43
-
44
- def tweet(text)
45
- "Tweet! #{text}"
46
- end
47
-
48
- end
49
- ----------------------------------------------
50
-
51
- Now your test should be passing, and you should be able to use the Woodpeckers helper in your app.
@@ -1,52 +0,0 @@
1
- The Basics of Creating Rails Plugins
2
- ====================================
3
-
4
- A Rails plugin is either an extension or a modification of the core framework. Plugins provide:
5
-
6
- * a way for developers to share bleeding-edge ideas without hurting the stable code base
7
- * a segmented architecture so that units of code can be fixed or updated on their own release schedule
8
- * an outlet for the core developers so that they don’t have to include every cool new feature under the sun
9
-
10
- After reading this guide you should be familiar with:
11
-
12
- * Creating a plugin from scratch
13
- * Writing and running tests for the plugin
14
- * Storing models, views, controllers, helpers and even other plugins in your plugins
15
- * Writing generators
16
- * Writing custom Rake tasks in your plugin
17
- * Generating RDoc documentation for your plugin
18
- * Avoiding common pitfalls with 'init.rb'
19
-
20
- This guide describes how to build a test-driven plugin that will:
21
-
22
- * Extend core ruby classes like Hash and String
23
- * Add methods to ActiveRecord::Base in the tradition of the 'acts_as' plugins
24
- * Add a view helper that can be used in erb templates
25
- * Add a new generator that will generate a migration
26
- * Add a custom generator command
27
- * A custom route method that can be used in routes.rb
28
-
29
- For the purpose of this guide pretend for a moment that you are an avid bird watcher. Your favorite bird is the Yaffle, and you want to create a plugin that allows other developers to share in the Yaffle goodness. First, you need to get setup for development.
30
-
31
-
32
- include::test_setup.txt[]
33
-
34
- include::core_ext.txt[]
35
-
36
- include::acts_as_yaffle.txt[]
37
-
38
- include::migration_generator.txt[]
39
-
40
- include::generator_method.txt[]
41
-
42
- include::models.txt[]
43
-
44
- include::controllers.txt[]
45
-
46
- include::helpers.txt[]
47
-
48
- include::custom_route.txt[]
49
-
50
- include::odds_and_ends.txt[]
51
-
52
- include::appendix.txt[]