rails 2.2.2 → 3.0.0
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.
- data/bin/rails +8 -18
- metadata +118 -452
- data/CHANGELOG +0 -2071
- data/MIT-LICENSE +0 -20
- data/README +0 -256
- data/Rakefile +0 -411
- data/bin/about +0 -4
- data/bin/console +0 -3
- data/bin/dbconsole +0 -3
- data/bin/destroy +0 -3
- data/bin/generate +0 -3
- data/bin/performance/benchmarker +0 -3
- data/bin/performance/profiler +0 -3
- data/bin/performance/request +0 -3
- data/bin/plugin +0 -3
- data/bin/process/inspector +0 -3
- data/bin/process/reaper +0 -3
- data/bin/process/spawner +0 -3
- data/bin/runner +0 -3
- data/bin/server +0 -3
- data/builtin/rails_info/rails/info.rb +0 -125
- data/builtin/rails_info/rails/info_controller.rb +0 -9
- data/builtin/rails_info/rails/info_helper.rb +0 -2
- data/builtin/rails_info/rails_info_controller.rb +0 -2
- data/config.ru +0 -17
- data/configs/apache.conf +0 -40
- data/configs/databases/frontbase.yml +0 -28
- data/configs/databases/ibm_db.yml +0 -62
- data/configs/databases/mysql.yml +0 -57
- data/configs/databases/oracle.yml +0 -39
- data/configs/databases/postgresql.yml +0 -51
- data/configs/databases/sqlite2.yml +0 -19
- data/configs/databases/sqlite3.yml +0 -22
- data/configs/empty.log +0 -0
- data/configs/initializers/inflections.rb +0 -10
- data/configs/initializers/mime_types.rb +0 -5
- data/configs/initializers/new_rails_defaults.rb +0 -17
- data/configs/lighttpd.conf +0 -54
- data/configs/locales/en.yml +0 -5
- data/configs/routes.rb +0 -43
- data/dispatches/dispatch.fcgi +0 -24
- data/dispatches/dispatch.rb +0 -10
- data/dispatches/gateway.cgi +0 -97
- data/doc/README_FOR_APP +0 -5
- data/doc/guides/html/2_2_release_notes.html +0 -1185
- data/doc/guides/html/actioncontroller_basics.html +0 -1270
- data/doc/guides/html/activerecord_validations_callbacks.html +0 -749
- data/doc/guides/html/association_basics.html +0 -2585
- data/doc/guides/html/authors.html +0 -240
- data/doc/guides/html/benchmarking_and_profiling.html +0 -1018
- data/doc/guides/html/caching_with_rails.html +0 -583
- data/doc/guides/html/command_line.html +0 -434
- data/doc/guides/html/configuring.html +0 -438
- data/doc/guides/html/creating_plugins.html +0 -1594
- data/doc/guides/html/debugging_rails_applications.html +0 -1175
- data/doc/guides/html/finders.html +0 -1090
- data/doc/guides/html/form_helpers.html +0 -638
- data/doc/guides/html/getting_started_with_rails.html +0 -2066
- data/doc/guides/html/index.html +0 -349
- data/doc/guides/html/layouts_and_rendering.html +0 -1406
- data/doc/guides/html/migrations.html +0 -921
- data/doc/guides/html/routing_outside_in.html +0 -2213
- data/doc/guides/html/security.html +0 -1346
- data/doc/guides/html/testing_rails_applications.html +0 -1859
- data/doc/guides/source/2_2_release_notes.txt +0 -435
- data/doc/guides/source/actioncontroller_basics/changelog.txt +0 -5
- data/doc/guides/source/actioncontroller_basics/cookies.txt +0 -34
- data/doc/guides/source/actioncontroller_basics/csrf.txt +0 -32
- data/doc/guides/source/actioncontroller_basics/filters.txt +0 -119
- data/doc/guides/source/actioncontroller_basics/http_auth.txt +0 -24
- data/doc/guides/source/actioncontroller_basics/index.txt +0 -40
- data/doc/guides/source/actioncontroller_basics/introduction.txt +0 -9
- data/doc/guides/source/actioncontroller_basics/methods.txt +0 -39
- data/doc/guides/source/actioncontroller_basics/parameter_filtering.txt +0 -14
- data/doc/guides/source/actioncontroller_basics/params.txt +0 -93
- data/doc/guides/source/actioncontroller_basics/request_response_objects.txt +0 -43
- data/doc/guides/source/actioncontroller_basics/rescue.txt +0 -67
- data/doc/guides/source/actioncontroller_basics/session.txt +0 -187
- data/doc/guides/source/actioncontroller_basics/streaming.txt +0 -91
- data/doc/guides/source/actioncontroller_basics/verification.txt +0 -40
- data/doc/guides/source/active_record_basics.txt +0 -181
- data/doc/guides/source/activerecord_validations_callbacks.txt +0 -404
- data/doc/guides/source/association_basics.txt +0 -1840
- data/doc/guides/source/authors.txt +0 -39
- data/doc/guides/source/benchmarking_and_profiling/appendix.txt +0 -95
- data/doc/guides/source/benchmarking_and_profiling/digging_deeper.txt +0 -105
- data/doc/guides/source/benchmarking_and_profiling/edge_rails_features.txt +0 -185
- data/doc/guides/source/benchmarking_and_profiling/gameplan.txt +0 -27
- data/doc/guides/source/benchmarking_and_profiling/index.txt +0 -242
- data/doc/guides/source/benchmarking_and_profiling/rubyprof.txt +0 -179
- data/doc/guides/source/benchmarking_and_profiling/statistics.txt +0 -57
- data/doc/guides/source/caching_with_rails.txt +0 -367
- data/doc/guides/source/command_line.txt +0 -147
- data/doc/guides/source/configuring.txt +0 -225
- data/doc/guides/source/creating_plugins/acts_as_yaffle.txt +0 -191
- data/doc/guides/source/creating_plugins/appendix.txt +0 -46
- data/doc/guides/source/creating_plugins/controllers.txt +0 -59
- data/doc/guides/source/creating_plugins/core_ext.txt +0 -123
- data/doc/guides/source/creating_plugins/custom_route.txt +0 -69
- data/doc/guides/source/creating_plugins/gem.txt +0 -1
- data/doc/guides/source/creating_plugins/generator_method.txt +0 -89
- data/doc/guides/source/creating_plugins/helpers.txt +0 -51
- data/doc/guides/source/creating_plugins/index.txt +0 -52
- data/doc/guides/source/creating_plugins/migration_generator.txt +0 -156
- data/doc/guides/source/creating_plugins/models.txt +0 -76
- data/doc/guides/source/creating_plugins/odds_and_ends.txt +0 -69
- data/doc/guides/source/creating_plugins/test_setup.txt +0 -230
- data/doc/guides/source/debugging_rails_applications.txt +0 -733
- data/doc/guides/source/finders.txt +0 -668
- data/doc/guides/source/form_helpers.txt +0 -345
- data/doc/guides/source/getting_started_with_rails.txt +0 -1256
- data/doc/guides/source/images/belongs_to.png +0 -0
- data/doc/guides/source/images/bullet.gif +0 -0
- data/doc/guides/source/images/csrf.png +0 -0
- data/doc/guides/source/images/habtm.png +0 -0
- data/doc/guides/source/images/has_many.png +0 -0
- data/doc/guides/source/images/has_many_through.png +0 -0
- data/doc/guides/source/images/has_one.png +0 -0
- data/doc/guides/source/images/has_one_through.png +0 -0
- data/doc/guides/source/images/header_backdrop.png +0 -0
- data/doc/guides/source/images/icons/README +0 -5
- data/doc/guides/source/images/icons/callouts/1.png +0 -0
- data/doc/guides/source/images/icons/callouts/10.png +0 -0
- data/doc/guides/source/images/icons/callouts/11.png +0 -0
- data/doc/guides/source/images/icons/callouts/12.png +0 -0
- data/doc/guides/source/images/icons/callouts/13.png +0 -0
- data/doc/guides/source/images/icons/callouts/14.png +0 -0
- data/doc/guides/source/images/icons/callouts/15.png +0 -0
- data/doc/guides/source/images/icons/callouts/2.png +0 -0
- data/doc/guides/source/images/icons/callouts/3.png +0 -0
- data/doc/guides/source/images/icons/callouts/4.png +0 -0
- data/doc/guides/source/images/icons/callouts/5.png +0 -0
- data/doc/guides/source/images/icons/callouts/6.png +0 -0
- data/doc/guides/source/images/icons/callouts/7.png +0 -0
- data/doc/guides/source/images/icons/callouts/8.png +0 -0
- data/doc/guides/source/images/icons/callouts/9.png +0 -0
- data/doc/guides/source/images/icons/caution.png +0 -0
- data/doc/guides/source/images/icons/example.png +0 -0
- data/doc/guides/source/images/icons/home.png +0 -0
- data/doc/guides/source/images/icons/important.png +0 -0
- data/doc/guides/source/images/icons/next.png +0 -0
- data/doc/guides/source/images/icons/note.png +0 -0
- data/doc/guides/source/images/icons/prev.png +0 -0
- data/doc/guides/source/images/icons/tip.png +0 -0
- data/doc/guides/source/images/icons/up.png +0 -0
- data/doc/guides/source/images/icons/warning.png +0 -0
- data/doc/guides/source/images/polymorphic.png +0 -0
- data/doc/guides/source/images/rails_logo_remix.gif +0 -0
- data/doc/guides/source/images/ruby_on_rails_by_mike_rundle2.gif +0 -0
- data/doc/guides/source/images/session_fixation.png +0 -0
- data/doc/guides/source/index.txt +0 -118
- data/doc/guides/source/layouts_and_rendering.txt +0 -982
- data/doc/guides/source/migrations/anatomy_of_a_migration.txt +0 -85
- data/doc/guides/source/migrations/changelog.txt +0 -5
- data/doc/guides/source/migrations/creating_a_migration.txt +0 -109
- data/doc/guides/source/migrations/foreign_keys.txt +0 -8
- data/doc/guides/source/migrations/index.txt +0 -22
- data/doc/guides/source/migrations/rakeing_around.txt +0 -111
- data/doc/guides/source/migrations/scheming.txt +0 -47
- data/doc/guides/source/migrations/using_models_in_migrations.txt +0 -46
- data/doc/guides/source/migrations/writing_a_migration.txt +0 -159
- data/doc/guides/source/routing_outside_in.txt +0 -986
- data/doc/guides/source/security.txt +0 -984
- data/doc/guides/source/stylesheets/base.css +0 -358
- data/doc/guides/source/stylesheets/forms.css +0 -35
- data/doc/guides/source/stylesheets/more.css +0 -82
- data/doc/guides/source/templates/guides.html.erb +0 -97
- data/doc/guides/source/templates/inline.css +0 -165
- data/doc/guides/source/testing_rails_applications.txt +0 -995
- data/environments/boot.rb +0 -109
- data/environments/development.rb +0 -17
- data/environments/environment.rb +0 -75
- data/environments/production.rb +0 -24
- data/environments/test.rb +0 -22
- data/fresh_rakefile +0 -10
- data/helpers/application.rb +0 -15
- data/helpers/application_helper.rb +0 -3
- data/helpers/performance_test.rb +0 -9
- data/helpers/test_helper.rb +0 -38
- data/html/404.html +0 -30
- data/html/422.html +0 -30
- data/html/500.html +0 -33
- data/html/favicon.ico +0 -0
- data/html/images/rails.png +0 -0
- data/html/index.html +0 -274
- data/html/javascripts/application.js +0 -2
- data/html/javascripts/controls.js +0 -963
- data/html/javascripts/dragdrop.js +0 -973
- data/html/javascripts/effects.js +0 -1128
- data/html/javascripts/prototype.js +0 -4320
- data/html/robots.txt +0 -5
- data/lib/code_statistics.rb +0 -107
- data/lib/commands.rb +0 -17
- data/lib/commands/about.rb +0 -3
- data/lib/commands/console.rb +0 -45
- data/lib/commands/dbconsole.rb +0 -67
- data/lib/commands/destroy.rb +0 -6
- data/lib/commands/generate.rb +0 -6
- data/lib/commands/ncgi/listener +0 -86
- data/lib/commands/ncgi/tracker +0 -69
- data/lib/commands/performance/benchmarker.rb +0 -24
- data/lib/commands/performance/profiler.rb +0 -50
- data/lib/commands/performance/request.rb +0 -6
- data/lib/commands/plugin.rb +0 -967
- data/lib/commands/process/inspector.rb +0 -68
- data/lib/commands/process/reaper.rb +0 -149
- data/lib/commands/process/spawner.rb +0 -219
- data/lib/commands/process/spinner.rb +0 -57
- data/lib/commands/runner.rb +0 -48
- data/lib/commands/server.rb +0 -49
- data/lib/commands/servers/base.rb +0 -31
- data/lib/commands/servers/lighttpd.rb +0 -94
- data/lib/commands/servers/mongrel.rb +0 -69
- data/lib/commands/servers/new_mongrel.rb +0 -16
- data/lib/commands/servers/thin.rb +0 -25
- data/lib/commands/servers/webrick.rb +0 -66
- data/lib/commands/update.rb +0 -4
- data/lib/console_app.rb +0 -30
- data/lib/console_sandbox.rb +0 -6
- data/lib/console_with_helpers.rb +0 -26
- data/lib/dispatcher.rb +0 -24
- data/lib/fcgi_handler.rb +0 -237
- data/lib/initializer.rb +0 -1038
- data/lib/performance_test_help.rb +0 -5
- data/lib/rails/gem_builder.rb +0 -21
- data/lib/rails/gem_dependency.rb +0 -251
- data/lib/rails/mongrel_server/commands.rb +0 -342
- data/lib/rails/mongrel_server/handler.rb +0 -55
- data/lib/rails/plugin.rb +0 -124
- data/lib/rails/plugin/loader.rb +0 -152
- data/lib/rails/plugin/locator.rb +0 -100
- data/lib/rails/rack.rb +0 -6
- data/lib/rails/rack/logger.rb +0 -28
- data/lib/rails/rack/static.rb +0 -35
- data/lib/rails/vendor_gem_source_index.rb +0 -140
- data/lib/rails/version.rb +0 -9
- data/lib/rails_generator.rb +0 -43
- data/lib/rails_generator/base.rb +0 -263
- data/lib/rails_generator/commands.rb +0 -616
- data/lib/rails_generator/generated_attribute.rb +0 -46
- data/lib/rails_generator/generators/applications/app/USAGE +0 -9
- data/lib/rails_generator/generators/applications/app/app_generator.rb +0 -184
- data/lib/rails_generator/generators/components/controller/USAGE +0 -29
- data/lib/rails_generator/generators/components/controller/controller_generator.rb +0 -37
- data/lib/rails_generator/generators/components/controller/templates/controller.rb +0 -7
- data/lib/rails_generator/generators/components/controller/templates/functional_test.rb +0 -8
- data/lib/rails_generator/generators/components/controller/templates/helper.rb +0 -2
- data/lib/rails_generator/generators/components/controller/templates/view.html.erb +0 -2
- data/lib/rails_generator/generators/components/integration_test/USAGE +0 -8
- data/lib/rails_generator/generators/components/integration_test/integration_test_generator.rb +0 -16
- data/lib/rails_generator/generators/components/integration_test/templates/integration_test.rb +0 -10
- data/lib/rails_generator/generators/components/mailer/USAGE +0 -16
- data/lib/rails_generator/generators/components/mailer/mailer_generator.rb +0 -30
- data/lib/rails_generator/generators/components/mailer/templates/fixture.erb +0 -3
- data/lib/rails_generator/generators/components/mailer/templates/fixture.rhtml +0 -0
- data/lib/rails_generator/generators/components/mailer/templates/mailer.rb +0 -15
- data/lib/rails_generator/generators/components/mailer/templates/unit_test.rb +0 -20
- data/lib/rails_generator/generators/components/mailer/templates/view.erb +0 -3
- data/lib/rails_generator/generators/components/mailer/templates/view.rhtml +0 -0
- data/lib/rails_generator/generators/components/migration/USAGE +0 -29
- data/lib/rails_generator/generators/components/migration/migration_generator.rb +0 -20
- data/lib/rails_generator/generators/components/migration/templates/migration.rb +0 -11
- data/lib/rails_generator/generators/components/model/USAGE +0 -27
- data/lib/rails_generator/generators/components/model/model_generator.rb +0 -45
- data/lib/rails_generator/generators/components/model/templates/fixtures.yml +0 -19
- data/lib/rails_generator/generators/components/model/templates/migration.rb +0 -16
- data/lib/rails_generator/generators/components/model/templates/model.rb +0 -5
- data/lib/rails_generator/generators/components/model/templates/unit_test.rb +0 -8
- data/lib/rails_generator/generators/components/observer/USAGE +0 -13
- data/lib/rails_generator/generators/components/observer/observer_generator.rb +0 -16
- data/lib/rails_generator/generators/components/observer/templates/observer.rb +0 -2
- data/lib/rails_generator/generators/components/observer/templates/unit_test.rb +0 -8
- data/lib/rails_generator/generators/components/performance_test/USAGE +0 -8
- data/lib/rails_generator/generators/components/performance_test/performance_test_generator.rb +0 -16
- data/lib/rails_generator/generators/components/performance_test/templates/performance_test.rb +0 -9
- data/lib/rails_generator/generators/components/plugin/USAGE +0 -25
- data/lib/rails_generator/generators/components/plugin/plugin_generator.rb +0 -39
- data/lib/rails_generator/generators/components/plugin/templates/MIT-LICENSE +0 -20
- data/lib/rails_generator/generators/components/plugin/templates/README +0 -13
- data/lib/rails_generator/generators/components/plugin/templates/Rakefile +0 -23
- data/lib/rails_generator/generators/components/plugin/templates/USAGE +0 -8
- data/lib/rails_generator/generators/components/plugin/templates/generator.rb +0 -8
- data/lib/rails_generator/generators/components/plugin/templates/init.rb +0 -1
- data/lib/rails_generator/generators/components/plugin/templates/install.rb +0 -1
- data/lib/rails_generator/generators/components/plugin/templates/plugin.rb +0 -1
- data/lib/rails_generator/generators/components/plugin/templates/tasks.rake +0 -4
- data/lib/rails_generator/generators/components/plugin/templates/test_helper.rb +0 -3
- data/lib/rails_generator/generators/components/plugin/templates/uninstall.rb +0 -1
- data/lib/rails_generator/generators/components/plugin/templates/unit_test.rb +0 -8
- data/lib/rails_generator/generators/components/resource/USAGE +0 -23
- data/lib/rails_generator/generators/components/resource/resource_generator.rb +0 -74
- data/lib/rails_generator/generators/components/resource/templates/controller.rb +0 -2
- data/lib/rails_generator/generators/components/resource/templates/functional_test.rb +0 -8
- data/lib/rails_generator/generators/components/resource/templates/helper.rb +0 -2
- data/lib/rails_generator/generators/components/scaffold/USAGE +0 -29
- data/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb +0 -100
- data/lib/rails_generator/generators/components/scaffold/templates/controller.rb +0 -85
- data/lib/rails_generator/generators/components/scaffold/templates/functional_test.rb +0 -45
- data/lib/rails_generator/generators/components/scaffold/templates/helper.rb +0 -2
- data/lib/rails_generator/generators/components/scaffold/templates/layout.html.erb +0 -17
- data/lib/rails_generator/generators/components/scaffold/templates/style.css +0 -54
- data/lib/rails_generator/generators/components/scaffold/templates/view_edit.html.erb +0 -18
- data/lib/rails_generator/generators/components/scaffold/templates/view_index.html.erb +0 -24
- data/lib/rails_generator/generators/components/scaffold/templates/view_new.html.erb +0 -17
- data/lib/rails_generator/generators/components/scaffold/templates/view_show.html.erb +0 -10
- data/lib/rails_generator/generators/components/session_migration/USAGE +0 -10
- data/lib/rails_generator/generators/components/session_migration/session_migration_generator.rb +0 -18
- data/lib/rails_generator/generators/components/session_migration/templates/migration.rb +0 -16
- data/lib/rails_generator/lookup.rb +0 -249
- data/lib/rails_generator/manifest.rb +0 -53
- data/lib/rails_generator/options.rb +0 -150
- data/lib/rails_generator/scripts.rb +0 -89
- data/lib/rails_generator/scripts/destroy.rb +0 -29
- data/lib/rails_generator/scripts/generate.rb +0 -7
- data/lib/rails_generator/scripts/update.rb +0 -12
- data/lib/rails_generator/secret_key_generator.rb +0 -22
- data/lib/rails_generator/simple_logger.rb +0 -46
- data/lib/rails_generator/spec.rb +0 -44
- data/lib/railties_path.rb +0 -1
- data/lib/ruby_version_check.rb +0 -17
- data/lib/rubyprof_ext.rb +0 -35
- data/lib/source_annotation_extractor.rb +0 -102
- data/lib/tasks/annotations.rake +0 -20
- data/lib/tasks/databases.rake +0 -416
- data/lib/tasks/documentation.rake +0 -95
- data/lib/tasks/framework.rake +0 -118
- data/lib/tasks/gems.rake +0 -80
- data/lib/tasks/log.rake +0 -9
- data/lib/tasks/misc.rake +0 -56
- data/lib/tasks/rails.rb +0 -8
- data/lib/tasks/routes.rake +0 -17
- data/lib/tasks/statistics.rake +0 -18
- data/lib/tasks/testing.rake +0 -139
- data/lib/tasks/tmp.rake +0 -37
- data/lib/test_help.rb +0 -27
- data/lib/webrick_server.rb +0 -156
@@ -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[]
|