Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

r3022@ks: jeremy | 2005-11-12 18:40:42 -0800

 merge to stable
 r3024@ks:  jeremy | 2005-11-12 19:00:49 -0800
 Apply [2992] to stable.  SQLite: the clone_structure_to_test and purge_test_database Rake tasks should always use the test environment.  References #2846.
 r3027@ks:  jeremy | 2005-11-12 22:37:45 -0800
 Apply [2994] to stable.  PostgreSQL: correct the sequence discovery fallback query.  References #2594.
 r3033@ks:  jeremy | 2005-11-12 23:27:13 -0800
 Apply [2996] to stable.  Much faster Oracle column reflection.  Closes #2848.
 r3037@ks:  jeremy | 2005-11-13 00:11:26 -0800
 Apply [2998] to stable.  PostgreSQL: last_insert_id uses select_value rather than using @connection.exec directly.
 r3053@ks:  jeremy | 2005-11-13 14:37:39 -0800
 Only include builtin filters whose filenames match /^[a-z][a-z_]*_helper.rb$/ to avoid including operating system metadata such as ._foo_helper.rb.  Closes #2855.
 r3055@ks:  jeremy | 2005-11-13 14:48:48 -0800
 Apply [3009] to stable:  Reapply [2942] which was elided by [2997].  References #2788.
 r3058@ks:  jeremy | 2005-11-13 16:09:17 -0800
 Apply [3013] to stable.  Note that the ruby-memcache bindings are required to use the memcache store.  Closes #2857.
 r3063@ks:  jeremy | 2005-11-13 16:13:51 -0800
 Apply [3015] to stable.  Update documentation for render :file.  Closes #2858.
 r3066@ks:  jeremy | 2005-11-13 20:24:18 -0800
 Apply [3017] to stable.  Update documentation for Migrations.  Closes #2861.
 r3070@ks:  jeremy | 2005-11-13 20:54:50 -0800
 Apply [3019] to stable.  Oracle: test case for column default parsing.  Closes #2788.
 r3073@ks:  jeremy | 2005-11-13 23:42:32 -0800
 Apply [3021] to stable.  Correct documentation for Base.delete_all.  Closes #1568.
 r3077@ks:  jeremy | 2005-11-14 14:28:21 -0800
 Apply [3035] to stable.  SQLServer: insert uses given primary key value if not nil rather than SELECT @@IDENTITY.  Closes #2866.
 r3120@ks:  jeremy | 2005-11-16 13:34:45 -0800
 Apply [3060] to stable.  Remove the unused, slow response_dump and session_dump variables from error pages.  Closes #1222.
 r3130@ks:  jeremy | 2005-11-16 14:37:47 -0800
 Apply [3063] to stable.  Remove CHANGELOG from apidoc Rake task since it isn't included with new apps anymore.
 r3148@ks:  jeremy | 2005-11-17 12:45:44 -0800
 Apply [3074] to stable.  Don't add the same conditions twice in has_one finder sql.  Closes #2916.
 r3149@ks:  jeremy | 2005-11-17 12:47:36 -0800
 Apply [3075] to stable.  Document :force option to create_table.  Closes #2921.
 r3157@ks:  jeremy | 2005-11-17 21:27:39 -0800
 Apply [3081] to stable.  Eliminate nil from newly generated logfiles.  Closes #2927.
 r3167@ks:  jeremy | 2005-11-18 22:47:31 -0800
 Apply [3089] to stable.  Don't generate read methods for columns whose names are not valid ruby method names.  Closes #2946.
 r3174@ks:  jeremy | 2005-11-19 01:53:00 -0800
 Apply [3092] to stable.  Correct boolean handling in generated reader methods.  Closes #2945.
 r3178@ks:  jeremy | 2005-11-19 01:59:47 -0800
 Apply [3094] to stable.  Use query methods rather than readers in boolean tests for [3092].  References #2949.
 r3190@ks:  jeremy | 2005-11-19 20:20:48 -0800
 Apply [3098] to stable.  Introducing the session_migration generator.  Creates an add_session_table migration.  Closes #2958.
 r3199@ks:  jeremy | 2005-11-19 21:13:22 -0800
 Apply [3101] to stable.  Allows generator to specify migrations directory.  Closes #2960.
 r3201@ks:  jeremy | 2005-11-19 21:31:47 -0800
 Apply [3103] to stable.  Document request.env and request.host.  Strip trailing whitespace.
 r3258@ks:  jeremy | 2005-11-21 00:33:59 -0800
 Apply [3139] to stable.  Use Kernel.binding rather than binding to allow columns of that name.  Closes #2973.
 r3269@ks:  jeremy | 2005-11-21 04:46:40 -0800
 Apply [3148] to stable.  Simpler Mysql load test.
 r3285@ks:  jeremy | 2005-11-22 13:33:04 -0800
 Apply [3162] to stable.  Model generator: correct relative path to test_helper in unit test.
 r3296@ks:  jeremy | 2005-11-23 13:38:56 -0800
 Apply [3170] to stable.  Credit ticket author.  References #2888.
 r3303@ks:  jeremy | 2005-11-23 17:14:31 -0800
 Apply [3051], [3052], [3053], [3059] to stable.  Brings the Firebird adapter to 1.0.  References #1874.
 r3305@ks:  jeremy | 2005-11-23 17:33:51 -0800
 Apply [3151] to stable.  Don't put flash in session if sessions are disabled.
 r3306@ks:  jeremy | 2005-11-23 17:39:24 -0800
 Apply [3100], [3108] to stable.  Makes new ActiveRecordStore sessions work correctly with components.
 r3307@ks:  jeremy | 2005-11-23 17:52:14 -0800
 Apply [3110] to stable.  PostgreSQL: the purge_test_database Rake task shouldn't explicitly specify the template0 template when creating a fresh test database.  References #2964.
 r3313@ks:  jeremy | 2005-11-23 23:03:36 -0800
 Apply [3182] to stable.  Reloading a model doesn't lose track of its connection.  Closes #2996.
 r3315@ks:  jeremy | 2005-11-23 23:13:48 -0800
 Apply [3184] to stable.  SQLServer: resolve column aliasing/quoting collision when using limit or offset in an eager find.  Closes #2974.
 r3339@ks:  jeremy | 2005-12-01 17:03:16 -0800
 Apply [3202] to stable.  Firebird: updated for FireRuby 0.4.0.  Closes #3009.
 r3363@ks:  jeremy | 2005-12-06 22:26:27 -0800
 Apply #428 changesets to stable: r3000, r3001, r3002, r3025, r3045, r3096, r3148, r3152, r3165, r3189, r3195, r3205, r3216, r3219, r3221, r3222.  Closes #428.
 r3372@ks:  jeremy | 2005-12-07 20:25:20 -0800
 Apply [3233] to stable.  Oracle: use syntax compatible with Oracle 8.  Closes #3131.
 r3375@ks:  jeremy | 2005-12-07 20:36:13 -0800
 Apply [3235] to stable.  PostgreSQL: more robust sequence name discovery.  Closes #3087.
 r3378@ks:  jeremy | 2005-12-07 20:41:47 -0800
 Apply [3237] to stable.  More robust relative url root discovery for SCGI compatibility.  This solves the 'SCGI routes problem' -- you no longer need to prefix all your routes with the name of the SCGI mountpoint.  Closes #3070.
 r3379@ks:  jeremy | 2005-12-07 20:42:31 -0800
 Don't warn on keep_flash in test.
 r3387@ks:  jeremy | 2005-12-07 20:48:42 -0800
 Apply [3242] to stable.  Reloading an instance refreshes its aggregations as well as its associations.  Closes #3024.
 r3389@ks:  jeremy | 2005-12-07 20:52:39 -0800
 Apply [3244] to stable.  SQLite: find database file when RAILS_ROOT is a symlink.  Closes #3116.
 r3392@ks:  jeremy | 2005-12-07 21:10:42 -0800
 Apply [3246] to stable.  MySQL: more robust test for nullified result hashes.  Closes #3124.
 r3401@ks:  jeremy | 2005-12-07 23:30:11 -0800
 Apply [3252] to stable.  Oracle: active? performs a select instead of a commit.  Closes #3133.
 r3404@ks:  jeremy | 2005-12-08 15:24:44 -0800
 Apply [3254] to stable.  Fix some test failures due to MySQL assumptions.  References #3149.
 r3407@ks:  jeremy | 2005-12-09 10:39:00 -0800
 Apply [3256] to stable.  Generator copies files in binary mode.  Closes #3156.
 r3410@ks:  jeremy | 2005-12-09 10:48:32 -0800
 Apply [3258] to stable.  Fix shebang handling for empty files.  Closes #2927.
 r3413@ks:  jeremy | 2005-12-09 15:03:42 -0800
 Apply [3260] to stable.  Fix bundled mysql.rb to correctly check for PROTO_41.  Fixed scramble41 with nil password.  Fixed change_user with PROTO_41.
 r3416@ks:  jeremy | 2005-12-09 15:07:21 -0800
 Apply [3262] to stable.  Generator looks in vendor/generators also.
 r3419@ks:  jeremy | 2005-12-09 15:36:50 -0800
 Apply [3165] to stable. MySQL, PostgreSQL: reconnect! also reconfigures the connection. Otherwise, the connection 'loses' its settings if it times out and is reconnected. References #2978.
 r3420@ks:  jeremy | 2005-12-09 15:38:30 -0800
 Apply [3264] to stable.  MySQL: ensure that @config is set.
 r3421@ks:  jeremy | 2005-12-09 15:42:40 -0800
 Apply [3265] to stable.  Name vendor/generators source differently from lib/generators source.
 r3429@ks:  jeremy | 2005-12-09 16:55:16 -0800
 Apply [3270] SQLServer rollup to stable.
 r3435@ks:  jeremy | 2005-12-10 13:40:43 -0800
 Apply [3274] to stable.  MySQL: fixes for the bundled mysql.rb driver.  Closes #3160.
 r3457@ks:  jeremy | 2005-12-13 08:52:39 -0800
 Apply [3293] to stable.  MySQL: allow encoding option for mysql.rb driver.
 r3458@ks:  jeremy | 2005-12-13 09:33:50 -0800
 Roll back [3245] on stable.  References #3116.
 r3465@ks:  jeremy | 2005-12-13 10:15:33 -0800
 Apply [3298] to stable.  Don't used defined? on a scoped constant since it results in a const_missing call.
 r3724@ks:  jeremy | 2006-02-09 10:13:41 -0800
 Apply [3554] to stable. PostgreSQL: correctly parse negative integer column defaults. Closes #3776.
 r3730@ks:  jeremy | 2006-02-09 11:42:57 -0800
 Apply [3559] to stable. Closes #3581.
 r3846@ks:  jeremy | 2006-02-26 15:24:58 -0800
 silence test/unit whining DefaultsTest is empty
 r3847@ks:  jeremy | 2006-02-26 15:26:53 -0800
 Apply [3674] to stable. Closes #3591.
 r4960@ks:  jeremy | 2006-08-06 23:56:18 -0700
 Merged to stable: change the request.env example in AC::Base docs to a var that exists (REMOTE_IP doesn't) and isn't already wrapped by a request method (i.e. request.remote_ip). References #5113.
 r4961@ks:  jeremy | 2006-08-07 00:11:59 -0700
 Merged to stable: add :status option to send_data and send_file. Defaults to '200 OK'. References #5243.
 r4962@ks:  jeremy | 2006-08-07 00:18:42 -0700
 Merged to stable: real files and symlinks should be treated the same when compiling templates. References #5438.
 r4963@ks:  jeremy | 2006-08-07 00:26:42 -0700
 Merged to stable: Added ActionController.filter_parameter_logging that makes it easy to remove passwords, credit card numbers, and other sensitive information from being logged when a request is handled. References #1897.
 r4964@ks:  jeremy | 2006-08-07 00:33:32 -0700
 Merged to stable: correct spurious documentation example code which results in a SyntaxError. References [4210].
 r4965@ks:  jeremy | 2006-08-07 00:38:04 -0700
 Merged to stable: remote_form_for can leave out the object parameter and default to the instance variable of the object_name, just like form_for. References [4215].
 r4966@ks:  jeremy | 2006-08-07 00:48:40 -0700
 Merged to stable: update inconsistent migrations documentation. References #4683.
 r4967@ks:  jeremy | 2006-08-07 00:52:34 -0700
 Merge to stable: cache CgiRequest#request_parameters so that multiple calls don't re-parse multipart data. References [4256].
 r4968@ks:  jeremy | 2006-08-07 00:55:51 -0700
 Merge to stable: only require redcloth/bluecloth if they are not already loaded. References [4257].
 r4977@ks:  jeremy | 2006-08-07 01:08:02 -0700
 Merge to stable: skip silence stderr test if we can't STDERR.tell
 r4978@ks:  jeremy | 2006-08-07 01:13:00 -0700
 Merge to stable: update layout and content_for documentation to use yield rather than magic @content_for_layout instance variables. References [4263].
 r4979@ks:  jeremy | 2006-08-07 01:16:43 -0700
 Merge to stable: add documentation for redirect_to :back's RedirectBackError exception; remove all remaining references to @params in the documentation. References [4267], [4268].
 r4980@ks:  jeremy | 2006-08-07 01:18:04 -0700
 Merge to stable: fix documentation indentation.
 r4981@ks:  jeremy | 2006-08-07 01:28:34 -0700
 Merge to stable: mention in docs that config.frameworks doesn't work when getting Rails via Gems; documentation for AbstractRequest.  References #4857, #4895.
 r4982@ks:  jeremy | 2006-08-07 01:45:26 -0700
 Merge to stable: fix syntax error in documentation. References #4679.
 r4983@ks:  jeremy | 2006-08-07 01:50:47 -0700
 Merge to stable: Enhance documentation for setting headers in integration tests. Skip auto HTTP prepending when its already there. References #4079.  Add warning about the proper way to validate the presence of a foreign key. References #4147.
 r4984@ks:  jeremy | 2006-08-07 02:08:00 -0700
 Merge to stable: ActionController::Base Summary documentation rewrite; Fix text_helper.rb documentation rendering; Fixes bad rendering of JavaScriptMacrosHelper rdoc.  References #4725, #4900, #4910.
 r4985@ks:  jeremy | 2006-08-07 02:14:18 -0700
 Merge to stable: documentation fix: integration test scripts don't require integration_test. References #4914.


git-svn-id: http://svn-commit.rubyonrails.org/rails/branches/stable@4708 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
commit 94a1758f8202eee65f167337541d102d1faeaad2 1 parent 140e85c
@jeremy jeremy authored
Showing with 475 additions and 225 deletions.
  1. +5 −0 actionmailer/CHANGELOG
  2. +1 −1  actionmailer/lib/action_mailer/base.rb
  3. +31 −3 actionpack/CHANGELOG
  4. +7 −3 actionpack/Rakefile
  5. +102 −71 actionpack/lib/action_controller/base.rb
  6. +3 −3 actionpack/lib/action_controller/caching.rb
  7. +6 −5 actionpack/lib/action_controller/cgi_process.rb
  8. +10 −6 actionpack/lib/action_controller/integration.rb
  9. +7 −5 actionpack/lib/action_controller/layout.rb
  10. +2 −2 actionpack/lib/action_controller/pagination.rb
  11. +11 −3 actionpack/lib/action_controller/request.rb
  12. +11 −6 actionpack/lib/action_controller/streaming.rb
  13. +1 −1  actionpack/lib/action_controller/templates/scaffolds/layout.rhtml
  14. +1 −1  actionpack/lib/action_controller/verification.rb
  15. +2 −1  actionpack/lib/action_view/base.rb
  16. +18 −16 actionpack/lib/action_view/helpers/capture_helper.rb
  17. +5 −4 actionpack/lib/action_view/helpers/java_script_macros_helper.rb
  18. +4 −3 actionpack/lib/action_view/helpers/prototype_helper.rb
  19. +22 −22 actionpack/lib/action_view/helpers/text_helper.rb
  20. +42 −0 actionpack/test/controller/filter_params_test.rb
  21. +15 −1 actionpack/test/controller/send_file_test.rb
  22. +134 −0 actionpack/test/template/compiled_templates_test.rb
  23. +0 −63 actionpack/test/template/compiled_templates_tests.rb
  24. +9 −0 activerecord/CHANGELOG
  25. +1 −1  activerecord/lib/active_record/base.rb
  26. +2 −2 activerecord/lib/active_record/migration.rb
  27. +12 −0 activerecord/lib/active_record/validations.rb
  28. +2 −0  activesupport/test/core_ext/kernel_test.rb
  29. +7 −0 railties/CHANGELOG
  30. +1 −1  railties/environments/environment.rb
  31. +1 −1  railties/lib/rails_generator/generators/components/scaffold/templates/layout.rhtml
View
5 actionmailer/CHANGELOG
@@ -1,5 +1,10 @@
+*SVN*
+
+* Correct spurious documentation example code which results in a SyntaxError. [Marcel Molina Jr.]
+
* Mailer template root applies to a class and its subclasses rather than acting globally. #5555 [somekool@gmail.com]
+
*1.2.3* (June 29th, 2006)
* Depend on Action Pack 1.12.3
View
2  actionmailer/lib/action_mailer/base.rb
@@ -14,7 +14,7 @@ module ActionMailer #:nodoc:
# def signup_notification(recipient)
# recipients recipient.email_address_with_name
# subject "New account information"
- # body { "account" => recipient }
+ # body "account" => recipient
# from "system@example.com"
# end
#
View
34 actionpack/CHANGELOG
@@ -1,11 +1,39 @@
-*1.12.3* (June 28th, 2006)
-=======
+*SVN*
+
+* Documentation fix: integration test scripts don't require integration_test. #4914 [Frederick Ros <sl33p3r@free.fr>]
+
+* ActionController::Base Summary documentation rewrite. #4900 [kevin.clark@gmail.com]
+
+* Fix text_helper.rb documentation rendering. #4725 [Frederick Ros]
+
+* Fixes bad rendering of JavaScriptMacrosHelper rdoc. #4910 [Frederick Ros]
+
+* Enhance documentation for setting headers in integration tests. Skip auto HTTP prepending when its already there. #4079 [Rick Olson]
+
+* Documentation for AbstractRequest. #4895 [kevin.clark@gmail.com]
+
+* Remove all remaining references to @params in the documentation. [Marcel Molina Jr.]
+
+* Add documentation for redirect_to :back's RedirectBackError exception. [Marcel Molina Jr.]
+
+* Update layout and content_for documentation to use yield rather than magic @content_for instance variables. [Marcel Molina Jr.]
+
+* Cache CgiRequest#request_parameters so that multiple calls don't re-parse multipart data. [Rick]
+
+* Fixed that remote_form_for can leave out the object parameter and default to the instance variable of the object_name, just like form_for [DHH]
+
+* Added ActionController.filter_parameter_logging that makes it easy to remove passwords, credit card numbers, and other sensitive information from being logged when a request is handled. #1897 [jeremye@bsa.ca.gov]
+
+* Fixed that real files and symlinks should be treated the same when compiling templates. #5438 [zachary@panandscan.com]
+
+* Add :status option to send_data and send_file. Defaults to '200 OK'. #5243 [Manfred Stienstra <m.stienstra@fngtps.com>]
* Update documentation for erb trim syntax. #5651 [matt@mattmargolis.net]
* Short documentation to mention use of Mime::Type.register. #5710 [choonkeat@gmail.com]
-* Pass :id => nil or :class => nil to error_messages_for to supress that html attribute. #3586 [olivier_ansaldi@yahoo.com, sebastien@goetzilla.info]
+
+*1.12.3* (June 28th, 2006)
* Fix broken traverse_to_controller. We now:
Look for a _controller.rb file under RAILS_ROOT to load.
View
10 actionpack/Rakefile
@@ -46,8 +46,12 @@ Rake::RDocTask.new { |rdoc|
rdoc.title = "Action Pack -- On rails from request to response"
rdoc.options << '--line-numbers' << '--inline-source'
rdoc.template = "#{ENV['template']}.rb" if ENV['template']
- rdoc.rdoc_files.include('README', 'RUNNING_UNIT_TESTS', 'CHANGELOG')
- rdoc.rdoc_files.include('lib/**/*.rb')
+ if ENV['DOC_FILES']
+ rdoc.rdoc_files.include(ENV['DOC_FILES'].split(/,\s*/))
+ else
+ rdoc.rdoc_files.include('README', 'RUNNING_UNIT_TESTS', 'CHANGELOG')
+ rdoc.rdoc_files.include('lib/**/*.rb')
+ end
}
# Create compressed packages
@@ -144,4 +148,4 @@ task :release => [ :package ] do
puts release_command
system(release_command)
end
-end
+end
View
173 actionpack/lib/action_controller/base.rb
@@ -49,13 +49,15 @@ def initialize(message = nil)
end
end
- # Action Controllers are made up of one or more actions that performs its purpose and then either renders a template or
- # redirects to another action. An action is defined as a public method on the controller, which will automatically be
- # made accessible to the web-server through a mod_rewrite mapping. A sample controller could look like this:
+ # Action Controllers are the core of a web request in Rails. They are made up of one or more actions that are executed
+ # on request and then either render a template or redirect to another action. An action is defined as a public method
+ # on the controller, which will automatically be made accessible to the web-server through Rails Routes.
+ #
+ # A sample controller could look like this:
#
# class GuestBookController < ActionController::Base
# def index
- # @entries = Entry.find_all
+ # @entries = Entry.find(:all)
# end
#
# def sign
@@ -64,26 +66,17 @@ def initialize(message = nil)
# end
# end
#
- # GuestBookController.template_root = "templates/"
- # GuestBookController.process_cgi
- #
- # All actions assume that you want to render a template matching the name of the action at the end of the performance
- # unless you tell it otherwise. The index action complies with this assumption, so after populating the @entries instance
- # variable, the GuestBookController will render "templates/guestbook/index.rhtml".
+ # Actions, by default, render a template in the <tt>app/views</tt> directory corresponding to the name of the controller and action
+ # after executing code in the action. For example, the +index+ action of the +GuestBookController+ would render the
+ # template <tt>app/views/guestbook/index.rhtml</tt> by default after populating the <tt>@entries</tt> instance variable.
#
- # Unlike index, the sign action isn't interested in rendering a template. So after performing its main purpose (creating a
- # new entry in the guest book), it sheds the rendering assumption and initiates a redirect instead. This redirect works by
- # returning an external "302 Moved" HTTP response that takes the user to the index action.
+ # Unlike index, the sign action will not render a template. After performing its main purpose (creating a
+ # new entry in the guest book), it initiates a redirect instead. This redirect works by returning an external
+ # "302 Moved" HTTP response that takes the user to the index action.
#
# The index and sign represent the two basic action archetypes used in Action Controllers. Get-and-show and do-and-redirect.
# Most actions are variations of these themes.
#
- # Also note that it's the final call to <tt>process_cgi</tt> that actually initiates the action performance. It will extract
- # request and response objects from the CGI
- #
- # When Action Pack is used inside of Rails, the template_root is automatically configured and you don't need to call process_cgi
- # yourself.
- #
# == Requests
#
# Requests are processed by the Action Controller framework by extracting the value of the "action" key in the request parameters.
@@ -94,16 +87,16 @@ def initialize(message = nil)
# The full request object is available with the request accessor and is primarily used to query for http headers. These queries
# are made by accessing the environment hash, like this:
#
- # def hello_ip
- # location = request.env["REMOTE_IP"]
- # render :text => "Hello stranger from #{location}"
+ # def server_ip
+ # location = request.env["SERVER_ADDR"]
+ # render :text => "This server hosted at #{location}"
# end
#
# == Parameters
#
- # All request parameters, whether they come from a GET or POST request, or from the URL, are available through the params hash.
- # So an action that was performed through /weblog/list?category=All&limit=5 will include { "category" => "All", "limit" => 5 }
- # in params.
+ # All request parameters, whether they come from a GET or POST request, or from the URL, are available through the params method
+ # which returns a hash. For example, an action that was performed through <tt>/weblog/list?category=All&limit=5</tt> will include
+ # <tt>{ "category" => "All", "limit" => 5 }</tt> in params.
#
# It's also possible to construct multi-dimensional parameter hashes by specifying keys using brackets, such as:
#
@@ -116,12 +109,12 @@ def initialize(message = nil)
#
# == Sessions
#
- # Sessions allows you to store objects in memory between requests. This is useful for objects that are not yet ready to be persisted,
+ # Sessions allows you to store objects in between requests. This is useful for objects that are not yet ready to be persisted,
# such as a Signup object constructed in a multi-paged process, or objects that don't change much and are needed all the time, such
# as a User object for a system that requires login. The session should not be used, however, as a cache for objects where it's likely
# they could be changed unknowingly. It's usually too much work to keep it all synchronized -- something databases already excel at.
#
- # You can place objects in the session by using the <tt>session</tt> hash accessor:
+ # You can place objects in the session by using the <tt>session</tt> method, which accesses a hash:
#
# session[:person] = Person.authenticate(user_name, password)
#
@@ -129,17 +122,24 @@ def initialize(message = nil)
#
# Hello #{session[:person]}
#
- # Any object can be placed in the session (as long as it can be Marshalled). But remember that 1000 active sessions each storing a
- # 50kb object could lead to a 50MB memory overhead. In other words, think carefully about size and caching before resorting to the use
- # of the session.
- #
# For removing objects from the session, you can either assign a single key to nil, like <tt>session[:person] = nil</tt>, or you can
# remove the entire session with reset_session.
#
+ # By default, sessions are stored on the file system in <tt>RAILS_ROOT/tmp/sessions</tt>. Any object can be placed in the session
+ # (as long as it can be Marshalled). But remember that 1000 active sessions each storing a 50kb object could lead to a 50MB store on the filesystem.
+ # In other words, think carefully about size and caching before resorting to the use of the session on the filesystem.
+ #
+ # An alternative to storing sessions on disk is to use ActiveRecordStore to store sessions in your database, which can solve problems
+ # caused by storing sessions in the file system and may speed up your application. To use ActiveRecordStore, uncomment the line:
+ #
+ # config.action_controller.session_store = :active_record_store
+ #
+ # in your <tt>environment.rb</tt> and run <tt>rake db:sessions:create</tt>.
+ #
# == Responses
#
# Each action results in a response, which holds the headers and document to be sent to the user's browser. The actual response
- # object is generated automatically through the use of renders and redirects, so it's normally nothing you'll need to be concerned about.
+ # object is generated automatically through the use of renders and redirects and requires no user intervention.
#
# == Renders
#
@@ -161,9 +161,9 @@ def initialize(message = nil)
# def search
# @results = Search.find(params[:query])
# case @results
- # when 0 then render :action=> "no_results"
- # when 1 then render :action=> "show"
- # when 2..10 then render :action=> "show_many"
+ # when 0 then render :action => "no_results"
+ # when 1 then render :action => "show"
+ # when 2..10 then render :action => "show_many"
# end
# end
#
@@ -171,32 +171,21 @@ def initialize(message = nil)
#
# == Redirects
#
- # Redirecting is what actions that update the model do when they're done. The <tt>save_post</tt> method shouldn't be responsible for also
- # showing the post once it's saved -- that's the job for <tt>show_post</tt>. So once <tt>save_post</tt> has completed its business, it'll
- # redirect to <tt>show_post</tt>. All redirects are external, which means that when the user refreshes his browser, it's not going to save
- # the post again, but rather just show it one more time.
- #
- # This sounds fairly simple, but the redirection is complicated by the quest for a phenomenon known as "pretty urls". Instead of accepting
- # the dreadful being that is "weblog_controller?action=show&post_id=5", Action Controller goes out of its way to represent the former as
- # "/weblog/show/5". And this is even the simple case. As an example of a more advanced pretty url consider
- # "/library/books/ISBN/0743536703/show", which can be mapped to books_controller?action=show&type=ISBN&id=0743536703.
- #
- # Redirects work by rewriting the URL of the current action. So if the show action was called by "/library/books/ISBN/0743536703/show",
- # we can redirect to an edit action simply by doing <tt>redirect_to(:action => "edit")</tt>, which could throw the user to
- # "/library/books/ISBN/0743536703/edit". Naturally, you'll need to setup the routes configuration file to point to the proper controller
- # and action in the first place, but once you have, it can be rewritten with ease.
- #
- # Let's consider a bunch of examples on how to go from "/clients/37signals/basecamp/project/dash" to somewhere else:
- #
- # redirect_to(:action => "edit") =>
- # /clients/37signals/basecamp/project/dash
- #
- # redirect_to(:client_name => "nextangle", :project_name => "rails") =>
- # /clients/nextangle/rails/project/dash
+ # Redirects are used to move from one action to another. For example, after a <tt>create</tt> action, which stores a blog entry to a database,
+ # we might like to show the user the new entry. Because we're following good DRY principles (Don't Repeat Yourself), we're going to reuse (and redirect to)
+ # a <tt>show</tt> action that we'll assume has already been created. The code might look like this:
#
- # Those redirects happen under the configuration of:
+ # def create
+ # @entry = Entry.new(params[:entry])
+ # if @entry.save
+ # # The entry was saved correctly, redirect to show
+ # redirect_to :action => 'show', :id => @entry.id
+ # else
+ # # things didn't go so well, do something else
+ # end
+ # end
#
- # map.connect 'clients/:client_name/:project_name/:controller/:action'
+ # In this case, after saving our new entry to the database, the user is redirected to the <tt>show</tt> method which is then executed.
#
# == Calling multiple redirects or renders
#
@@ -214,15 +203,6 @@ def initialize(message = nil)
# render :action => "overthere" # won't be called unless monkeys is nil
# end
#
- # == Environments
- #
- # Action Controller works out of the box with CGI, FastCGI, and mod_ruby. CGI and mod_ruby controllers are triggered just the same using:
- #
- # WeblogController.process_cgi
- #
- # FastCGI controllers are triggered using:
- #
- # FCGI.each_cgi{ |cgi| WeblogController.process_cgi(cgi) }
class Base
DEFAULT_RENDER_STATUS_CODE = "200 OK"
@@ -263,10 +243,10 @@ class Base
# Modern REST web services often need to submit complex data to the web application.
# The param_parsers hash lets you register handlers wich will process the http body and add parameters to the
- # @params hash. These handlers are invoked for post and put requests.
+ # <tt>params</tt> hash. These handlers are invoked for post and put requests.
#
# By default application/xml is enabled. A XmlSimple class with the same param name as the root will be instanciated
- # in the @params. This allows XML requests to mask themselves as regular form submissions, so you can have one
+ # in the <tt>params</tt>. This allows XML requests to mask themselves as regular form submissions, so you can have one
# action serve both regular forms and web service requests.
#
# Example of doing your own parser for a custom content type:
@@ -366,6 +346,53 @@ def hidden_actions
def hide_action(*names)
write_inheritable_attribute(:hidden_actions, hidden_actions | names.collect { |n| n.to_s })
end
+
+ # Replace sensitive paramater data from the request log.
+ # Filters paramaters that have any of the arguments as a substring.
+ # Looks in all subhashes of the param hash for keys to filter.
+ # If a block is given, each key and value of the paramater hash and all
+ # subhashes is passed to it, the value or key
+ # can be replaced using String#replace or similar method.
+ #
+ # Examples:
+ # filter_parameter_logging
+ # => Does nothing, just slows the logging process down
+ #
+ # filter_parameter_logging :password
+ # => replaces the value to all keys matching /password/i with "[FILTERED]"
+ #
+ # filter_parameter_logging :foo, "bar"
+ # => replaces the value to all keys matching /foo|bar/i with "[FILTERED]"
+ #
+ # filter_parameter_logging { |k,v| v.reverse! if k =~ /secret/i }
+ # => reverses the value to all keys matching /secret/i
+ #
+ # filter_parameter_logging(:foo, "bar") { |k,v| v.reverse! if k =~ /secret/i }
+ # => reverses the value to all keys matching /secret/i, and
+ # replaces the value to all keys matching /foo|bar/i with "[FILTERED]"
+ def filter_parameter_logging(*filter_words, &block)
+ parameter_filter = Regexp.new(filter_words.collect{ |s| s.to_s }.join('|'), true) if filter_words.length > 0
+
+ define_method(:filter_parameters) do |unfiltered_parameters|
+ filtered_parameters = {}
+
+ unfiltered_parameters.each do |key, value|
+ if key =~ parameter_filter
+ filtered_parameters[key] = '[FILTERED]'
+ elsif value.is_a?(Hash)
+ filtered_parameters[key] = filter_parameters(value)
+ elsif block_given?
+ key, value = key.dup, value.dup
+ yield key, value
+ filtered_parameters[key] = value
+ else
+ filtered_parameters[key] = value
+ end
+ end
+
+ filtered_parameters
+ end
+ end
end
public
@@ -803,6 +830,10 @@ def default_url_options(options) #:doc:
# redirect_to :back
#
# The redirection happens as a "302 Moved" header.
+ #
+ # When using <tt>redirect_to :back</tt>, if there is no referrer,
+ # RedirectBackError will be raised. You may specify some fallback
+ # behavior for this case by rescueing RedirectBackError.
def redirect_to(options = {}, *parameters_for_method_reference) #:doc:
case options
when %r{^\w+://.*}
@@ -901,7 +932,7 @@ def log_processing
if logger
logger.info "\n\nProcessing #{controller_class_name}\##{action_name} (for #{request_origin}) [#{request.method.to_s.upcase}]"
logger.info " Session ID: #{@session.session_id}" if @session and @session.respond_to?(:session_id)
- logger.info " Parameters: #{@params.inspect}"
+ logger.info " Parameters: #{respond_to?(:filter_parameters) ? filter_parameters(@params).inspect : @params.inspect}"
end
end
View
6 actionpack/lib/action_controller/caching.rb
@@ -38,9 +38,9 @@ def self.included(base) #:nodoc:
#
# class WeblogController < ActionController::Base
# def update
- # List.update(@params["list"]["id"], @params["list"])
- # expire_page :action => "show", :id => @params["list"]["id"]
- # redirect_to :action => "show", :id => @params["list"]["id"]
+ # List.update(params[:list][:id], params[:list])
+ # expire_page :action => "show", :id => params[:list][:id]
+ # redirect_to :action => "show", :id => params[:list][:id]
# end
# end
#
View
11 actionpack/lib/action_controller/cgi_process.rb
@@ -64,11 +64,12 @@ def query_parameters
end
def request_parameters
- if ActionController::Base.param_parsers.has_key?(content_type)
- CGIMethods.parse_formatted_request_parameters(content_type, @env['RAW_POST_DATA'])
- else
- CGIMethods.parse_request_parameters(@cgi.params)
- end
+ @request_parameters ||=
+ if ActionController::Base.param_parsers.has_key?(content_type)
+ CGIMethods.parse_formatted_request_parameters(content_type, @env['RAW_POST_DATA'])
+ else
+ CGIMethods.parse_request_parameters(@cgi.params)
+ end
end
def cookies
View
16 actionpack/lib/action_controller/integration.rb
@@ -140,14 +140,18 @@ def redirect?
# Performs a GET request with the given parameters. The parameters may
# be +nil+, a Hash, or a string that is appropriately encoded
- # (application/x-www-form-urlencoded or multipart/form-data).
+ # (application/x-www-form-urlencoded or multipart/form-data). The headers
+ # should be a hash. The keys will automatically be upcased, with the
+ # prefix 'HTTP_' added if needed.
def get(path, parameters=nil, headers=nil)
process :get, path, parameters, headers
end
# Performs a POST request with the given parameters. The parameters may
# be +nil+, a Hash, or a string that is appropriately encoded
- # (application/x-www-form-urlencoded or multipart/form-data).
+ # (application/x-www-form-urlencoded or multipart/form-data). The headers
+ # should be a hash. The keys will automatically be upcased, with the
+ # prefix 'HTTP_' added if needed.
def post(path, parameters=nil, headers=nil)
process :post, path, parameters, headers
end
@@ -155,7 +159,9 @@ def post(path, parameters=nil, headers=nil)
# Performs an XMLHttpRequest request with the given parameters, mimicing
# the request environment created by the Prototype library. The parameters
# may be +nil+, a Hash, or a string that is appropriately encoded
- # (application/x-www-form-urlencoded or multipart/form-data).
+ # (application/x-www-form-urlencoded or multipart/form-data). The headers
+ # should be a hash. The keys will automatically be upcased, with the
+ # prefix 'HTTP_' added if needed.
def xml_http_request(path, parameters=nil, headers=nil)
headers = (headers || {}).merge("X-Requested-With" => "XMLHttpRequest")
post(path, parameters, headers)
@@ -218,7 +224,7 @@ def process(method, path, parameters=nil, headers=nil)
(headers || {}).each do |key, value|
key = key.to_s.upcase.gsub(/-/, "_")
- key = "HTTP_#{key}" unless env.has_key?(key)
+ key = "HTTP_#{key}" unless env.has_key?(key) || env =~ /^X|HTTP/
env[key] = value
end
@@ -341,7 +347,6 @@ def new_with_capture(*args)
# using the get/post methods:
#
# require "#{File.dirname(__FILE__)}/test_helper"
- # require "integration_test"
#
# class ExampleTest < ActionController::IntegrationTest
# fixtures :people
@@ -366,7 +371,6 @@ def new_with_capture(*args)
# reference any named routes you happen to have defined!
#
# require "#{File.dirname(__FILE__)}/test_helper"
- # require "integration_test"
#
# class AdvancedTest < ActionController::IntegrationTest
# fixtures :people, :rooms
View
12 actionpack/lib/action_controller/layout.rb
@@ -27,7 +27,7 @@ class << self
# that the header and footer are only mentioned in one place, like this:
#
# <!-- The header part of this layout -->
- # <%= @content_for_layout %>
+ # <%= yield %>
# <!-- The footer part of this layout -->
#
# And then you have content pages that look like this:
@@ -47,7 +47,7 @@ class << self
# references that won't materialize before rendering time:
#
# <h1><%= @page_title %></h1>
- # <%= @content_for_layout %>
+ # <%= yield %>
#
# ...and content pages that fulfill these references _at_ rendering time:
#
@@ -159,10 +159,12 @@ class << self
#
# As you can see, you pass the template as the first parameter, the status code as the second ("200" is OK), and the layout
# as the third.
+ #
+ # NOTE: The old notation for rendering the view from a layout was to expose the magic <tt>@content_for_layout</tt> instance
+ # variable. The preferred notation now is to use <tt>yield</tt>, as documented above.
module ClassMethods
- # If a layout is specified, all actions rendered through render and render_action will have their result assigned
- # to <tt>@content_for_layout</tt>, which can then be used by the layout to insert their contents with
- # <tt><%= @content_for_layout %></tt>. This layout can itself depend on instance variables assigned during action
+ # If a layout is specified, all rendered actions will have their result rendered
+ # when the layout<tt>yield</tt>'s. This layout can itself depend on instance variables assigned during action
# performance and have access to them as any normal template would.
def layout(template_name, conditions = {})
add_layout_conditions(conditions)
View
4 actionpack/lib/action_controller/pagination.rb
@@ -31,7 +31,7 @@ module ActionController
# instance variable, which is an ordered collection of model objects for the
# current page (at most 20, sorted by last name and first name), and a
# <tt>@person_pages</tt> Paginator instance. The current page is determined
- # by the <tt>@params['page']</tt> variable.
+ # by the <tt>params[:page]</tt> variable.
#
# ==== Pagination for a single action
#
@@ -47,7 +47,7 @@ module ActionController
# ==== Custom/"classic" pagination
#
# def list
- # @person_pages = Paginator.new self, Person.count, 10, @params['page']
+ # @person_pages = Paginator.new self, Person.count, 10, params[:page]
# @people = Person.find :all, :order => 'last_name, first_name',
# :limit => @person_pages.items_per_page,
# :offset => @person_pages.current.offset
View
14 actionpack/lib/action_controller/request.rb
@@ -1,5 +1,6 @@
module ActionController
- # These methods are available in both the production and test Request objects.
+ # Subclassing AbstractRequest makes these methods available to the request objects used in production and testing,
+ # CgiRequest and TestRequest
class AbstractRequest
cattr_accessor :relative_url_root
@@ -65,6 +66,7 @@ def content_type
end
end
+ # Returns the accepted MIME type for the request
def accepts
@accepts ||=
if @env['HTTP_ACCEPT'].to_s.strip.empty?
@@ -202,15 +204,21 @@ def host_with_port
host + port_string
end
- def path_parameters=(parameters)
+ def path_parameters=(parameters) #:nodoc:
@path_parameters = parameters
@symbolized_path_parameters = @parameters = nil
end
- def symbolized_path_parameters
+ # The same as <tt>path_parameters</tt> with explicitly symbolized keys
+ def symbolized_path_parameters
@symbolized_path_parameters ||= path_parameters.symbolize_keys
end
+ # Returns a hash with the parameters used to form the path of the request
+ #
+ # Example:
+ #
+ # {:action => 'my_action', :controller => 'my_controller'}
def path_parameters
@path_parameters ||= {}
end
View
17 actionpack/lib/action_controller/streaming.rb
@@ -14,7 +14,7 @@ module Streaming
# it feasible to send even large files.
#
# Be careful to sanitize the path parameter if it coming from a web
- # page. send_file(@params['path']) allows a malicious user to
+ # page. send_file(params[:path]) allows a malicious user to
# download any file on your server.
#
# Options:
@@ -28,6 +28,7 @@ module Streaming
# or to read the entire file before sending (false). Defaults to true.
# * <tt>:buffer_size</tt> - specifies size (in bytes) of the buffer used to stream the file.
# Defaults to 4096.
+ # * <tt>:status</tt> - specifies the status code to send with the response. Defaults to '200 OK'.
#
# The default Content-Type and Content-Disposition headers are
# set to download arbitrary binary files in as many browsers as
@@ -37,9 +38,12 @@ module Streaming
# Simple download:
# send_file '/path/to.zip'
#
- # Show a JPEG in browser:
+ # Show a JPEG in the browser:
# send_file '/path/to.jpeg', :type => 'image/jpeg', :disposition => 'inline'
#
+ # Show a 404 page in the browser:
+ # send_file '/path/to/404.html, :type => 'text/html; charset=utf-8', :status => 404
+ #
# Read about the other Content-* HTTP headers if you'd like to
# provide the user with more information (such as Content-Description).
# http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11
@@ -61,7 +65,7 @@ def send_file(path, options = {}) #:doc:
@performed_render = false
if options[:stream]
- render :text => Proc.new { |response, output|
+ render :status => options[:status], :text => Proc.new { |response, output|
logger.info "Streaming file #{path}" unless logger.nil?
len = options[:buffer_size] || 4096
File.open(path, 'rb') do |file|
@@ -81,7 +85,7 @@ def send_file(path, options = {}) #:doc:
}
else
logger.info "Sending file #{path}" unless logger.nil?
- File.open(path, 'rb') { |file| render :text => file.read }
+ File.open(path, 'rb') { |file| render :status => options[:status], :text => file.read }
end
end
@@ -93,6 +97,7 @@ def send_file(path, options = {}) #:doc:
# * <tt>:type</tt> - specifies an HTTP content type.
# Defaults to 'application/octet-stream'.
# * <tt>:disposition</tt> - specifies whether the file will be shown inline or downloaded.
+ # * <tt>:status</tt> - specifies the status code to send with the response. Defaults to '200 OK'.
# Valid values are 'inline' and 'attachment' (default).
#
# Generic data download:
@@ -109,7 +114,7 @@ def send_data(data, options = {}) #:doc:
logger.info "Sending data #{options[:filename]}" unless logger.nil?
send_file_headers! options.merge(:length => data.size)
@performed_render = false
- render :text => data
+ render :status => options[:status], :text => data
end
private
@@ -139,4 +144,4 @@ def send_file_headers!(options)
@headers['Cache-Control'] = 'private' if @headers['Cache-Control'] == 'no-cache'
end
end
-end
+end
View
2  actionpack/lib/action_controller/templates/scaffolds/layout.rhtml
@@ -63,7 +63,7 @@
<p style="color: green"><%= flash[:notice] %></p>
-<%= @content_for_layout %>
+<%= yield %>
</body>
</html>
View
2  actionpack/lib/action_controller/verification.rb
@@ -37,7 +37,7 @@ module ClassMethods
# is a hash consisting of the following key/value pairs:
#
# * <tt>:params</tt>: a single key or an array of keys that must
- # be in the @params hash in order for the action(s) to be safely
+ # be in the <tt>params</tt> hash in order for the action(s) to be safely
# called.
# * <tt>:session</tt>: a single key or an array of keys that must
# be in the @session in order for the action(s) to be safely called.
View
3  actionpack/lib/action_view/base.rb
@@ -427,7 +427,8 @@ def compile_template?(template, file_name, local_assigns)
if @@compile_time[render_symbol] && supports_local_assigns?(render_symbol, local_assigns)
if file_name && !@@cache_template_loading
- @@compile_time[render_symbol] < File.mtime(file_name)
+ @@compile_time[render_symbol] < File.mtime(file_name) || (File.symlink?(file_name) ?
+ @@compile_time[render_symbol] < File.lstat(file_name).mtime : false)
end
else
true
View
34 actionpack/lib/action_view/helpers/capture_helper.rb
@@ -1,6 +1,6 @@
module ActionView
module Helpers
- # Capture lets you extract parts of code into instance variables which
+ # Capture lets you extract parts of code which
# can be used in other points of the template or even layout file.
#
# == Capturing a block into an instance variable
@@ -8,12 +8,11 @@ module Helpers
# <% @script = capture do %>
# [some html...]
# <% end %>
- #
#
# == Add javascript to header using content_for
#
- # content_for("name") is a wrapper for capture which will store the
- # fragment in a instance variable similar to @content_for_layout.
+ # content_for("name") is a wrapper for capture which will
+ # make the fragment available by name to a yielding layout or template.
#
# layout.rhtml:
#
@@ -21,11 +20,11 @@ module Helpers
# <head>
# <title>layout with js</title>
# <script type="text/javascript">
- # <%= @content_for_script %>
- # </script>
+ # <%= yield :script %>
+ # </script>
# </head>
# <body>
- # <%= @content_for_layout %>
+ # <%= yield %>
# </body>
# </html>
#
@@ -69,13 +68,9 @@ def capture(*args, &block)
end
end
- # Content_for will store the given block
- # in an instance variable for later use in another template
- # or in the layout.
- #
- # The name of the instance variable is content_for_<name>
- # to stay consistent with @content_for_layout which is used
- # by ActionView's layouts
+ # Calling content_for stores the block of markup for later use.
+ # Subsequently, you can make calls to it by name with <tt>yield</tt>
+ # in another template or in the layout.
#
# Example:
#
@@ -83,10 +78,17 @@ def capture(*args, &block)
# alert('hello world')
# <% end %>
#
- # You can use @content_for_header anywhere in your templates.
+ # You can use yield :header anywhere in your templates.
+ #
+ # <%= yield :header %>
#
# NOTE: Beware that content_for is ignored in caches. So you shouldn't use it
- # for elements that are going to be fragment cached.
+ # for elements that are going to be fragment cached.
+ #
+ # The deprecated way of accessing a content_for block was to use a instance variable
+ # named @@content_for_#{name_of_the_content_block}@. So <tt><%= content_for('footer') %></tt>
+ # would be avaiable as <tt><%= @content_for_footer %></tt>. The preferred notation now is
+ # <tt><%= yield :footer %></tt>.
def content_for(name, &block)
eval "@content_for_#{name} = (@content_for_#{name} || '') + capture(&block)"
end
View
9 actionpack/lib/action_view/helpers/java_script_macros_helper.rb
@@ -27,6 +27,7 @@ module JavaScriptMacrosHelper
# <tt>:url</tt>:: Specifies the url where the updated value should
# be sent after the user presses "ok".
#
+ #
# Addtional +options+ are:
# <tt>:rows</tt>:: Number of rows (more than 1 will use a TEXTAREA)
# <tt>:cols</tt>:: Number of characters the text input should span (works for both INPUT and TEXTAREA)
@@ -122,10 +123,10 @@ def in_place_editor_field(object, method, tag_options = {}, in_place_editor_opti
# <tt>:on_show</tt>:: Like on_hide, only now the expression is called
# then the div is shown.
# <tt>:after_update_element</tt>:: A Javascript expression that is called when the
- # user has selected one of the proposed values.
- # The expression should take two variables: element and value.
- # Element is a DOM element for the field, value
- # is the value selected by the user.
+ # user has selected one of the proposed values.
+ # The expression should take two variables: element and value.
+ # Element is a DOM element for the field, value
+ # is the value selected by the user.
# <tt>:select</tt>:: Pick the class of the element from which the value for
# insertion should be extracted. If this is not specified,
# the entire element is used.
View
7 actionpack/lib/action_view/helpers/prototype_helper.rb
@@ -143,7 +143,7 @@ def periodically_call_remote(options = {})
# background instead of the regular reloading POST arrangement. Even
# though it's using JavaScript to serialize the form elements, the form
# submission will work just like a regular submission as viewed by the
- # receiving side (all elements available in @params). The options for
+ # receiving side (all elements available in <tt>params</tt>). The options for
# specifying the target with :url and defining callbacks is the same as
# link_to_remote.
#
@@ -171,9 +171,10 @@ def form_remote_tag(options = {})
end
# Works like form_remote_tag, but uses form_for semantics.
- def remote_form_for(object_name, object, options = {}, &proc)
+ def remote_form_for(object_name, *args, &proc)
+ options = args.last.is_a?(Hash) ? args.pop : {}
concat(form_remote_tag(options), proc.binding)
- fields_for(object_name, object, options, &proc)
+ fields_for(object_name, *(args << options), &proc)
concat('</form>', proc.binding)
end
alias_method :form_remote_for, :remote_form_for
View
44 actionpack/lib/action_view/helpers/text_helper.rb
@@ -77,7 +77,7 @@ def word_wrap(text, line_width = 80)
end
begin
- require_library_or_gem "redcloth"
+ require_library_or_gem "redcloth" unless Object.const_defined?(:RedCloth)
# Returns the text with all the Textile codes turned into HTML-tags.
# <i>This method is only available if RedCloth can be required</i>.
@@ -104,7 +104,7 @@ def textilize_without_paragraph(text)
end
begin
- require_library_or_gem "bluecloth"
+ require_library_or_gem "bluecloth" unless Object.const_defined?(:BlueCloth)
# Returns the text with all the Markdown codes turned into HTML-tags.
# <i>This method is only available if BlueCloth can be required</i>.
@@ -116,7 +116,7 @@ def markdown(text)
end
# Returns +text+ transformed into HTML using very simple formatting rules
- # Surrounds paragraphs with <tt>&lt;p&gt;</tt> tags, and converts line breaks into <tt>&lt;br /&gt;</tt>
+ # Surrounds paragraphs with <tt><p></tt> tags, and converts line breaks into <tt><br/></tt>
# Two consecutive newlines(<tt>\n\n</tt>) are considered as a paragraph, one newline (<tt>\n</tt>) is
# considered a linebreak, three or more consecutive newlines are turned into two newlines
def simple_format(text)
@@ -129,7 +129,7 @@ def simple_format(text)
end
# Turns all urls and email addresses into clickable links. The +link+ parameter can limit what should be linked.
- # Options are :all (default), :email_addresses, and :urls.
+ # Options are <tt>:all</tt> (default), <tt>:email_addresses</tt>, and <tt>:urls</tt>.
#
# Example:
# auto_link("Go to http://www.rubyonrails.com and say hello to david@loudthinking.com") =>
@@ -235,28 +235,28 @@ def strip_tags(html)
# array every time it is called. This can be used to alternate classes
# for table rows:
#
- # <%- for item in @items do -%>
- # <tr class="<%= cycle("even", "odd") %>">
- # ... use item ...
- # </tr>
- # <%- end -%>
+ # <%- for item in @items do -%>
+ # <tr class="<%= cycle("even", "odd") %>">
+ # ... use item ...
+ # </tr>
+ # <%- end -%>
#
# You can use named cycles to prevent clashes in nested loops. You'll
# have to reset the inner cycle, manually:
#
- # <%- for item in @items do -%>
- # <tr class="<%= cycle("even", "odd", :name => "row_class")
- # <td>
- # <%- for value in item.values do -%>
- # <span style="color:'<%= cycle("red", "green", "blue"
- # :name => "colors") %>'">
- # item
- # </span>
- # <%- end -%>
- # <%- reset_cycle("colors") -%>
- # </td>
- # </tr>
- # <%- end -%>
+ # <%- for item in @items do -%>
+ # <tr class="<%= cycle("even", "odd", :name => "row_class")
+ # <td>
+ # <%- for value in item.values do -%>
+ # <span style="color:'<%= cycle("red", "green", "blue"
+ # :name => "colors") %>'">
+ # item
+ # </span>
+ # <%- end -%>
+ # <%- reset_cycle("colors") -%>
+ # </td>
+ # </tr>
+ # <%- end -%>
def cycle(first_value, *values)
if (values.last.instance_of? Hash)
params = values.pop
View
42 actionpack/test/controller/filter_params_test.rb
@@ -0,0 +1,42 @@
+require File.dirname(__FILE__) + '/../abstract_unit'
+
+class FilterParamController < ActionController::Base
+end
+
+class FilterParamTest < Test::Unit::TestCase
+ def setup
+ @controller = FilterParamController.new
+ end
+
+ def test_filter_parameters
+ assert FilterParamController.respond_to?(:filter_parameter_logging)
+ assert !@controller.respond_to?(:filter_parameters)
+
+ FilterParamController.filter_parameter_logging
+ assert @controller.respond_to?(:filter_parameters)
+
+ test_hashes = [[{},{},[]],
+ [{'foo'=>'bar'},{'foo'=>'bar'},[]],
+ [{'foo'=>'bar'},{'foo'=>'bar'},%w'food'],
+ [{'foo'=>'bar'},{'foo'=>'[FILTERED]'},%w'foo'],
+ [{'foo'=>'bar', 'bar'=>'foo'},{'foo'=>'[FILTERED]', 'bar'=>'foo'},%w'foo baz'],
+ [{'foo'=>'bar', 'baz'=>'foo'},{'foo'=>'[FILTERED]', 'baz'=>'[FILTERED]'},%w'foo baz'],
+ [{'bar'=>{'foo'=>'bar','bar'=>'foo'}},{'bar'=>{'foo'=>'[FILTERED]','bar'=>'foo'}},%w'fo'],
+ [{'foo'=>{'foo'=>'bar','bar'=>'foo'}},{'foo'=>'[FILTERED]'},%w'f banana']]
+
+ test_hashes.each do |before_filter, after_filter, filter_words|
+ FilterParamController.filter_parameter_logging(*filter_words)
+ assert_equal after_filter, @controller.filter_parameters(before_filter)
+
+ filter_words.push('blah')
+ FilterParamController.filter_parameter_logging(*filter_words) do |key, value|
+ value.reverse! if key =~ /bargain/
+ end
+
+ before_filter['barg'] = {'bargain'=>'gain', 'blah'=>'bar', 'bar'=>{'bargain'=>{'blah'=>'foo'}}}
+ after_filter['barg'] = {'bargain'=>'niag', 'blah'=>'[FILTERED]', 'bar'=>{'bargain'=>{'blah'=>'[FILTERED]'}}}
+
+ assert_equal after_filter, @controller.filter_parameters(before_filter)
+ end
+ end
+end
View
16 actionpack/test/controller/send_file_test.rb
@@ -85,11 +85,25 @@ def test_send_file_headers!
assert_equal 'type', h['Content-Type']
assert_equal 'disposition; filename="filename"', h['Content-Disposition']
assert_equal 'binary', h['Content-Transfer-Encoding']
-
+
# test overriding Cache-Control: no-cache header to fix IE open/save dialog
@controller.headers = { 'Cache-Control' => 'no-cache' }
@controller.send(:send_file_headers!, options)
h = @controller.headers
assert_equal 'private', h['Cache-Control']
end
+
+ %w(file data).each do |method|
+ define_method "test_send_#{method}_status" do
+ @controller.options = { :stream => false, :status => 500 }
+ assert_nothing_raised { assert_not_nil process(method) }
+ assert_equal '500', @controller.headers['Status']
+ end
+
+ define_method "test_default_send_#{method}_status" do
+ @controller.options = { :stream => false }
+ assert_nothing_raised { assert_not_nil process(method) }
+ assert_equal ActionController::Base::DEFAULT_RENDER_STATUS_CODE, @controller.headers['Status']
+ end
+ end
end
View
134 actionpack/test/template/compiled_templates_test.rb
@@ -0,0 +1,134 @@
+require 'test/unit'
+require File.dirname(__FILE__) + '/../../lib/action_view/helpers/date_helper'
+require File.dirname(__FILE__) + "/../abstract_unit"
+
+class CompiledTemplateTests < Test::Unit::TestCase
+
+ def setup
+ @ct = ActionView::CompiledTemplates.new
+ @v = Class.new
+ @v.send :include, @ct
+ @a = './test_compile_template_a.rhtml'
+ @b = './test_compile_template_b.rhtml'
+ @s = './test_compile_template_link.rhtml'
+ end
+ def teardown
+ [@a, @b, @s].each do |f|
+ `rm #{f}` if File.exist?(f) || File.symlink?(f)
+ end
+ end
+ attr_reader :ct, :v
+
+ def test_name_allocation
+ hi_world = ct.method_names['hi world']
+ hi_sexy = ct.method_names['hi sexy']
+ wish_upon_a_star = ct.method_names['I love seeing decent error messages']
+
+ assert_equal hi_world, ct.method_names['hi world']
+ assert_equal hi_sexy, ct.method_names['hi sexy']
+ assert_equal wish_upon_a_star, ct.method_names['I love seeing decent error messages']
+ assert_equal 3, [hi_world, hi_sexy, wish_upon_a_star].uniq.length
+ end
+
+ def test_wrap_source
+ assert_equal(
+ "def aliased_assignment(value)\nself.value = value\nend",
+ @ct.wrap_source(:aliased_assignment, [:value], 'self.value = value')
+ )
+
+ assert_equal(
+ "def simple()\nnil\nend",
+ @ct.wrap_source(:simple, [], 'nil')
+ )
+ end
+
+ def test_compile_source_single_method
+ selector = ct.compile_source('doubling method', [:a], 'a + a')
+ assert_equal 2, @v.new.send(selector, 1)
+ assert_equal 4, @v.new.send(selector, 2)
+ assert_equal -4, @v.new.send(selector, -2)
+ assert_equal 0, @v.new.send(selector, 0)
+ selector
+ end
+
+ def test_compile_source_two_method
+ sel1 = test_compile_source_single_method # compile the method in the other test
+ sel2 = ct.compile_source('doubling method', [:a, :b], 'a + b + a + b')
+ assert_not_equal sel1, sel2
+
+ assert_equal 2, @v.new.send(sel1, 1)
+ assert_equal 4, @v.new.send(sel1, 2)
+
+ assert_equal 6, @v.new.send(sel2, 1, 2)
+ assert_equal 32, @v.new.send(sel2, 15, 1)
+ end
+
+ def test_mtime
+ t1 = Time.now
+ test_compile_source_single_method
+ assert (t1..Time.now).include?(ct.mtime('doubling method', [:a]))
+ end
+
+ def test_compile_time
+ `echo '#{@a}' > #{@a}; echo '#{@b}' > #{@b}; ln -s #{@a} #{@s}`
+
+ v = ActionView::Base.new
+ v.base_path = '.'
+ v.cache_template_loading = false;
+
+ sleep 1
+ t = Time.now
+ v.compile_and_render_template(:rhtml, '', @a)
+ v.compile_and_render_template(:rhtml, '', @b)
+ v.compile_and_render_template(:rhtml, '', @s)
+ a_n = v.method_names[@a]
+ b_n = v.method_names[@b]
+ s_n = v.method_names[@s]
+ # all of the files have changed since last compile
+ assert v.compile_time[a_n] > t
+ assert v.compile_time[b_n] > t
+ assert v.compile_time[s_n] > t
+
+ sleep 1
+ t = Time.now
+ v.compile_and_render_template(:rhtml, '', @a)
+ v.compile_and_render_template(:rhtml, '', @b)
+ v.compile_and_render_template(:rhtml, '', @s)
+ # none of the files have changed since last compile
+ assert v.compile_time[a_n] < t
+ assert v.compile_time[b_n] < t
+ assert v.compile_time[s_n] < t
+
+ `rm #{@s}; ln -s #{@b} #{@s}`
+ v.compile_and_render_template(:rhtml, '', @a)
+ v.compile_and_render_template(:rhtml, '', @b)
+ v.compile_and_render_template(:rhtml, '', @s)
+ # the symlink has changed since last compile
+ assert v.compile_time[a_n] < t
+ assert v.compile_time[b_n] < t
+ assert v.compile_time[s_n] > t
+
+ sleep 1
+ `touch #{@b}`
+ t = Time.now
+ v.compile_and_render_template(:rhtml, '', @a)
+ v.compile_and_render_template(:rhtml, '', @b)
+ v.compile_and_render_template(:rhtml, '', @s)
+ # the file at the end of the symlink has changed since last compile
+ # both the symlink and the file at the end of it should be recompiled
+ assert v.compile_time[a_n] < t
+ assert v.compile_time[b_n] > t
+ assert v.compile_time[s_n] > t
+ end
+end
+
+module ActionView
+ class Base
+ def compile_time
+ @@compile_time
+ end
+ def method_names
+ @@method_names
+ end
+ end
+end
View
63 actionpack/test/template/compiled_templates_tests.rb
@@ -1,63 +0,0 @@
-require 'test/unit'
-require File.dirname(__FILE__) + '/../../lib/action_view/helpers/date_helper'
-require File.dirname(__FILE__) + "/../abstract_unit"
-
-class CompiledTemplateTests < Test::Unit::TestCase
-
- def setup
- @ct = ActionView::CompiledTemplates.new
- @v = Class.new
- @v.send :include, @ct
- end
- attr_reader :ct, :v
-
- def test_name_allocation
- hi_world = ct.method_names['hi world']
- hi_sexy = ct.method_names['hi sexy']
- wish_upon_a_star = ct.method_names['I love seeing decent error messages']
-
- assert_equal hi_world, ct.method_names['hi world']
- assert_equal hi_sexy, ct.method_names['hi sexy']
- assert_equal wish_upon_a_star, ct.method_names['I love seeing decent error messages']
- assert_equal 3, [hi_world, hi_sexy, wish_upon_a_star].uniq.length
- end
-
- def test_wrap_source
- assert_equal(
- "def aliased_assignment(value)\nself.value = value\nend",
- @ct.wrap_source(:aliased_assignment, [:value], 'self.value = value')
- )
-
- assert_equal(
- "def simple()\nnil\nend",
- @ct.wrap_source(:simple, [], 'nil')
- )
- end
-
- def test_compile_source_single_method
- selector = ct.compile_source('doubling method', [:a], 'a + a')
- assert_equal 2, @v.new.send(selector, 1)
- assert_equal 4, @v.new.send(selector, 2)
- assert_equal -4, @v.new.send(selector, -2)
- assert_equal 0, @v.new.send(selector, 0)
- selector
- end
-
- def test_compile_source_two_method
- sel1 = test_compile_source_single_method # compile the method in the other test
- sel2 = ct.compile_source('doubling method', [:a, :b], 'a + b + a + b')
- assert_not_equal sel1, sel2
-
- assert_equal 2, @v.new.send(sel1, 1)
- assert_equal 4, @v.new.send(sel1, 2)
-
- assert_equal 6, @v.new.send(sel2, 1, 2)
- assert_equal 32, @v.new.send(sel2, 15, 1)
- end
-
- def test_mtime
- t1 = Time.now
- test_compile_source_single_method
- assert (t1..Time.now).include?(ct.mtime('doubling method', [:a]))
- end
-end
View
9 activerecord/CHANGELOG
@@ -1,3 +1,12 @@
+*SVN*
+
+* Add warning about the proper way to validate the presence of a foreign key. #4147 [Francois Beausoleil <francois.beausoleil@gmail.com>]
+
+* Fix syntax error in documentation. #4679 [mislav@nippur.irb.hr]
+
+* Update inconsistent migrations documentation. #4683 [machomagna@gmail.com]
+
+
*1.14.3* (June 27th, 2006)
* Fix announcement of very long migration names. #5722 [blake@near-time.com]
View
2  activerecord/lib/active_record/base.rb
@@ -175,7 +175,7 @@ def initialize(errors)
# serialize :preferences
# end
#
- # user = User.create(:preferences) => { "background" => "black", "display" => large })
+ # user = User.create(:preferences => { "background" => "black", "display" => large })
# User.find(user.id).preferences # => { "background" => "black", "display" => large }
#
# You can also specify a class option as the second parameter that'll raise an exception if a serialized object is retrieved as a
View
4 activerecord/lib/active_record/migration.rb
@@ -70,8 +70,8 @@ def initialize(version)
# * <tt>change_column(table_name, column_name, type, options)</tt>: Changes the column to a different type using the same
# parameters as add_column.
# * <tt>remove_column(table_name, column_name)</tt>: Removes the column named +column_name+ from the table called +table_name+.
- # * <tt>add_index(table_name, column_name, index_type)</tt>: Add a new index with the name of the column on the column. Specify an optional index_type (e.g. UNIQUE).
- # * <tt>remove_index(table_name, column_name)</tt>: Remove the index called the same as the column.
+ # * <tt>add_index(table_name, column_names, index_type, index_name)</tt>: Add a new index with the name of the column, or +index_name+ (if specified) on the column(s). Specify an optional +index_type+ (e.g. UNIQUE).
+ # * <tt>remove_index(table_name, index_name)</tt>: Remove the index specified by +index_name+.
#
# == Irreversible transformations
#
View
12 activerecord/lib/active_record/validations.rb
@@ -381,6 +381,18 @@ def validates_acceptance_of(*attr_names)
# * <tt>if</tt> - Specifies a method, proc or string to call to determine if the validation should
# occur (e.g. :if => :allow_validation, or :if => Proc.new { |user| user.signup_step > 2 }). The
# method, proc or string should return or evaluate to a true or false value.
+ #
+ # === Warning
+ # Validate the presence of the foreign key, not the instance variable itself.
+ # Do this:
+ # validate_presence_of :invoice_id
+ #
+ # Not this:
+ # validate_presence_of :invoice
+ #
+ # If you validate the presence of the associated object, you will get
+ # failures on saves when both the parent object and the child object are
+ # new.
def validates_presence_of(*attr_names)
configuration = { :message => ActiveRecord::Errors.default_error_messages[:blank], :on => :save }
configuration.update(attr_names.pop) if attr_names.last.is_a?(Hash)
View
2  activesupport/test/core_ext/kernel_test.rb
@@ -34,6 +34,8 @@ def test_silence_stderr
old_stderr_position = STDERR.tell
silence_stderr { STDERR.puts 'hello world' }
assert_equal old_stderr_position, STDERR.tell
+ rescue Errno::ESPIPE
+ # Skip if we can't STDERR.tell
end
def test_silence_stderr_with_return_value
View
7 railties/CHANGELOG
@@ -1,3 +1,10 @@
+*SVN*
+
+* Mention in docs that config.frameworks doesn't work when getting Rails via Gems. #4857 [Alisdair McDiarmid]
+
+* Change the scaffolding layout to use yield rather than @content_for_layout. [Marcel Molina Jr.]
+
+
*1.1.4* (June 29th, 2006)
* Remove use of opts.on { |options[:name] } style hash assignment. References #4440. [headius@headius.com]
View
2  railties/environments/environment.rb
@@ -13,7 +13,7 @@
Rails::Initializer.run do |config|
# Settings in config/environments/* take precedence those specified here
- # Skip frameworks you're not going to use
+ # Skip frameworks you're not going to use (only works if using vendor/rails)
# config.frameworks -= [ :action_web_service, :action_mailer ]
# Add additional load paths for your own custom dirs
View
2  railties/lib/rails_generator/generators/components/scaffold/templates/layout.rhtml
@@ -7,7 +7,7 @@
<p style="color: green"><%%= flash[:notice] %></p>
-<%%= @content_for_layout %>
+<%%= yield %>
</body>
</html>
Please sign in to comment.
Something went wrong with that request. Please try again.