From 2026bb1026572d8ae5e5bdfb8f19d9af3e7f4128 Mon Sep 17 00:00:00 2001 From: Prathamesh Sonpatki Date: Sun, 14 Apr 2013 12:16:22 +0530 Subject: [PATCH 01/51] Changed grammar for better readability --- guides/source/active_support_core_extensions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/source/active_support_core_extensions.md b/guides/source/active_support_core_extensions.md index 101a4f5b42..fd4c663420 100644 --- a/guides/source/active_support_core_extensions.md +++ b/guides/source/active_support_core_extensions.md @@ -2216,7 +2216,7 @@ NOTE: Defined in `active_support/core_ext/array/conversions.rb`. The method `to_formatted_s` acts like `to_s` by default. -If the array contains items that respond to `id`, however, it may be passed the symbol `:db` as argument. That's typically used with collections of ARs. Returned strings are: +If the array contains items that respond to `id`, however, the symbol `:db` may be passed as argument. That's typically used with collections of ActiveRecord objects. Returned strings are: ```ruby [].to_formatted_s(:db) # => "null" From 00a805d41939b44a703848b21054224afde026dc Mon Sep 17 00:00:00 2001 From: Prathamesh Sonpatki Date: Sun, 14 Apr 2013 12:33:28 +0530 Subject: [PATCH 02/51] ARel -> Arel --- guides/source/3_2_release_notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/source/3_2_release_notes.md b/guides/source/3_2_release_notes.md index 68a47be14f..afa06e002c 100644 --- a/guides/source/3_2_release_notes.md +++ b/guides/source/3_2_release_notes.md @@ -101,7 +101,7 @@ Rails 3.2 comes with a development mode that's noticeably faster. Inspired by [A ### Automatic Query Explains -Rails 3.2 comes with a nice feature that explains queries generated by ARel by defining an `explain` method in `ActiveRecord::Relation`. For example, you can run something like `puts Person.active.limit(5).explain` and the query ARel produces is explained. This allows to check for the proper indexes and further optimizations. +Rails 3.2 comes with a nice feature that explains queries generated by Arel by defining an `explain` method in `ActiveRecord::Relation`. For example, you can run something like `puts Person.active.limit(5).explain` and the query Arel produces is explained. This allows to check for the proper indexes and further optimizations. Queries that take more than half a second to run are *automatically* explained in the development mode. This threshold, of course, can be changed. From 8ffaa39b75982cd59f1ab843be0502143e0627e0 Mon Sep 17 00:00:00 2001 From: Prathamesh Sonpatki Date: Sun, 14 Apr 2013 13:38:23 +0530 Subject: [PATCH 03/51] Added description for mtime --- guides/source/asset_pipeline.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/source/asset_pipeline.md b/guides/source/asset_pipeline.md index 43df544e28..1e33af2658 100644 --- a/guides/source/asset_pipeline.md +++ b/guides/source/asset_pipeline.md @@ -75,7 +75,7 @@ The query string strategy has several disadvantages: 2. **The file name can change between nodes in multi-server environments.**
The default query string in Rails 2.x is based on the modification time of the files. When assets are deployed to a cluster, there is no guarantee that the timestamps will be the same, resulting in different values being used depending on which server handles the request. 3. **Too much cache invalidation**
- When static assets are deployed with each new release of code, the mtime of _all_ these files changes, forcing all remote clients to fetch them again, even when the content of those assets has not changed. + When static assets are deployed with each new release of code, the mtime(time of last modification) of _all_ these files changes, forcing all remote clients to fetch them again, even when the content of those assets has not changed. Fingerprinting fixes these problems by avoiding query strings, and by ensuring that filenames are consistent based on their content. From 3f52e5aa161859d291e23dd9080eb1238b8afced Mon Sep 17 00:00:00 2001 From: Prathamesh Sonpatki Date: Sun, 14 Apr 2013 13:58:31 +0530 Subject: [PATCH 04/51] Updated link to peepcode Git screencast --- guides/source/development_dependencies_install.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/source/development_dependencies_install.md b/guides/source/development_dependencies_install.md index 14ca44d2a1..5d9d63e97d 100644 --- a/guides/source/development_dependencies_install.md +++ b/guides/source/development_dependencies_install.md @@ -24,7 +24,7 @@ Ruby on Rails uses Git for source code control. The [Git homepage](http://git-sc * [Try Git course](http://try.github.io/) is an interactive course that will teach you the basics. * The [official Documentation](http://git-scm.com/documentation) is pretty comprehensive and also contains some videos with the basics of Git * [Everyday Git](http://schacon.github.io/git/everyday.html) will teach you just enough about Git to get by. -* The [PeepCode screencast](https://peepcode.com/products/git) on Git ($9) is easier to follow. +* The [PeepCode screencast](https://peepcode.com/products/git) on Git ($12) is easier to follow. * [GitHub](http://help.github.com) offers links to a variety of Git resources. * [Pro Git](http://git-scm.com/book) is an entire book about Git with a Creative Commons license. From 5495bac3548011c1c60b156e6306ed12a632047b Mon Sep 17 00:00:00 2001 From: Iain Beeston Date: Sun, 14 Apr 2013 18:29:47 +1000 Subject: [PATCH 05/51] Tried to make the response status code table more readable By making it the last thing in it's section and adding pseudo row headers --- guides/source/layouts_and_rendering.md | 128 ++++++++++++------------- 1 file changed, 64 insertions(+), 64 deletions(-) diff --git a/guides/source/layouts_and_rendering.md b/guides/source/layouts_and_rendering.md index addc0a5430..cdf3dbd77f 100644 --- a/guides/source/layouts_and_rendering.md +++ b/guides/source/layouts_and_rendering.md @@ -283,8 +283,8 @@ Calls to the `render` method generally accept four options: * `:content_type` * `:layout` -* `:status` * `:location` +* `:status` ##### The `:content_type` Option @@ -310,6 +310,14 @@ You can also tell Rails to render with no layout at all: render layout: false ``` +##### The `:location` Option + +You can use the `:location` option to set the HTTP `Location` header: + +```ruby +render xml: photo, location: photo_url(photo) +``` + ##### The `:status` Option Rails will automatically generate a response with the correct HTTP status code (in most cases, this is `200 OK`). You can use the `:status` option to change this: @@ -319,70 +327,62 @@ render status: 500 render status: :forbidden ``` -Rails understands both numeric status codes and the corresponding symbols shown below: +Rails understands both numeric status codes and the corresponding symbols shown below. -| HTTP Status Code | Symbol | -| ---------------- | -------------------------------- | -| 100 | :continue | -| 101 | :switching_protocols | -| 102 | :processing | -| 200 | :ok | -| 201 | :created | -| 202 | :accepted | -| 203 | :non_authoritative_information | -| 204 | :no_content | -| 205 | :reset_content | -| 206 | :partial_content | -| 207 | :multi_status | -| 226 | :im_used | -| 300 | :multiple_choices | -| 301 | :moved_permanently | -| 302 | :found | -| 303 | :see_other | -| 304 | :not_modified | -| 305 | :use_proxy | -| 306 | :reserved | -| 307 | :temporary_redirect | -| 400 | :bad_request | -| 401 | :unauthorized | -| 402 | :payment_required | -| 403 | :forbidden | -| 404 | :not_found | -| 405 | :method_not_allowed | -| 406 | :not_acceptable | -| 407 | :proxy_authentication_required | -| 408 | :request_timeout | -| 409 | :conflict | -| 410 | :gone | -| 411 | :length_required | -| 412 | :precondition_failed | -| 413 | :request_entity_too_large | -| 414 | :request_uri_too_long | -| 415 | :unsupported_media_type | -| 416 | :requested_range_not_satisfiable | -| 417 | :expectation_failed | -| 418 | :i'm_a_teapot | -| 422 | :unprocessable_entity | -| 423 | :locked | -| 424 | :failed_dependency | -| 426 | :upgrade_required | -| 500 | :internal_server_error | -| 501 | :not_implemented | -| 502 | :bad_gateway | -| 503 | :service_unavailable | -| 504 | :gateway_timeout | -| 505 | :http_version_not_supported | -| 506 | :variant_also_negotiates | -| 507 | :insufficient_storage | -| 510 | :not_extended | - -##### The `:location` Option - -You can use the `:location` option to set the HTTP `Location` header: - -```ruby -render xml: photo, location: photo_url(photo) -``` +| Response Class | HTTP Status Code | Symbol | +| ------------------- | ---------------- | -------------------------------- | +| **Informational** | 100 | :continue | +| | 101 | :switching_protocols | +| | 102 | :processing | +| **Success** | 200 | :ok | +| | 201 | :created | +| | 202 | :accepted | +| | 203 | :non_authoritative_information | +| | 204 | :no_content | +| | 205 | :reset_content | +| | 206 | :partial_content | +| | 207 | :multi_status | +| | 226 | :im_used | +| **Redirection** | 300 | :multiple_choices | +| | 301 | :moved_permanently | +| | 302 | :found | +| | 303 | :see_other | +| | 304 | :not_modified | +| | 305 | :use_proxy | +| | 306 | :reserved | +| | 307 | :temporary_redirect | +| **Client Error** | 400 | :bad_request | +| | 401 | :unauthorized | +| | 402 | :payment_required | +| | 403 | :forbidden | +| | 404 | :not_found | +| | 405 | :method_not_allowed | +| | 406 | :not_acceptable | +| | 407 | :proxy_authentication_required | +| | 408 | :request_timeout | +| | 409 | :conflict | +| | 410 | :gone | +| | 411 | :length_required | +| | 412 | :precondition_failed | +| | 413 | :request_entity_too_large | +| | 414 | :request_uri_too_long | +| | 415 | :unsupported_media_type | +| | 416 | :requested_range_not_satisfiable | +| | 417 | :expectation_failed | +| | 418 | :i'm_a_teapot | +| | 422 | :unprocessable_entity | +| | 423 | :locked | +| | 424 | :failed_dependency | +| | 426 | :upgrade_required | +| **Server Error** | 500 | :internal_server_error | +| | 501 | :not_implemented | +| | 502 | :bad_gateway | +| | 503 | :service_unavailable | +| | 504 | :gateway_timeout | +| | 505 | :http_version_not_supported | +| | 506 | :variant_also_negotiates | +| | 507 | :insufficient_storage | +| | 510 | :not_extended | #### Finding Layouts From be1af1b896f8787ebac04c479f72eae6e8f8e6fb Mon Sep 17 00:00:00 2001 From: Prathamesh Sonpatki Date: Mon, 15 Apr 2013 00:34:29 +0530 Subject: [PATCH 06/51] Fixed typo [ci skip] --- guides/source/layouts_and_rendering.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/source/layouts_and_rendering.md b/guides/source/layouts_and_rendering.md index cdf3dbd77f..c8bb6f4110 100644 --- a/guides/source/layouts_and_rendering.md +++ b/guides/source/layouts_and_rendering.md @@ -709,7 +709,7 @@ There are three tag options available for the `auto_discovery_link_tag`: * `:rel` specifies the `rel` value in the link. The default value is "alternate". * `:type` specifies an explicit MIME type. Rails will generate an appropriate MIME type automatically. -* `:title` specifies the title of the link. The default value is the uppercased `:type` value, for example, "ATOM" or "RSS". +* `:title` specifies the title of the link. The default value is the uppercase `:type` value, for example, "ATOM" or "RSS". #### Linking to JavaScript Files with the `javascript_include_tag` From 1ed40d7c2e86da5fc10e7d735a657e7fc3552e24 Mon Sep 17 00:00:00 2001 From: Chase DuBois Date: Sun, 14 Apr 2013 13:37:30 -0700 Subject: [PATCH 07/51] Clarify arguments of head method --- guides/source/layouts_and_rendering.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/source/layouts_and_rendering.md b/guides/source/layouts_and_rendering.md index c8bb6f4110..abd41c2dee 100644 --- a/guides/source/layouts_and_rendering.md +++ b/guides/source/layouts_and_rendering.md @@ -633,7 +633,7 @@ This would detect that there are no books with the specified ID, populate the `@ ### Using `head` To Build Header-Only Responses -The `head` method can be used to send responses with only headers to the browser. It provides a more obvious alternative to calling `render :nothing`. The `head` method takes one parameter, which is interpreted as a hash of header names and values. For example, you can return only an error header: +The `head` method can be used to send responses with only headers to the browser. It provides a more obvious alternative to calling `render :nothing`. The `head` method accepts a number or symbol (see [reference table](#the-status-option)) representing a HTTP status code. The options argument is interpreted as a hash of header names and values. For example, you can return only an error header: ```ruby head :bad_request From b1286d391897e3228013295b574de4fa0f856efa Mon Sep 17 00:00:00 2001 From: Chase DuBois Date: Sun, 14 Apr 2013 16:33:41 -0700 Subject: [PATCH 08/51] Align table of HTTP status codes with set supported by current Rack --- guides/source/layouts_and_rendering.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/guides/source/layouts_and_rendering.md b/guides/source/layouts_and_rendering.md index abd41c2dee..1ab841b137 100644 --- a/guides/source/layouts_and_rendering.md +++ b/guides/source/layouts_and_rendering.md @@ -1,7 +1,7 @@ Layouts and Rendering in Rails ============================== -This guide covers the basic layout features of Action Controller and Action View. +This guide covers the basic layout features of Action Controller and Action View. After reading this guide, you will know: @@ -342,6 +342,7 @@ Rails understands both numeric status codes and the corresponding symbols shown | | 205 | :reset_content | | | 206 | :partial_content | | | 207 | :multi_status | +| | 208 | :already_reported | | | 226 | :im_used | | **Redirection** | 300 | :multiple_choices | | | 301 | :moved_permanently | @@ -351,6 +352,7 @@ Rails understands both numeric status codes and the corresponding symbols shown | | 305 | :use_proxy | | | 306 | :reserved | | | 307 | :temporary_redirect | +| | 308 | :permanent_redirect | | **Client Error** | 400 | :bad_request | | | 401 | :unauthorized | | | 402 | :payment_required | @@ -369,11 +371,13 @@ Rails understands both numeric status codes and the corresponding symbols shown | | 415 | :unsupported_media_type | | | 416 | :requested_range_not_satisfiable | | | 417 | :expectation_failed | -| | 418 | :i'm_a_teapot | | | 422 | :unprocessable_entity | | | 423 | :locked | | | 424 | :failed_dependency | | | 426 | :upgrade_required | +| | 423 | :precondition_required | +| | 424 | :too_many_requests | +| | 426 | :request_header_fields_too_large | | **Server Error** | 500 | :internal_server_error | | | 501 | :not_implemented | | | 502 | :bad_gateway | @@ -382,7 +386,9 @@ Rails understands both numeric status codes and the corresponding symbols shown | | 505 | :http_version_not_supported | | | 506 | :variant_also_negotiates | | | 507 | :insufficient_storage | +| | 508 | :loop_detected | | | 510 | :not_extended | +| | 511 | :network_authentication_required | #### Finding Layouts From bd4470e3199b32c9897366e13e4b7c068be0ecdc Mon Sep 17 00:00:00 2001 From: Yves Senn Date: Mon, 15 Apr 2013 14:30:33 +0200 Subject: [PATCH 09/51] Ruby 1.9 hash syntax for action controller guide --- guides/source/action_controller_overview.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/guides/source/action_controller_overview.md b/guides/source/action_controller_overview.md index db91425c76..43a59e8d43 100644 --- a/guides/source/action_controller_overview.md +++ b/guides/source/action_controller_overview.md @@ -148,7 +148,7 @@ Also, if you've turned on `config.wrap_parameters` in your initializer or callin And assume that you're sending the data to `CompaniesController`, it would then be wrapped in `:company` key like this: ```ruby -{ :name => "acme", :address => "123 Carrot Street", :company => { :name => "acme", :address => "123 Carrot Street" } } +{ name: "acme", address: "123 Carrot Street", company: { name: "acme", address: "123 Carrot Street" } } ``` You can customize the name of the key or specific parameters you want to wrap by consulting the [API documentation](http://api.rubyonrails.org/classes/ActionController/ParamsWrapper.html) @@ -246,7 +246,7 @@ To declare that the value in `params` must be an array of permitted scalar values map the key to an empty array: ```ruby -params.permit(:id => []) +params.permit(id: []) ``` To whitelist an entire hash of parameters, the `permit!` method can be @@ -266,9 +266,9 @@ mass-assigned. You can also use permit on nested parameters, like: ```ruby -params.permit(:name, {:emails => []}, - :friends => [ :name, - { :family => [ :name ], :hobbies => [] }]) +params.permit(:name, { emails: [] }, + friends: [ :name, + { family: [ :name ], hobbies: [] }]) ``` This declaration whitelists the `name`, `emails` and `friends` From 1655f4142efa89acb86812f5c1d7572e51cbae80 Mon Sep 17 00:00:00 2001 From: Yves Senn Date: Mon, 15 Apr 2013 14:46:11 +0200 Subject: [PATCH 10/51] more Ruby 1.9 Hash syntax in our guides --- guides/source/active_record_querying.md | 2 +- guides/source/asset_pipeline.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/source/active_record_querying.md b/guides/source/active_record_querying.md index 2589accadd..e1d9f39c3e 100644 --- a/guides/source/active_record_querying.md +++ b/guides/source/active_record_querying.md @@ -707,7 +707,7 @@ Post.order('id DESC').limit(20).unscope(:order, :limit) = Post.all You can additionally unscope specific where clauses. For example: ```ruby -Post.where(:id => 10).limit(1).unscope(:where => :id, :limit).order('id DESC') = Post.order('id DESC') +Post.where(:id => 10).limit(1).unscope(where: :id, :limit).order('id DESC') = Post.order('id DESC') ``` ### `only` diff --git a/guides/source/asset_pipeline.md b/guides/source/asset_pipeline.md index 1e33af2658..54548c5a0b 100644 --- a/guides/source/asset_pipeline.md +++ b/guides/source/asset_pipeline.md @@ -707,7 +707,7 @@ config.assets.cache_store = :memory_store The options accepted by the assets cache store are the same as the application's cache store. ```ruby -config.assets.cache_store = :memory_store, { :size => 32.megabytes } +config.assets.cache_store = :memory_store, { size: 32.megabytes } ``` Adding Assets to Your Gems From ffde34d51075e584658b5d492a9d2b101c5633b7 Mon Sep 17 00:00:00 2001 From: Zoltan Debre Date: Tue, 16 Apr 2013 00:56:12 +0200 Subject: [PATCH 11/51] Change 'validates_presence_of' to 'presence: true' Of course validates_presence_of is still working but it is not explained in the guide, I think consequently should use 'presence: true' in this documentation. --- guides/source/active_record_validations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/source/active_record_validations.md b/guides/source/active_record_validations.md index df39d3c5dc..d043e42090 100644 --- a/guides/source/active_record_validations.md +++ b/guides/source/active_record_validations.md @@ -434,7 +434,7 @@ end Note that the default error messages are plural (e.g., "is too short (minimum is %{count} characters)"). For this reason, when `:minimum` is 1 you should -provide a personalized message or use `validates_presence_of` instead. When +provide a personalized message or use `presence: true` instead. When `:in` or `:within` have a lower limit of 1, you should either provide a personalized message or call `presence` prior to `length`. From bbcc2126c6a8b8ae368108889f753178f110864c Mon Sep 17 00:00:00 2001 From: Waynn Lue Date: Mon, 15 Apr 2013 16:35:25 -0700 Subject: [PATCH 12/51] took out unnecessary wordage, changed "number" to "amount" --- actionmailer/README.rdoc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/actionmailer/README.rdoc b/actionmailer/README.rdoc index 4d78d6142a..ffd2217d58 100644 --- a/actionmailer/README.rdoc +++ b/actionmailer/README.rdoc @@ -119,8 +119,7 @@ trivial case like this: rails runner 'Mailman.receive(STDIN.read)' However, invoking Rails in the runner for each mail to be received is very resource intensive. A single -instance of Rails should be run within a daemon, if it is going to be utilized to process more than just -a limited number of email. +instance of Rails should be run within a daemon, if it is going to process more than just a limited amount of email. == Configuration From ee48cf69eeb04a21941922c7f840babe3b619c6e Mon Sep 17 00:00:00 2001 From: Neeraj Singh Date: Wed, 17 Apr 2013 05:06:55 -0400 Subject: [PATCH 13/51] without autosave option updated records not save Emphasizing that without autosave option only new records are saved and updated records are not saved --- activerecord/lib/active_record/autosave_association.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/activerecord/lib/active_record/autosave_association.rb b/activerecord/lib/active_record/autosave_association.rb index 44323ce9db..b0bd78ad46 100644 --- a/activerecord/lib/active_record/autosave_association.rb +++ b/activerecord/lib/active_record/autosave_association.rb @@ -17,7 +17,8 @@ module ActiveRecord # be destroyed directly. They will however still be marked for destruction. # # Note that autosave: false is not same as not declaring :autosave. - # When the :autosave option is not present new associations are saved. + # When the :autosave option is not present then new association records are + # saved but the updated association records are not saved. # # == Validation # From 5ea8ff095133eb8a9d8fe90f26f3d14b76b3ecdf Mon Sep 17 00:00:00 2001 From: Neeraj Singh Date: Wed, 17 Apr 2013 05:54:07 -0400 Subject: [PATCH 14/51] updated rdoc to reflect info about readonly attribute --- activerecord/lib/active_record/persistence.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/activerecord/lib/active_record/persistence.rb b/activerecord/lib/active_record/persistence.rb index 42cece3ad0..cffe7e2050 100644 --- a/activerecord/lib/active_record/persistence.rb +++ b/activerecord/lib/active_record/persistence.rb @@ -204,6 +204,8 @@ module ActiveRecord # * updated_at/updated_on column is updated if that column is available. # * Updates all the attributes that are dirty in this object. # + # This method raises an +ActiveRecord::ActiveRecordError+ if the + # attribute is marked as readonly. def update_attribute(name, value) name = name.to_s verify_readonly_attribute(name) From 14254d82a90b8aa4bd81f7eeebe33885bf83c378 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hrvoje=20=C5=A0imi=C4=87?= Date: Wed, 17 Apr 2013 16:02:13 +0200 Subject: [PATCH 15/51] documentation fixes for Array.wrap and AR::Validations::AssociatedValidator --- .../lib/active_record/validations/associated.rb | 4 ++-- .../lib/active_support/core_ext/array/wrap.rb | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/activerecord/lib/active_record/validations/associated.rb b/activerecord/lib/active_record/validations/associated.rb index 7f1972ccf9..744780d069 100644 --- a/activerecord/lib/active_record/validations/associated.rb +++ b/activerecord/lib/active_record/validations/associated.rb @@ -9,8 +9,8 @@ module ActiveRecord end module ClassMethods - # Validates whether the associated object or objects are all valid - # themselves. Works with any kind of association. + # Validates whether the associated object or objects are all valid. + # Works with any kind of association. # # class Book < ActiveRecord::Base # has_many :pages diff --git a/activesupport/lib/active_support/core_ext/array/wrap.rb b/activesupport/lib/active_support/core_ext/array/wrap.rb index 1245768870..152eb02218 100644 --- a/activesupport/lib/active_support/core_ext/array/wrap.rb +++ b/activesupport/lib/active_support/core_ext/array/wrap.rb @@ -15,12 +15,12 @@ class Array # # * If the argument responds to +to_ary+ the method is invoked. Kernel#Array # moves on to try +to_a+ if the returned value is +nil+, but Array.wrap returns - # such a +nil+ right away. + # +nil+ right away. # * If the returned value from +to_ary+ is neither +nil+ nor an +Array+ object, Kernel#Array # raises an exception, while Array.wrap does not, it just returns the value. - # * It does not call +to_a+ on the argument, though special-cases +nil+ to return an empty array. + # * It does not call +to_a+ on the argument, but returns an empty array if argument is +nil+. # - # The last point is particularly worth comparing for some enumerables: + # The second point is easily explained with some enumerables: # # Array(foo: :bar) # => [[:foo, :bar]] # Array.wrap(foo: :bar) # => [{:foo=>:bar}] @@ -29,10 +29,10 @@ class Array # # [*object] # - # which for +nil+ returns [], and calls to Array(object) otherwise. + # which returns [] for +nil+, but calls to Array(object) otherwise. # - # Thus, in this case the behavior may be different for +nil+, and the differences with - # Kernel#Array explained above apply to the rest of objects. + # The differences with Kernel#Array explained above + # apply to the rest of objects. def self.wrap(object) if object.nil? [] From 1badf20497828cf20f86455fb958832cc5104c08 Mon Sep 17 00:00:00 2001 From: Sammy Larbi Date: Wed, 17 Apr 2013 16:16:47 -0500 Subject: [PATCH 16/51] Document the fact you can add_index on new columns --- guides/source/migrations.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/guides/source/migrations.md b/guides/source/migrations.md index 086cf434d9..9c92efd521 100644 --- a/guides/source/migrations.md +++ b/guides/source/migrations.md @@ -150,7 +150,25 @@ class AddPartNumberToProducts < ActiveRecord::Migration end ``` -Similarly, +If you'd like to add an index on the new column, you can do that as well: + +```bash +$ rails generate migration AddPartNumberToProducts part_number:string:index +``` + +will generate + +```ruby +class AddPartNumberToProducts < ActiveRecord::Migration + def change + add_column :products, :part_number, :string + add_index :products, :part_number + end +end +``` + + +Similarly, you can generate a migration to remove a column from the command line: ```bash $ rails generate migration RemovePartNumberFromProducts part_number:string From 5e71e92235b8a02b8594927e6ce3a3d50a28afa5 Mon Sep 17 00:00:00 2001 From: Neeraj Singh Date: Wed, 17 Apr 2013 06:33:33 -0400 Subject: [PATCH 17/51] readonly info for save and save! --- activerecord/lib/active_record/persistence.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/activerecord/lib/active_record/persistence.rb b/activerecord/lib/active_record/persistence.rb index cffe7e2050..fbb64ad68d 100644 --- a/activerecord/lib/active_record/persistence.rb +++ b/activerecord/lib/active_record/persistence.rb @@ -99,6 +99,9 @@ module ActiveRecord # before_* callbacks return +false+ the action is cancelled and # +save+ returns +false+. See ActiveRecord::Callbacks for further # details. + # + # Attributes marked as readonly are silently ignored if the record is + # being updated. def save(*) create_or_update rescue ActiveRecord::RecordInvalid @@ -118,6 +121,9 @@ module ActiveRecord # the before_* callbacks return +false+ the action is cancelled # and save! raises ActiveRecord::RecordNotSaved. See # ActiveRecord::Callbacks for further details. + # + # Attributes marked as readonly are silently ignored if the record is + # being updated. def save!(*) create_or_update || raise(RecordNotSaved) end From f72b15eb636f3850add235397dc9e7fe71713b44 Mon Sep 17 00:00:00 2001 From: Neeraj Singh Date: Wed, 17 Apr 2013 17:30:19 -0400 Subject: [PATCH 18/51] bump the rails version in bug report template --- guides/bug_report_templates/active_record_gem.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/bug_report_templates/active_record_gem.rb b/guides/bug_report_templates/active_record_gem.rb index 2c63342572..2e604bec47 100644 --- a/guides/bug_report_templates/active_record_gem.rb +++ b/guides/bug_report_templates/active_record_gem.rb @@ -1,5 +1,5 @@ # Activate the gem you are reporting the issue against. -gem 'activerecord', '3.2.11' +gem 'activerecord', '3.2.13' require 'active_record' require 'minitest/autorun' require 'logger' From 2d98f7888009439cd82a15ec29562ac43b728ade Mon Sep 17 00:00:00 2001 From: Prathamesh Sonpatki Date: Thu, 18 Apr 2013 17:03:07 +0530 Subject: [PATCH 19/51] stdlib -> standard library --- guides/source/4_0_release_notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/source/4_0_release_notes.md b/guides/source/4_0_release_notes.md index 2793d9025f..d71e07053c 100644 --- a/guides/source/4_0_release_notes.md +++ b/guides/source/4_0_release_notes.md @@ -142,7 +142,7 @@ Please refer to the [Changelog](https://github.com/rails/rails/blob/master/activ * Deprecates the compatibility method Module#local_constant_names, use Module#local_constants instead (which returns symbols). -* BufferedLogger is deprecated. Use ActiveSupport::Logger, or the logger from Ruby stdlib. +* BufferedLogger is deprecated. Use ActiveSupport::Logger, or the logger from Ruby standard library. * Deprecate `assert_present` and `assert_blank` in favor of `assert object.blank?` and `assert object.present?` From e9eb30fae4f0a9645bcc258fa515182a29e72998 Mon Sep 17 00:00:00 2001 From: Rncrtr Date: Thu, 18 Apr 2013 14:25:27 -0600 Subject: [PATCH 20/51] fixed typo in select_tag docs --- actionpack/lib/action_view/helpers/form_tag_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actionpack/lib/action_view/helpers/form_tag_helper.rb b/actionpack/lib/action_view/helpers/form_tag_helper.rb index 8abd5d6e9c..c10566a87d 100644 --- a/actionpack/lib/action_view/helpers/form_tag_helper.rb +++ b/actionpack/lib/action_view/helpers/form_tag_helper.rb @@ -81,7 +81,7 @@ module ActionView # ==== Options # * :multiple - If set to true the selection will allow multiple choices. # * :disabled - If set to true, the user will not be able to use this input. - # * :include_blank - If set to true, an empty option will be create + # * :include_blank - If set to true, an empty option will be created. # * :prompt - Create a prompt option with blank value and the text asking user to select something # * Any other key creates standard HTML attributes for the tag. # From 1af528df58ea20fecd2668fd065144a1ba573658 Mon Sep 17 00:00:00 2001 From: Jonathan Roes Date: Thu, 18 Apr 2013 23:00:47 -0300 Subject: [PATCH 21/51] Remove versions from gems listing Since they will undoubtedly change often, it would be simpler to just include the names of the gems instead of updating this list every time Rails is released. --- guides/source/initialization.md | 54 ++++++++++++++++----------------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/guides/source/initialization.md b/guides/source/initialization.md index 412f2faaaa..610792fd6a 100644 --- a/guides/source/initialization.md +++ b/guides/source/initialization.md @@ -59,35 +59,33 @@ dependencies of the application. `config/boot.rb` sets `ENV['BUNDLE_GEMFILE']` to the location of this file. If the Gemfile exists, `bundler/setup` is then required. -The gems that a Rails 4 application depends on are as follows: +A standard Rails application depends on several gems, specifically: -TODO: change these when the Rails 4 release is near. - -* abstract (1.0.0) -* actionmailer (4.0.0.beta) -* actionpack (4.0.0.beta) -* activemodel (4.0.0.beta) -* activerecord (4.0.0.beta) -* activesupport (4.0.0.beta) -* arel (2.0.7) -* builder (3.0.0) -* bundler (1.0.6) -* erubis (2.6.6) -* i18n (0.5.0) -* mail (2.2.12) -* mime-types (1.16) -* polyglot (0.3.1) -* rack (1.2.1) -* rack-cache (0.5.3) -* rack-mount (0.6.13) -* rack-test (0.5.6) -* rails (4.0.0.beta) -* railties (4.0.0.beta) -* rake (0.8.7) -* sqlite3-ruby (1.3.2) -* thor (0.14.6) -* treetop (1.4.9) -* tzinfo (0.3.23) +* abstract +* actionmailer +* actionpack +* activemodel +* activerecord +* activesupport +* arel +* builder +* bundler +* erubis +* i18n +* mail +* mime-types +* polyglot +* rack +* rack-cache +* rack-mount +* rack-test +* rails +* railties +* rake +* sqlite3-ruby +* thor +* treetop +* tzinfo ### `rails/commands.rb` From 48cd23570b42147de3cb54446e620c961d089f07 Mon Sep 17 00:00:00 2001 From: Jonathan Roes Date: Thu, 18 Apr 2013 23:02:54 -0300 Subject: [PATCH 22/51] Be more specific about the root directory. --- guides/source/initialization.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/source/initialization.md b/guides/source/initialization.md index 610792fd6a..c71b0d5697 100644 --- a/guides/source/initialization.md +++ b/guides/source/initialization.md @@ -129,7 +129,7 @@ when 'server' end ``` -This file will change into the root of the directory (a path two directories back from `APP_PATH` which points at `config/application.rb`), but only if the `config.ru` file isn't found. This then requires `rails/commands/server` which sets up the `Rails::Server` class. +This file will change into the Rails root directory (a path two directories up from `APP_PATH` which points at `config/application.rb`), but only if the `config.ru` file isn't found. This then requires `rails/commands/server` which sets up the `Rails::Server` class. ```ruby require 'fileutils' From 6e5b0f9d25d6a2bbdc92979484929cedc19867ea Mon Sep 17 00:00:00 2001 From: Jonathan Roes Date: Thu, 18 Apr 2013 23:09:10 -0300 Subject: [PATCH 23/51] Grammar --- guides/source/initialization.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/guides/source/initialization.md b/guides/source/initialization.md index c71b0d5697..72d56b7feb 100644 --- a/guides/source/initialization.md +++ b/guides/source/initialization.md @@ -145,11 +145,11 @@ module Rails ### `actionpack/lib/action_dispatch.rb` Action Dispatch is the routing component of the Rails framework. -It adds functionalities like routing, session, and common middlewares. +It adds functionality like routing, session, and common middlewares. ### `rails/commands/server.rb` -The `Rails::Server` class is defined in this file as inheriting from `Rack::Server`. When `Rails::Server.new` is called, this calls the `initialize` method in `rails/commands/server.rb`: +The `Rails::Server` class is defined in this file by inheriting from `Rack::Server`. When `Rails::Server.new` is called, this calls the `initialize` method in `rails/commands/server.rb`: ```ruby def initialize(*) @@ -439,14 +439,14 @@ inside each of those frameworks, but you're encouraged to try and explore them on your own. For now, just keep in mind that common functionality like Rails engines, -I18n and Rails configuration is all being defined here. +I18n and Rails configuration are all being defined here. ### Back to `config/environment.rb` When `config/application.rb` has finished loading Rails, and defined -your application namespace, you go back to `config/environment.rb`, -where your application is initialized. For example, if you application was called -`Blog`, here you would find `Blog::Application.initialize!`, which is +the application namespace, we go back to `config/environment.rb`, +where the application is initialized. For example, if the application was called +`Blog`, here we would find `Blog::Application.initialize!`, which is defined in `rails/application.rb` ### `railties/lib/rails/application.rb` From ab819e5b10b121bd8b6eb2e04eb2c79c5b7f432a Mon Sep 17 00:00:00 2001 From: Prathamesh Sonpatki Date: Fri, 19 Apr 2013 08:26:42 +0530 Subject: [PATCH 24/51] rubygem -> RubyGem * Reference -> http://guides.rubygems.org/what-is-a-gem/ --- guides/source/3_0_release_notes.md | 2 +- guides/source/3_1_release_notes.md | 2 +- guides/source/3_2_release_notes.md | 2 +- guides/source/4_0_release_notes.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/guides/source/3_0_release_notes.md b/guides/source/3_0_release_notes.md index 388ba3fa30..6cb6f738e0 100644 --- a/guides/source/3_0_release_notes.md +++ b/guides/source/3_0_release_notes.md @@ -79,7 +79,7 @@ Creating a Rails 3.0 application -------------------------------- ```bash -# You should have the 'rails' rubygem installed +# You should have the 'rails' RubyGem installed $ rails new myapp $ cd myapp ``` diff --git a/guides/source/3_1_release_notes.md b/guides/source/3_1_release_notes.md index d3f8abe0c8..5c99892e39 100644 --- a/guides/source/3_1_release_notes.md +++ b/guides/source/3_1_release_notes.md @@ -137,7 +137,7 @@ Creating a Rails 3.1 application -------------------------------- ```bash -# You should have the 'rails' rubygem installed +# You should have the 'rails' RubyGem installed $ rails new myapp $ cd myapp ``` diff --git a/guides/source/3_2_release_notes.md b/guides/source/3_2_release_notes.md index afa06e002c..16ab7603a0 100644 --- a/guides/source/3_2_release_notes.md +++ b/guides/source/3_2_release_notes.md @@ -67,7 +67,7 @@ Creating a Rails 3.2 application -------------------------------- ```bash -# You should have the 'rails' rubygem installed +# You should have the 'rails' RubyGem installed $ rails new myapp $ cd myapp ``` diff --git a/guides/source/4_0_release_notes.md b/guides/source/4_0_release_notes.md index d71e07053c..5d8d1f93ff 100644 --- a/guides/source/4_0_release_notes.md +++ b/guides/source/4_0_release_notes.md @@ -22,7 +22,7 @@ Creating a Rails 4.0 application -------------------------------- ``` - You should have the 'rails' rubygem installed + You should have the 'rails' RubyGem installed $ rails new myapp $ cd myapp ``` From 615a2cb0f66ac15bc24a000027262c4b2f4d86ac Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Fri, 19 Apr 2013 00:06:02 -0300 Subject: [PATCH 25/51] MiniTest::Unit is used instead of Test::Unit --- guides/source/testing.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/guides/source/testing.md b/guides/source/testing.md index 4c0a61bc5e..b655bb2307 100644 --- a/guides/source/testing.md +++ b/guides/source/testing.md @@ -159,9 +159,10 @@ class PostTest < ActiveSupport::TestCase The `PostTest` class defines a _test case_ because it inherits from `ActiveSupport::TestCase`. `PostTest` thus has all the methods available from `ActiveSupport::TestCase`. You'll see those methods a little later in this guide. -Any method defined within a `Test::Unit` test case that begins with `test` (case sensitive) is simply called a test. So, `test_password`, `test_valid_password` and `testValidPassword` all are legal test names and are run automatically when the test case is run. +Any method defined within a class inherited from `MiniTest::Unit::TestCase` +(which is the superclass of `ActiveSupport::TestCase`) that begins with `test` (case sensitive) is simply called a test. So, `test_password`, `test_valid_password` and `testValidPassword` all are legal test names and are run automatically when the test case is run. -Rails adds a `test` method that takes a test name and a block. It generates a normal `Test::Unit` test with method names prefixed with `test_`. So, +Rails adds a `test` method that takes a test name and a block. It generates a normal `MiniTest::Unit` test with method names prefixed with `test_`. So, ```ruby test "the truth" do From 385edec24d45e35191aba474d2a740f6f38313c0 Mon Sep 17 00:00:00 2001 From: Jonathan Roes Date: Fri, 19 Apr 2013 23:44:52 -0300 Subject: [PATCH 26/51] Simplify ERB example code --- guides/source/testing.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/source/testing.md b/guides/source/testing.md index b655bb2307..cab13751f0 100644 --- a/guides/source/testing.md +++ b/guides/source/testing.md @@ -85,8 +85,8 @@ ERB allows you to embed Ruby code within templates. The YAML fixture format is p ```erb <% 1000.times do |n| %> user_<%= n %>: - username: <%= "user%03d" % n %> - email: <%= "user%03d@example.com" % n %> + username: <%= "user#{n}" %> + email: <%= "user#{n}@example.com" %> <% end %> ``` From 8a70b2dbbb4b65e14948b39e91cf0d341d4679de Mon Sep 17 00:00:00 2001 From: Jonathan Roes Date: Fri, 19 Apr 2013 23:49:40 -0300 Subject: [PATCH 27/51] There are now 6 request methods including PATCH --- guides/source/testing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/source/testing.md b/guides/source/testing.md index cab13751f0..62c642195a 100644 --- a/guides/source/testing.md +++ b/guides/source/testing.md @@ -476,7 +476,7 @@ NOTE: Functional tests do not verify whether the specified request type should b ### The Four Hashes of the Apocalypse -After a request has been made by using one of the 5 methods (`get`, `post`, etc.) and processed, you will have 4 Hash objects ready for use: +After a request has been made using one of the 6 methods (`get`, `post`, etc.) and processed, you will have 4 Hash objects ready for use: * `assigns` - Any objects that are stored as instance variables in actions for use in views. * `cookies` - Any cookies that are set. From 1c204fcdade7c40d35aee5d4c540c859614fc842 Mon Sep 17 00:00:00 2001 From: Fiona Tay Date: Sun, 21 Apr 2013 01:05:29 -0700 Subject: [PATCH 28/51] Make guide description more concise --- guides/source/action_mailer_basics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/source/action_mailer_basics.md b/guides/source/action_mailer_basics.md index ec7b8d4e17..c351339117 100644 --- a/guides/source/action_mailer_basics.md +++ b/guides/source/action_mailer_basics.md @@ -1,7 +1,7 @@ Action Mailer Basics ==================== -This guide should provide you with all you need to get started in sending and +This guide provides you with all you need to get started in sending and receiving emails from and to your application, and many internals of Action Mailer. It also covers how to test your mailers. From 56cdf7809d7664ebae1c6ce721967d954655a65b Mon Sep 17 00:00:00 2001 From: Jonathan Roes Date: Sun, 21 Apr 2013 14:06:25 -0300 Subject: [PATCH 29/51] Refer to 37signals blog post for alternative According to the rationale at https://github.com/rails/rails/pull/7833#issuecomment-9141908, we should recommend new users to follow DHH's approach outlined at http://37signals.com/svn/posts/3113-how-key-based-cache-expiration-works. This is the first step, and perhaps in the future we can write some specific recommendations out. --- guides/source/caching_with_rails.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/source/caching_with_rails.md b/guides/source/caching_with_rails.md index e1fc3d0f53..456abaf612 100644 --- a/guides/source/caching_with_rails.md +++ b/guides/source/caching_with_rails.md @@ -30,13 +30,13 @@ config.action_controller.perform_caching = true Page caching is a Rails mechanism which allows the request for a generated page to be fulfilled by the webserver (i.e. Apache or nginx), without ever having to go through the Rails stack at all. Obviously, this is super-fast. Unfortunately, it can't be applied to every situation (such as pages that need authentication) and since the webserver is literally just serving a file from the filesystem, cache expiration is an issue that needs to be dealt with. -INFO: Page Caching has been removed from Rails 4. See the [actionpack-page_caching gem](https://github.com/rails/actionpack-page_caching) +INFO: Page Caching has been removed from Rails 4. See the [actionpack-page_caching gem](https://github.com/rails/actionpack-page_caching). See [DHH's key-based cache expiration overview](http://37signals.com/svn/posts/3113-how-key-based-cache-expiration-works) for the newly-preferred method. ### Action Caching Page Caching cannot be used for actions that have before filters - for example, pages that require authentication. This is where Action Caching comes in. Action Caching works like Page Caching except the incoming web request hits the Rails stack so that before filters can be run on it before the cache is served. This allows authentication and other restrictions to be run while still serving the result of the output from a cached copy. -INFO: Action Caching has been removed from Rails 4. See the [actionpack-action_caching gem](https://github.com/rails/actionpack-action_caching) +INFO: Action Caching has been removed from Rails 4. See the [actionpack-action_caching gem](https://github.com/rails/actionpack-action_caching). See [DHH's key-based cache expiration overview](http://37signals.com/svn/posts/3113-how-key-based-cache-expiration-works) for the newly-preferred method. ### Fragment Caching From 825d67687f37a7a223ee9025500abeb6b0bb6770 Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Sun, 21 Apr 2013 16:28:39 -0300 Subject: [PATCH 30/51] Updates list of assertions in testing guide --- guides/source/testing.md | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/guides/source/testing.md b/guides/source/testing.md index 62c642195a..7a182e1410 100644 --- a/guides/source/testing.md +++ b/guides/source/testing.md @@ -347,31 +347,38 @@ NOTE: The execution of each test method stops as soon as any error or an asserti Ideally, you would like to include a test for everything which could possibly break. It's a good practice to have at least one test for each of your validations and at least one test for every method in your model. -### Assertions Available +### Available Assertions By now you've caught a glimpse of some of the assertions that are available. Assertions are the worker bees of testing. They are the ones that actually perform the checks to ensure that things are going as planned. -There are a bunch of different types of assertions you can use. Here's the complete list of assertions that ship with `test/unit`, the default testing library used by Rails. The `[msg]` parameter is an optional string message you can specify to make your test failure messages clearer. It's not required. +There are a bunch of different types of assertions you can use. +Here's an extract of the assertions you can use with `minitest`, the default testing library used by Rails. The `[msg]` parameter is an optional string message you can specify to make your test failure messages clearer. It's not required. | Assertion | Purpose | | ---------------------------------------------------------------- | ------- | -| `assert( boolean, [msg] )` | Ensures that the object/expression is true.| +| `assert( test, [msg] )` | Ensures that `test` is true.| +| `refute( test, [msg] )` | Ensures that `test` is false.| | `assert_equal( expected, actual, [msg] )` | Ensures that `expected == actual` is true.| -| `assert_not_equal( expected, actual, [msg] )` | Ensures that `expected != actual` is true.| +| `refute_equal( expected, actual, [msg] )` | Ensures that `expected != actual` is true.| | `assert_same( expected, actual, [msg] )` | Ensures that `expected.equal?(actual)` is true.| -| `assert_not_same( expected, actual, [msg] )` | Ensures that `!expected.equal?(actual)` is true.| +| `refute_same( expected, actual, [msg] )` | Ensures that `expected.equal?(actual)` is false.| | `assert_nil( obj, [msg] )` | Ensures that `obj.nil?` is true.| -| `assert_not_nil( obj, [msg] )` | Ensures that `!obj.nil?` is true.| +| `refute_nil( obj, [msg] )` | Ensures that `obj.nil?` is false.| | `assert_match( regexp, string, [msg] )` | Ensures that a string matches the regular expression.| -| `assert_no_match( regexp, string, [msg] )` | Ensures that a string doesn't match the regular expression.| -| `assert_in_delta( expecting, actual, delta, [msg] )` | Ensures that the numbers `expecting` and `actual` are within `delta` of each other.| +| `refute_match( regexp, string, [msg] )` | Ensures that a string doesn't match the regular expression.| +| `assert_in_delta( expecting, actual, [delta], [msg] )` | Ensures that the numbers `expected` and `actual` are within `delta` of each other.| +| `refute_in_delta( expecting, actual, [delta], [msg] )` | Ensures that the numbers `expected` and `actual` are not within `delta` of each other.| | `assert_throws( symbol, [msg] ) { block }` | Ensures that the given block throws the symbol.| -| `assert_raise( exception1, exception2, ... ) { block }` | Ensures that the given block raises one of the given exceptions.| +| `assert_raises( exception1, exception2, ... ) { block }` | Ensures that the given block raises one of the given exceptions.| | `assert_nothing_raised( exception1, exception2, ... ) { block }` | Ensures that the given block doesn't raise one of the given exceptions.| -| `assert_instance_of( class, obj, [msg] )` | Ensures that `obj` is of the `class` type.| +| `assert_instance_of( class, obj, [msg] )` | Ensures that `obj` is an instance of `class`.| +| `refute_instance_of( class, obje, [msg] )` | Ensures that `obj` is not an instance of `class`.| | `assert_kind_of( class, obj, [msg] )` | Ensures that `obj` is or descends from `class`.| -| `assert_respond_to( obj, symbol, [msg] )` | Ensures that `obj` has a method called `symbol`.| -| `assert_operator( obj1, operator, obj2, [msg] )` | Ensures that `obj1.operator(obj2)` is true.| +| `refute_kind_of( class, obj, [msg] )` | Ensures that `obj` is not an instance of `class` and is not descending from it.| +| `assert_respond_to( obj, symbol, [msg] )` | Ensures that `obj` responds to `symbol`.| +| `refute_respond_to( obj, symbol, [msg] )` | Ensures that `obj` does not respond to `symbol`.| +| `assert_operator( obj1, operator, [obj2], [msg] )` | Ensures that `obj1.operator(obj2)` is true.| +| `refute_operator( obj1, operator, [obj2], [msg] )` | Ensures that `obj1.operator(obj2)` is false.| | `assert_send( array, [msg] )` | Ensures that executing the method listed in `array[1]` on the object in `array[0]` with the parameters of `array[2 and up]` is true. This one is weird eh?| | `flunk( [msg] )` | Ensures failure. This is useful to explicitly mark a test that isn't finished yet.| From 88b08f0786bb1843d20f7b10e2709440d8bf958d Mon Sep 17 00:00:00 2001 From: Florian Thomas Date: Sun, 21 Apr 2013 16:31:29 -0300 Subject: [PATCH 31/51] fixes typo in testing guide --- guides/source/testing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/source/testing.md b/guides/source/testing.md index 7a182e1410..b198f5632f 100644 --- a/guides/source/testing.md +++ b/guides/source/testing.md @@ -372,7 +372,7 @@ Here's an extract of the assertions you can use with `minitest`, the default tes | `assert_raises( exception1, exception2, ... ) { block }` | Ensures that the given block raises one of the given exceptions.| | `assert_nothing_raised( exception1, exception2, ... ) { block }` | Ensures that the given block doesn't raise one of the given exceptions.| | `assert_instance_of( class, obj, [msg] )` | Ensures that `obj` is an instance of `class`.| -| `refute_instance_of( class, obje, [msg] )` | Ensures that `obj` is not an instance of `class`.| +| `refute_instance_of( class, obj, [msg] )` | Ensures that `obj` is not an instance of `class`.| | `assert_kind_of( class, obj, [msg] )` | Ensures that `obj` is or descends from `class`.| | `refute_kind_of( class, obj, [msg] )` | Ensures that `obj` is not an instance of `class` and is not descending from it.| | `assert_respond_to( obj, symbol, [msg] )` | Ensures that `obj` responds to `symbol`.| From 9616849ccb52b517614fcd964c0f074e16a805c9 Mon Sep 17 00:00:00 2001 From: aditya-kapoor Date: Mon, 22 Apr 2013 15:21:10 +0530 Subject: [PATCH 32/51] corrected a line related to on: :save option in validations --- guides/source/active_record_validations.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/guides/source/active_record_validations.md b/guides/source/active_record_validations.md index d043e42090..c279ef0a4a 100644 --- a/guides/source/active_record_validations.md +++ b/guides/source/active_record_validations.md @@ -765,6 +765,8 @@ class Person < ActiveRecord::Base validates :age, numericality: true, on: :update # the default (validates on both create and update) + The following line is in review state and as of now, it is not running in any version of Rails 3.2.x as discussed in this [issue](https://github.com/rails/rails/issues/10248) + validates :name, presence: true, on: :save end ``` From d2a799895b19cabca86a209cf2dac0dc5215ab48 Mon Sep 17 00:00:00 2001 From: aditya-kapoor Date: Mon, 22 Apr 2013 15:26:29 +0530 Subject: [PATCH 33/51] corrected a typo related to on: :save option in validations --- guides/source/active_record_validations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/source/active_record_validations.md b/guides/source/active_record_validations.md index c279ef0a4a..842779e0ea 100644 --- a/guides/source/active_record_validations.md +++ b/guides/source/active_record_validations.md @@ -765,7 +765,7 @@ class Person < ActiveRecord::Base validates :age, numericality: true, on: :update # the default (validates on both create and update) - The following line is in review state and as of now, it is not running in any version of Rails 3.2.x as discussed in this [issue](https://github.com/rails/rails/issues/10248) + # The following line is in review state and as of now, it is not running in any version of Rails 3.2.x as discussed in this [issue](https://github.com/rails/rails/issues/10248) validates :name, presence: true, on: :save end From 98ed2d43c4fb49bf1a45e4f3ddd2502bac5b1caf Mon Sep 17 00:00:00 2001 From: Alexey Vakhov Date: Mon, 22 Apr 2013 12:54:16 +0400 Subject: [PATCH 34/51] Make AM readme example more consistent At 4a6eba32 mail sending example was rewrited from rails 2 format to modern rails 3 approach. But passing parameter `recipient` to method Notifier#welcome was lost. Passing email as parameter makes this example more solid. --- actionmailer/README.rdoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/actionmailer/README.rdoc b/actionmailer/README.rdoc index ffd2217d58..a14a6ba18f 100644 --- a/actionmailer/README.rdoc +++ b/actionmailer/README.rdoc @@ -67,12 +67,12 @@ simply call the method and optionally call +deliver+ on the return value. Calling the method returns a Mail Message object: - message = Notifier.welcome # => Returns a Mail::Message object - message.deliver # => delivers the email + message = Notifier.welcome("david@loudthinking.com") # => Returns a Mail::Message object + message.deliver # => delivers the email Or you can just chain the methods together like: - Notifier.welcome.deliver # Creates the email and sends it immediately + Notifier.welcome("david@loudthinking.com").deliver # Creates the email and sends it immediately == Setting defaults From 73fece000f93d811337e18f376acc6df3efed6b3 Mon Sep 17 00:00:00 2001 From: aditya-kapoor Date: Mon, 22 Apr 2013 16:16:44 +0530 Subject: [PATCH 35/51] Added instructions of latest bundler install + modified the on: :save option description in validations --- guides/source/active_record_validations.md | 3 +-- guides/source/ruby_on_rails_guides_guidelines.md | 4 ++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/guides/source/active_record_validations.md b/guides/source/active_record_validations.md index 842779e0ea..dfc951f10e 100644 --- a/guides/source/active_record_validations.md +++ b/guides/source/active_record_validations.md @@ -765,11 +765,10 @@ class Person < ActiveRecord::Base validates :age, numericality: true, on: :update # the default (validates on both create and update) - # The following line is in review state and as of now, it is not running in any version of Rails 3.2.x as discussed in this [issue](https://github.com/rails/rails/issues/10248) - validates :name, presence: true, on: :save end ``` +The last line is in review state and as of now, it is not running in any version of Rails 3.2.x as discussed in this [issue](https://github.com/rails/rails/issues/10248) Strict Validations ------------------ diff --git a/guides/source/ruby_on_rails_guides_guidelines.md b/guides/source/ruby_on_rails_guides_guidelines.md index 136dfb4cae..d5d1ee0a38 100644 --- a/guides/source/ruby_on_rails_guides_guidelines.md +++ b/guides/source/ruby_on_rails_guides_guidelines.md @@ -63,6 +63,10 @@ Those guidelines apply also to guides. HTML Guides ----------- +Before generating the guides, make sure that you have the latest version of Bundler installed on your system. As of this writing, you must install Bundler 1.3.5 on your device. + +To install the latest version of Bundler, simply run the `gem install bundler` command + ### Generation To generate all the guides, just `cd` into the `guides` directory, run `bundle install` and execute: From 099f1176c055bf213b41fe61e46c01b10072698a Mon Sep 17 00:00:00 2001 From: Jonathan Roes Date: Tue, 23 Apr 2013 00:02:24 -0300 Subject: [PATCH 36/51] Mention that Dynamic finders have been deprecated in Rails 4 --- guides/source/active_record_querying.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/guides/source/active_record_querying.md b/guides/source/active_record_querying.md index e1d9f39c3e..e55810bebb 100644 --- a/guides/source/active_record_querying.md +++ b/guides/source/active_record_querying.md @@ -1301,6 +1301,8 @@ Client.unscoped { Dynamic Finders --------------- +NOTE: Dynamic finders have been deprecated in Rails 4.0 and will be removed in Rails 4.1. The best practice is to use ActiveRecord scopes instead. You can find the deprecation gem at https://github.com/rails/activerecord-deprecated_finders + For every field (also known as an attribute) you define in your table, Active Record provides a finder method. If you have a field called `first_name` on your `Client` model for example, you get `find_by_first_name` for free from Active Record. If you have a `locked` field on the `Client` model, you also get `find_by_locked` and methods. You can specify an exclamation point (`!`) on the end of the dynamic finders to get them to raise an `ActiveRecord::RecordNotFound` error if they do not return any records, like `Client.find_by_name!("Ryan")` From a145c1b4afb880f077a1811c3aec29d40bbcad81 Mon Sep 17 00:00:00 2001 From: Alexey Vakhov Date: Tue, 23 Apr 2013 10:05:09 +0400 Subject: [PATCH 37/51] Cosmetic fixes in AM::Base docs. Missed spaces in OpenSSL constants enumerations. Injected at a1639ad. --- actionmailer/lib/action_mailer/base.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actionmailer/lib/action_mailer/base.rb b/actionmailer/lib/action_mailer/base.rb index ff74185e37..351c14be7d 100644 --- a/actionmailer/lib/action_mailer/base.rb +++ b/actionmailer/lib/action_mailer/base.rb @@ -334,8 +334,8 @@ module ActionMailer # and starts to use it. # * :openssl_verify_mode - When using TLS, you can set how OpenSSL checks the certificate. This is # really useful if you need to validate a self-signed and/or a wildcard certificate. You can use the name - # of an OpenSSL verify constant ('none', 'peer', 'client_once','fail_if_no_peer_cert') or directly the - # constant (OpenSSL::SSL::VERIFY_NONE, OpenSSL::SSL::VERIFY_PEER,...). + # of an OpenSSL verify constant ('none', 'peer', 'client_once', 'fail_if_no_peer_cert') or directly the + # constant (OpenSSL::SSL::VERIFY_NONE, OpenSSL::SSL::VERIFY_PEER, ...). # # * sendmail_settings - Allows you to override options for the :sendmail delivery method. # * :location - The location of the sendmail executable. Defaults to /usr/sbin/sendmail. From e1df81c2050fee6758eaad073bc56795cfc9f467 Mon Sep 17 00:00:00 2001 From: Alexey Vakhov Date: Tue, 23 Apr 2013 10:30:31 +0400 Subject: [PATCH 38/51] Remove superfluous `self.` in Action Mailer mail method documetation Notation with `self` was sugestted at 0b05acd, when self.defaults was extlib_inheritable_accessor. But now all Action Mailer examples are without this self. It's nicer. --- actionmailer/lib/action_mailer/base.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/actionmailer/lib/action_mailer/base.rb b/actionmailer/lib/action_mailer/base.rb index 351c14be7d..1fff958ceb 100644 --- a/actionmailer/lib/action_mailer/base.rb +++ b/actionmailer/lib/action_mailer/base.rb @@ -596,9 +596,9 @@ module ActionMailer # class method: # # class Notifier < ActionMailer::Base - # self.default from: 'no-reply@test.lindsaar.net', - # bcc: 'email_logger@test.lindsaar.net', - # reply_to: 'bounces@test.lindsaar.net' + # default from: 'no-reply@test.lindsaar.net', + # bcc: 'email_logger@test.lindsaar.net', + # reply_to: 'bounces@test.lindsaar.net' # end # # If you need other headers not listed above, you can either pass them in From bdce0c0bb10da18de955a9af5cb2bcadbc255f7b Mon Sep 17 00:00:00 2001 From: Zoltan Debre Date: Tue, 23 Apr 2013 14:10:18 +0200 Subject: [PATCH 39/51] Update assets_pipeline with config.assets.precompile location rake assets:precompile will work if config.assets.precompile is in config/application.rb and not in config/environment/production.rb --- guides/source/asset_pipeline.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/source/asset_pipeline.md b/guides/source/asset_pipeline.md index 54548c5a0b..85301f69bc 100644 --- a/guides/source/asset_pipeline.md +++ b/guides/source/asset_pipeline.md @@ -450,7 +450,7 @@ The default matcher for compiling files includes `application.js`, `application. NOTE. The matcher (and other members of the precompile array; see below) is applied to final compiled file names. This means that anything that compiles to JS/CSS is excluded, as well as raw JS/CSS files; for example, `.coffee` and `.scss` files are **not** automatically included as they compile to JS/CSS. -If you have other manifests or individual stylesheets and JavaScript files to include, you can add them to the `precompile` array: +If you have other manifests or individual stylesheets and JavaScript files to include, you can add them to the `precompile` array in `config/application.rb`: ```ruby config.assets.precompile += ['admin.js', 'admin.css', 'swfObject.js'] @@ -459,7 +459,7 @@ config.assets.precompile += ['admin.js', 'admin.css', 'swfObject.js'] Or you can opt to precompile all assets with something like this: ```ruby -# config/environments/production.rb +# config/application.rb config.assets.precompile << Proc.new do |path| if path =~ /\.(css|js)\z/ full_path = Rails.application.assets.resolve(path).to_path From 3c530dbc77ac5e92591fb1a29b6edd84ae04b8c4 Mon Sep 17 00:00:00 2001 From: hughkelsey Date: Tue, 23 Apr 2013 12:29:11 -0700 Subject: [PATCH 40/51] Added missing ')' on routing_filter link --- guides/source/i18n.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/source/i18n.md b/guides/source/i18n.md index d187d3a03a..3c4c1e2cb3 100644 --- a/guides/source/i18n.md +++ b/guides/source/i18n.md @@ -258,7 +258,7 @@ match '/:locale' => 'dashboard#index' Do take special care about the **order of your routes**, so this route declaration does not "eat" other ones. (You may want to add it directly before the `root :to` declaration.) -NOTE: Have a look at two plugins which simplify work with routes in this way: Sven Fuchs's [routing_filter](https://github.com/svenfuchs/routing-filter/tree/master and Raul Murciano's [translate_routes](https://github.com/raul/translate_routes/tree/master). +NOTE: Have a look at two plugins which simplify work with routes in this way: Sven Fuchs's [routing_filter](https://github.com/svenfuchs/routing-filter/tree/master) and Raul Murciano's [translate_routes](https://github.com/raul/translate_routes/tree/master). ### Setting the Locale from the Client Supplied Information From 33ce495884eaeedc9445f8a08eb606af6de972a9 Mon Sep 17 00:00:00 2001 From: Nick Borromeo Date: Mon, 22 Apr 2013 23:31:16 -0700 Subject: [PATCH 41/51] Move use of named routes to beggining of the guide --- guides/source/getting_started.md | 101 ++++++++++--------------------- 1 file changed, 32 insertions(+), 69 deletions(-) diff --git a/guides/source/getting_started.md b/guides/source/getting_started.md index d49a30d02f..1c87f169aa 100644 --- a/guides/source/getting_started.md +++ b/guides/source/getting_started.md @@ -252,6 +252,34 @@ Now that you've seen how to create a controller, an action and a view, let's cre In the Blog application, you will now create a new _resource_. A resource is the term used for a collection of similar objects, such as posts, people or animals. You can create, read, update and destroy items for a resource and these operations are referred to as _CRUD_ operations. +Rails provides a `resources` method which can be used to declare a +standard REST resource. Here's how `config/routes.rb` will look like. + +```ruby +Blog::Application.routes.draw do + + resources :posts + + root to: "welcome#index" +end +``` + +If you run `rake routes`, you'll see that all the routes for the +standard RESTful actions. + +```bash +$ rake routes + posts GET /posts(.:format) posts#index + POST /posts(.:format) posts#create + new_post GET /posts/new(.:format) posts#new +edit_post GET /posts/:id/edit(.:format) posts#edit + post GET /posts/:id(.:format) posts#show + PATCH /posts/:id(.:format) posts#update + PUT /posts/:id(.:format) posts#update + DELETE /posts/:id(.:format) posts#destroy + root / welcome#index +``` + In the next section, you will add the ability to create new posts in your application and be able to view them. This is the "C" and the "R" from CRUD: creation and reading. The form for doing this will look like this: ![The new post form](images/getting_started/new_post.png) @@ -260,21 +288,7 @@ It will look a little basic for now, but that's ok. We'll look at improving the ### Laying down the ground work -The first thing that you are going to need to create a new post within the application is a place to do that. A great place for that would be at `/posts/new`. If you attempt to navigate to that now — by visiting — Rails will give you a routing error: - -![A routing error, no route matches /posts/new](images/getting_started/routing_error_no_route_matches.png) - -This is because there is nowhere inside the routes for the application — defined inside `config/routes.rb` — that defines this route. By default, Rails has no routes configured at all, besides the root route you defined earlier, and so you must define your routes as you need them. - - To do this, you're going to need to create a route inside `config/routes.rb` file, on a new line between the `do` and the `end` for the `draw` method: - -```ruby -get "posts/new" -``` - -This route is a super-simple route: it defines a new route that only responds to `GET` requests, and that the route is at `posts/new`. But how does it know where to go without the use of the `:to` option? Well, Rails uses a sensible default here: Rails will assume that you want this route to go to the new action inside the posts controller. - -With the route defined, requests can now be made to `/posts/new` in the application. Navigate to and you'll see another routing error: +The first thing that you are going to need to create a new post within the application is a place to do that. A great place for that would be at `/posts/new`. With the route already defined, requests can now be made to `/posts/new` in the application. Navigate to and you'll see a routing error: ![Another routing error, uninitialized constant PostsController](images/getting_started/routing_error_no_controller.png) @@ -1153,62 +1167,11 @@ generated the application. Without this file, the confirmation dialog box wouldn ![Confirm Dialog](images/getting_started/confirm_dialog.png) Congratulations, you can now create, show, list, update and destroy -posts. In the next section will see how Rails can aid us when creating -REST applications, and how we can refactor our Blog app to take -advantage of it. - -### Going Deeper into REST - -We've now covered all the CRUD actions of a REST app. We did so by -declaring separate routes with the appropriate verbs into -`config/routes.rb`. Here's how that file looks so far: - -```ruby -get "posts" => "posts#index" -get "posts/new" -post "posts" => "posts#create" -get "posts/:id" => "posts#show", as: :post -get "posts/:id/edit" => "posts#edit" -patch "posts/:id" => "posts#update" -delete "posts/:id" => "posts#destroy" -``` - -That's a lot to type for covering a single **resource**. Fortunately, -Rails provides a `resources` method which can be used to declare a -standard REST resource. Here's how `config/routes.rb` looks after the -cleanup: - -```ruby -Blog::Application.routes.draw do - - resources :posts - - root to: "welcome#index" -end -``` - -If you run `rake routes`, you'll see that all the routes that we -declared before are still available: - -```bash -$ rake routes - posts GET /posts(.:format) posts#index - POST /posts(.:format) posts#create - new_post GET /posts/new(.:format) posts#new -edit_post GET /posts/:id/edit(.:format) posts#edit - post GET /posts/:id(.:format) posts#show - PATCH /posts/:id(.:format) posts#update - PUT /posts/:id(.:format) posts#update - DELETE /posts/:id(.:format) posts#destroy - root / welcome#index -``` - -Also, if you go through the motions of creating, updating and deleting -posts the app still works as before. +posts. TIP: In general, Rails encourages the use of resources objects in place -of declaring routes manually. It was only done in this guide as a learning -exercise. For more information about routing, see +of declaring routes manually. +For more information about routing, see [Rails Routing from the Outside In](routing.html). Adding a Second Model From d46b4e9c62f3db72930f9dba264c7d0b9a1e79d0 Mon Sep 17 00:00:00 2001 From: Nick Borromeo Date: Tue, 23 Apr 2013 14:17:25 -0700 Subject: [PATCH 42/51] Remove calls to action: and make use of named routes for consistency. --- guides/source/getting_started.md | 141 ++++++++----------------------- 1 file changed, 35 insertions(+), 106 deletions(-) diff --git a/guides/source/getting_started.md b/guides/source/getting_started.md index 1c87f169aa..cd7bc399ac 100644 --- a/guides/source/getting_started.md +++ b/guides/source/getting_started.md @@ -391,14 +391,10 @@ like this is called "create", and so the form should be pointed to that action. Edit the `form_for` line inside `app/views/posts/new.html.erb` to look like this: ```html+erb -<%= form_for :post, url: { action: :create } do |f| %> +<%= form_for :post, url: posts_path do |f| %> ``` -In this example, a `Hash` object is passed to the `:url` option. What Rails will do with this is that it will point the form to the `create` action of the current controller, the `PostsController`, and will send a `POST` request to that route. For this to work, you will need to add a route to `config/routes.rb`, right underneath the one for "posts/new": - -```ruby -post "posts" => "posts#create" -``` +In this example, the `posts_path` helper is passed to the `:url` option. What Rails will do with this is that it will point the form to the `create` action of the current controller, the `PostsController`, and will send a `POST` request to that route. By using the `post` method rather than the `get` method, Rails will define a route that will only respond to POST methods. The POST method is the typical method used by forms all over the web. @@ -538,7 +534,7 @@ def create @post = Post.new(params[:post]) @post.save - redirect_to action: :show, id: @post.id + redirect_to post end ``` @@ -557,16 +553,14 @@ whether the model was saved or not. If you submit the form again now, Rails will complain about not finding the `show` action. That's not very useful though, so let's add the -`show` action before proceeding. Open `config/routes.rb` and add the following route: +`show` action before proceeding. ```ruby -get "posts/:id" => "posts#show" +post GET /posts/:id(.:format) posts#show ``` The special syntax `:id` tells rails that this route expects an `:id` -parameter, which in our case will be the id of the post. Note that this -time we had to specify the actual mapping, `posts#show` because -otherwise Rails would not know which action to render. +parameter, which in our case will be the id of the post. As we did before, we need to add the `show` action in `app/controllers/posts_controller.rb` and its respective view. @@ -615,7 +609,7 @@ look like this: @post = Post.new(params[:post].permit(:title, :text)) @post.save - redirect_to action: :show, id: @post.id + redirect_to post end ``` @@ -627,11 +621,11 @@ Visit and give it a try! ### Listing all posts -We still need a way to list all our posts, so let's do that. As usual, -we'll need a route placed into `config/routes.rb`: +We still need a way to list all our posts, so let's do that. +We'll use a specific route from `config/routes.rb`: ```ruby -get "posts" => "posts#index" +posts GET /posts(.:format) posts#index ``` And an action for that route inside the `PostsController` in the `app/controllers/posts_controller.rb` file: @@ -683,7 +677,7 @@ for posts. Let's add links to the other views as well, starting with adding this "New Post" link to `app/views/posts/index.html.erb`, placing it above the `` tag: ```erb -<%= link_to 'New post', action: :new %> +<%= link_to 'New post', new_post_path %> ``` This link will allow you to bring up the form that lets you create a new post. You should also add a link to this template — `app/views/posts/new.html.erb` — to go back to the `index` action. Do this by adding this underneath the form in this template: @@ -693,7 +687,7 @@ This link will allow you to bring up the form that lets you create a new post. Y ... <% end %> -<%= link_to 'Back', action: :index %> +<%= link_to 'Back', posts_path %> ``` Finally, add another link to the `app/views/posts/show.html.erb` template to go back to the `index` action as well, so that people who are viewing a single post can go back and view the whole list again: @@ -709,7 +703,7 @@ Finally, add another link to the `app/views/posts/show.html.erb` template to go <%= @post.text %>

-<%= link_to 'Back', action: :index %> +<%= link_to 'Back', posts_path %> ``` TIP: If you want to link to an action in the same controller, you don't @@ -769,7 +763,7 @@ def create @post = Post.new(params[:post].permit(:title, :text)) if @post.save - redirect_to action: :show, id: @post.id + redirect_to post else render 'new' end @@ -790,7 +784,7 @@ something went wrong. To do that, you'll modify `app/views/posts/new.html.erb` to check for error messages: ```html+erb -<%= form_for :post, url: { action: :create } do |f| %> +<%= form_for :post, url: posts_path do |f| %> <% if @post.errors.any? %>

<%= pluralize(@post.errors.count, "error") %> prohibited @@ -817,7 +811,7 @@ something went wrong. To do that, you'll modify

<% end %> -<%= link_to 'Back', action: :index %> +<%= link_to 'Back', posts_path %> ``` A few things are going on. We check if there are any errors with @@ -846,14 +840,6 @@ We've covered the "CR" part of CRUD. Now let's focus on the "U" part, updating p The first step we'll take is adding an `edit` action to `posts_controller`. -Start by adding a route to `config/routes.rb`: - -```ruby -get "posts/:id/edit" => "posts#edit" -``` - -And then add the controller action: - ```ruby def edit @post = Post.find(params[:id]) @@ -867,7 +853,7 @@ it look as follows: ```html+erb

Editing post

-<%= form_for :post, url: { action: :update, id: @post.id }, +<%= form_for :post, url: post_path(@post.id) }, method: :patch do |f| %> <% if @post.errors.any? %>
@@ -895,7 +881,7 @@ method: :patch do |f| %>

<% end %> -<%= link_to 'Back', action: :index %> +<%= link_to 'Back', posts_path %> ``` This time we point the form to the `update` action, which is not defined yet @@ -907,21 +893,14 @@ via the `PATCH` HTTP method which is the HTTP method you're expected to use to TIP: By default forms built with the _form_for_ helper are sent via `POST`. -Next, we need to add the `update` action. The file -`config/routes.rb` will need just one more line: - -```ruby -patch "posts/:id" => "posts#update" -``` - -And then create the `update` action in `app/controllers/posts_controller.rb`: +Next we need to create the `update` action in `app/controllers/posts_controller.rb`: ```ruby def update @post = Post.find(params[:id]) if @post.update(params[:post].permit(:title, :text)) - redirect_to action: :show, id: @post.id + redirect_to post else render 'edit' end @@ -955,8 +934,8 @@ appear next to the "Show" link:
- - + + <% end %>
<%= post.title %> <%= post.text %><%= link_to 'Show', action: :show, id: post.id %><%= link_to 'Edit', action: :edit, id: post.id %><%= link_to 'Show', post_path %><%= link_to 'Edit', edit_post_path(post) %>
@@ -969,8 +948,8 @@ the template: ```html+erb ... -<%= link_to 'Back', action: :index %> -| <%= link_to 'Edit', action: :edit, id: @post.id %> +<%= link_to 'Back', posts_path %> +| <%= link_to 'Edit', edit_post_path(@post) %> ``` And here's how our app looks so far: @@ -1030,7 +1009,7 @@ completely: <%= render 'form' %> -<%= link_to 'Back', action: :index %> +<%= link_to 'Back', posts_path %> ``` Then do the same for the `app/views/posts/edit.html.erb` view: @@ -1040,66 +1019,17 @@ Then do the same for the `app/views/posts/edit.html.erb` view: <%= render 'form' %> -<%= link_to 'Back', action: :index %> +<%= link_to 'Back', posts_path %> ``` -Point your browser to and -try creating a new post. Everything still works. Now try editing the -post and you'll receive the following error: - -![Undefined method post_path](images/getting_started/undefined_method_post_path.png) - -To understand this error, you need to understand how `form_for` works. -When you pass an object to `form_for` and you don't specify a `:url` -option, Rails will try to guess the `action` and `method` options by -checking if the passed object is a new record or not. Rails follows the -REST convention, so to create a new `Post` object it will look for a -route named `posts_path`, and to update a `Post` object it will look for -a route named `post_path` and pass the current object. Similarly, rails -knows that it should create new objects via POST and update them via -PATCH. - -If you run `rake routes` from the console you'll see that we already -have a `posts_path` route, which was created automatically by Rails when we -defined the route for the index action. -However, we don't have a `post_path` yet, which is the reason why we -received an error before. With your server running you can view your routes by visiting [localhost:3000/rails/info/routes](http://localhost:3000/rails/info/routes), or you can generate them from the command line by running `rake routes`: - -```bash -$ rake routes - - posts GET /posts(.:format) posts#index -posts_new GET /posts/new(.:format) posts#new - POST /posts(.:format) posts#create - GET /posts/:id(.:format) posts#show - GET /posts/:id/edit(.:format) posts#edit - PATCH /posts/:id(.:format) posts#update - root / welcome#index -``` - -To fix this, open `config/routes.rb` and modify the `get "posts/:id"` -line like this: - -```ruby -get "posts/:id" => "posts#show", as: :post -``` - -The `:as` option tells the `get` method that we want to make routing helpers -called `post_url` and `post_path` available to our application. These are -precisely the methods that the `form_for` needs when editing a post, and so now -you'll be able to update posts again. - -NOTE: The `:as` option is available on the `post`, `patch`, `put`, `delete` and `match` -routing methods also. - ### Deleting Posts We're now ready to cover the "D" part of CRUD, deleting posts from the -database. Following the REST convention, we're going to add a route for -deleting posts to `config/routes.rb`: +database. Following the REST convention, the route for +deleting posts in the `config/routes.rb` is: ```ruby -delete "posts/:id" => "posts#destroy" +DELETE /posts/:id(.:format) posts#destroy ``` The `delete` routing method should be used for routes that destroy @@ -1119,7 +1049,7 @@ def destroy @post = Post.find(params[:id]) @post.destroy - redirect_to action: :index + redirect_to posts_path end ``` @@ -1146,18 +1076,17 @@ together. <%= post.title %> <%= post.text %> - <%= link_to 'Show', action: :show, id: post.id %> - <%= link_to 'Edit', action: :edit, id: post.id %> - <%= link_to 'Destroy', { action: :destroy, id: post.id }, + <%= link_to 'Show', post_path %> + <%= link_to 'Edit', edit_post_path(post) %> + <%= link_to 'Destroy', post_path(post), method: :delete, data: { confirm: 'Are you sure?' } %> <% end %> ``` -Here we're using `link_to` in a different way. We wrap the -`:action` and `:id` attributes in a hash so that we can pass those two keys in -first as one argument, and then the final two keys as another argument. The `:method` and `:'data-confirm'` +Here we're using `link_to` in a different way. We pass the named route as the first argument, +and then the final two keys as another argument. The `:method` and `:'data-confirm'` options are used as HTML5 attributes so that when the link is clicked, Rails will first show a confirm dialog to the user, and then submit the link with method `delete`. This is done via the JavaScript file `jquery_ujs` which is automatically included From 9c18cb1e70718c2b3fc20efed26f544b79c3ce6d Mon Sep 17 00:00:00 2001 From: Mikhail Dieterle Date: Sun, 28 Apr 2013 14:36:00 +0300 Subject: [PATCH 43/51] Use instance variables in redirect_to --- guides/source/getting_started.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/guides/source/getting_started.md b/guides/source/getting_started.md index cd7bc399ac..bdb9d3e51f 100644 --- a/guides/source/getting_started.md +++ b/guides/source/getting_started.md @@ -534,7 +534,7 @@ def create @post = Post.new(params[:post]) @post.save - redirect_to post + redirect_to @post end ``` @@ -609,7 +609,7 @@ look like this: @post = Post.new(params[:post].permit(:title, :text)) @post.save - redirect_to post + redirect_to @post end ``` @@ -763,7 +763,7 @@ def create @post = Post.new(params[:post].permit(:title, :text)) if @post.save - redirect_to post + redirect_to @post else render 'new' end @@ -900,7 +900,7 @@ def update @post = Post.find(params[:id]) if @post.update(params[:post].permit(:title, :text)) - redirect_to post + redirect_to @post else render 'edit' end From 36ed77806b266e0219e49804009b108fe93eea42 Mon Sep 17 00:00:00 2001 From: Richard Owen Date: Sun, 28 Apr 2013 19:39:31 +0100 Subject: [PATCH 44/51] New rails welcome screen --- guides/assets/images/rails_welcome.png | Bin 71979 -> 50433 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/guides/assets/images/rails_welcome.png b/guides/assets/images/rails_welcome.png index 8ad2d351defdf2bc836a458fa728f09e486c3985..569dd846a8ed26379ddc427062759adaf9331601 100644 GIT binary patch literal 50433 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 literal 71979 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 W5;|n?mSRYv9QxWOT7PId#{2{P&8V&b From d4c8de9e489b2687909fc130efb6c9c60c3113e9 Mon Sep 17 00:00:00 2001 From: Richard Owen Date: Sun, 28 Apr 2013 19:43:13 +0100 Subject: [PATCH 45/51] Move 2 images to getting_started folder. All other images in getting started guide already in this folder. --- .../images/{ => getting_started}/challenge.png | Bin .../images/{ => getting_started}/rails_welcome.png | Bin guides/source/getting_started.md | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) rename guides/assets/images/{ => getting_started}/challenge.png (100%) rename guides/assets/images/{ => getting_started}/rails_welcome.png (100%) diff --git a/guides/assets/images/challenge.png b/guides/assets/images/getting_started/challenge.png similarity index 100% rename from guides/assets/images/challenge.png rename to guides/assets/images/getting_started/challenge.png diff --git a/guides/assets/images/rails_welcome.png b/guides/assets/images/getting_started/rails_welcome.png similarity index 100% rename from guides/assets/images/rails_welcome.png rename to guides/assets/images/getting_started/rails_welcome.png diff --git a/guides/source/getting_started.md b/guides/source/getting_started.md index bdb9d3e51f..46115afb8c 100644 --- a/guides/source/getting_started.md +++ b/guides/source/getting_started.md @@ -165,7 +165,7 @@ TIP: Compiling CoffeeScript to JavaScript requires a JavaScript runtime and the This will fire up WEBrick, a webserver built into Ruby by default. To see your application in action, open a browser window and navigate to . You should see the Rails default information page: -![Welcome Aboard screenshot](images/rails_welcome.png) +![Welcome Aboard screenshot](images/getting_started/rails_welcome.png) TIP: To stop the web server, hit Ctrl+C in the terminal window where it's running. To verify the server has stopped you should see your command prompt cursor again. For most UNIX-like systems including Mac OS X this will be a dollar sign `$`. In development mode, Rails does not generally require you to restart the server; changes you make in files will be automatically picked up by the server. @@ -1614,7 +1614,7 @@ class CommentsController < ApplicationController Now if you try to create a new post, you will be greeted with a basic HTTP Authentication challenge -![Basic HTTP Authentication Challenge](images/challenge.png) +![Basic HTTP Authentication Challenge](images/getting_started/challenge.png) What's Next? ------------ From 887225e69b6cdd27f00cf043c4ac918ca5e18cbf Mon Sep 17 00:00:00 2001 From: Jonathan Roes Date: Tue, 30 Apr 2013 00:34:50 -0300 Subject: [PATCH 46/51] Consistent use of code syntax formatting for boolean values --- guides/source/configuring.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/guides/source/configuring.md b/guides/source/configuring.md index a0ab707b51..df3d22debe 100644 --- a/guides/source/configuring.md +++ b/guides/source/configuring.md @@ -58,7 +58,7 @@ These configuration methods are to be called on a `Rails::Railtie` object, such * `config.asset_host` sets the host for the assets. Useful when CDNs are used for hosting assets, or when you want to work around the concurrency constraints builtin in browsers using different domain aliases. Shorter version of `config.action_controller.asset_host`. -* `config.autoload_once_paths` accepts an array of paths from which Rails will autoload constants that won't be wiped per request. Relevant if `config.cache_classes` is false, which is the case in development mode by default. Otherwise, all autoloading happens only once. All elements of this array must also be in `autoload_paths`. Default is an empty array. +* `config.autoload_once_paths` accepts an array of paths from which Rails will autoload constants that won't be wiped per request. Relevant if `config.cache_classes` is `false`, which is the case in development mode by default. Otherwise, all autoloading happens only once. All elements of this array must also be in `autoload_paths`. Default is an empty array. * `config.autoload_paths` accepts an array of paths from which Rails will autoload constants. Default is all directories under `app`. @@ -70,7 +70,7 @@ These configuration methods are to be called on a `Rails::Railtie` object, such * `config.colorize_logging` specifies whether or not to use ANSI color codes when logging information. Defaults to true. -* `config.consider_all_requests_local` is a flag. If true then any error will cause detailed debugging information to be dumped in the HTTP response, and the `Rails::Info` controller will show the application runtime context in `/rails/info/properties`. True by default in development and test environments, and false in production mode. For finer-grained control, set this to false and implement `local_request?` in controllers to specify which requests should provide debugging information on errors. +* `config.consider_all_requests_local` is a flag. If true then any error will cause detailed debugging information to be dumped in the HTTP response, and the `Rails::Info` controller will show the application runtime context in `/rails/info/properties`. `true` by default in development and test environments, and `false` in production mode. For finer-grained control, set this to `false` and implement `local_request?` in controllers to specify which requests should provide debugging information on errors. * `config.console` allows you to set class that will be used as console you run `rails console`. It's best to run it in `console` block: @@ -83,7 +83,7 @@ These configuration methods are to be called on a `Rails::Railtie` object, such end ``` -* `config.dependency_loading` is a flag that allows you to disable constant autoloading setting it to false. It only has effect if `config.cache_classes` is true, which it is by default in production mode. This flag is set to false by `config.threadsafe!`. +* `config.dependency_loading` is a flag that allows you to disable constant autoloading setting it to `false`. It only has effect if `config.cache_classes` is true, which it is by default in production mode. This flag is set to `false` by `config.threadsafe!`. * `config.eager_load` when true, eager loads all registered `config.eager_load_namespaces`. This includes your application, engines, Rails frameworks and any other registered namespace. @@ -155,7 +155,7 @@ These configuration methods are to be called on a `Rails::Railtie` object, such * `config.assets.compile` is a boolean that can be used to turn on live Sprockets compilation in production. -* `config.assets.logger` accepts a logger conforming to the interface of Log4r or the default Ruby `Logger` class. Defaults to the same configured at `config.logger`. Setting `config.assets.logger` to false will turn off served assets logging. +* `config.assets.logger` accepts a logger conforming to the interface of Log4r or the default Ruby `Logger` class. Defaults to the same configured at `config.logger`. Setting `config.assets.logger` to `false` will turn off served assets logging. ### Configuring Generators @@ -284,7 +284,7 @@ The schema dumper adds one additional configuration option: * `config.action_controller.asset_host` sets the host for the assets. Useful when CDNs are used for hosting assets rather than the application server itself. -* `config.action_controller.perform_caching` configures whether the application should perform caching or not. Set to false in development mode, true in production. +* `config.action_controller.perform_caching` configures whether the application should perform caching or not. Set to `false` in development mode, `true` in production. * `config.action_controller.default_static_extension` configures the extension used for cached pages. Defaults to `.html`. @@ -342,7 +342,7 @@ The schema dumper adds one additional configuration option: * `config.action_view.erb_trim_mode` gives the trim mode to be used by ERB. It defaults to `'-'`. See the [ERB documentation](http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/) for more information. -* `config.action_view.embed_authenticity_token_in_remote_forms` allows you to set the default behavior for `authenticity_token` in forms with `:remote => true`. By default it's set to false, which means that remote forms will not include `authenticity_token`, which is helpful when you're fragment-caching the form. Remote forms get the authenticity from the `meta` tag, so embedding is unnecessary unless you support browsers without JavaScript. In such case you can either pass `:authenticity_token => true` as a form option or set this config setting to `true` +* `config.action_view.embed_authenticity_token_in_remote_forms` allows you to set the default behavior for `authenticity_token` in forms with `:remote => true`. By default it's set to `false`, which means that remote forms will not include `authenticity_token`, which is helpful when you're fragment-caching the form. Remote forms get the authenticity from the `meta` tag, so embedding is unnecessary unless you support browsers without JavaScript. In such case you can either pass `:authenticity_token => true` as a form option or set this config setting to `true` * `config.action_view.prefix_partial_path_with_controller_namespace` determines whether or not partials are looked up from a subdirectory in templates rendered from namespaced controllers. For example, consider a controller named `Admin::PostsController` which renders this template: @@ -374,7 +374,7 @@ There are a number of settings available on `config.action_mailer`: * `config.action_mailer.delivery_method` defines the delivery method. The allowed values are `:smtp` (default), `:sendmail`, and `:test`. -* `config.action_mailer.perform_deliveries` specifies whether mail will actually be delivered and is true by default. It can be convenient to set it to false for testing. +* `config.action_mailer.perform_deliveries` specifies whether mail will actually be delivered and is true by default. It can be convenient to set it to `false` for testing. * `config.action_mailer.default_options` configures Action Mailer defaults. Use to set options like `from` or `reply_to` for every mailer. These default to: From d2fe72345aeea2a0874dfe5c665368b9fd543bcb Mon Sep 17 00:00:00 2001 From: Yves Senn Date: Tue, 30 Apr 2013 17:59:12 +0200 Subject: [PATCH 47/51] it's Active Record not ActiveRecord /cc @fxn --- guides/source/2_2_release_notes.md | 2 +- guides/source/2_3_release_notes.md | 2 +- guides/source/3_0_release_notes.md | 2 +- guides/source/3_2_release_notes.md | 2 +- guides/source/active_record_querying.md | 5 ++++- guides/source/active_support_core_extensions.md | 4 +++- guides/source/command_line.md | 2 +- guides/source/configuring.md | 2 +- 8 files changed, 13 insertions(+), 8 deletions(-) diff --git a/guides/source/2_2_release_notes.md b/guides/source/2_2_release_notes.md index 802455f612..7db4cf07e7 100644 --- a/guides/source/2_2_release_notes.md +++ b/guides/source/2_2_release_notes.md @@ -200,7 +200,7 @@ Active Record association proxies now respect the scope of methods on the proxie * More information: * [Rails 2.2 Change: Private Methods on Association Proxies are Private](http://afreshcup.com/2008/10/24/rails-22-change-private-methods-on-association-proxies-are-private/) -### Other ActiveRecord Changes +### Other Active Record Changes * `rake db:migrate:redo` now accepts an optional VERSION to target that specific migration to redo * Set `config.active_record.timestamped_migrations = false` to have migrations with numeric prefix instead of UTC timestamp. diff --git a/guides/source/2_3_release_notes.md b/guides/source/2_3_release_notes.md index 7aef566e40..3f1e3cdb87 100644 --- a/guides/source/2_3_release_notes.md +++ b/guides/source/2_3_release_notes.md @@ -134,7 +134,7 @@ Rails 2.3 will introduce the notion of _default scopes_ similar to named scopes, ### Batch Processing -You can now process large numbers of records from an ActiveRecord model with less pressure on memory by using `find_in_batches`: +You can now process large numbers of records from an Active Record model with less pressure on memory by using `find_in_batches`: ```ruby Customer.find_in_batches(:conditions => {:active => true}) do |customer_group| diff --git a/guides/source/3_0_release_notes.md b/guides/source/3_0_release_notes.md index 6cb6f738e0..e7a174cc77 100644 --- a/guides/source/3_0_release_notes.md +++ b/guides/source/3_0_release_notes.md @@ -475,7 +475,7 @@ As well as the following deprecations: * `named_scope` in an Active Record class is deprecated and has been renamed to just `scope`. * In `scope` methods, you should move to using the relation methods, instead of a `:conditions => {}` finder method, for example `scope :since, lambda {|time| where("created_at > ?", time) }`. * `save(false)` is deprecated, in favor of `save(:validate => false)`. -* I18n error messages for ActiveRecord should be changed from :en.activerecord.errors.template to `:en.errors.template`. +* I18n error messages for Active Record should be changed from :en.activerecord.errors.template to `:en.errors.template`. * `model.errors.on` is deprecated in favor of `model.errors[]` * validates_presence_of => validates... :presence => true * `ActiveRecord::Base.colorize_logging` and `config.active_record.colorize_logging` are deprecated in favor of `Rails::LogSubscriber.colorize_logging` or `config.colorize_logging` diff --git a/guides/source/3_2_release_notes.md b/guides/source/3_2_release_notes.md index 16ab7603a0..e036860de2 100644 --- a/guides/source/3_2_release_notes.md +++ b/guides/source/3_2_release_notes.md @@ -189,7 +189,7 @@ Action Pack * form\_for is changed to use "#{action}\_#{as}" as the css class and id if `:as` option is provided. Earlier versions used "#{as}\_#{action}". -* `ActionController::ParamsWrapper` on ActiveRecord models now only wrap `attr_accessible` attributes if they were set. If not, only the attributes returned by the class method `attribute_names` will be wrapped. This fixes the wrapping of nested attributes by adding them to `attr_accessible`. +* `ActionController::ParamsWrapper` on Active Record models now only wrap `attr_accessible` attributes if they were set. If not, only the attributes returned by the class method `attribute_names` will be wrapped. This fixes the wrapping of nested attributes by adding them to `attr_accessible`. * Log "Filter chain halted as CALLBACKNAME rendered or redirected" every time a before callback halts. diff --git a/guides/source/active_record_querying.md b/guides/source/active_record_querying.md index e55810bebb..80eec428c1 100644 --- a/guides/source/active_record_querying.md +++ b/guides/source/active_record_querying.md @@ -1301,7 +1301,10 @@ Client.unscoped { Dynamic Finders --------------- -NOTE: Dynamic finders have been deprecated in Rails 4.0 and will be removed in Rails 4.1. The best practice is to use ActiveRecord scopes instead. You can find the deprecation gem at https://github.com/rails/activerecord-deprecated_finders +NOTE: Dynamic finders have been deprecated in Rails 4.0 and will be +removed in Rails 4.1. The best practice is to use Active Record scopes +instead. You can find the deprecation gem at +https://github.com/rails/activerecord-deprecated_finders For every field (also known as an attribute) you define in your table, Active Record provides a finder method. If you have a field called `first_name` on your `Client` model for example, you get `find_by_first_name` for free from Active Record. If you have a `locked` field on the `Client` model, you also get `find_by_locked` and methods. diff --git a/guides/source/active_support_core_extensions.md b/guides/source/active_support_core_extensions.md index fd4c663420..263dabce87 100644 --- a/guides/source/active_support_core_extensions.md +++ b/guides/source/active_support_core_extensions.md @@ -2216,7 +2216,9 @@ NOTE: Defined in `active_support/core_ext/array/conversions.rb`. The method `to_formatted_s` acts like `to_s` by default. -If the array contains items that respond to `id`, however, the symbol `:db` may be passed as argument. That's typically used with collections of ActiveRecord objects. Returned strings are: +If the array contains items that respond to `id`, however, the symbol +`:db` may be passed as argument. That's typically used with +collections of Active Record objects. Returned strings are: ```ruby [].to_formatted_s(:db) # => "null" diff --git a/guides/source/command_line.md b/guides/source/command_line.md index 7b7f5963fd..e0b44bbf93 100644 --- a/guides/source/command_line.md +++ b/guides/source/command_line.md @@ -201,7 +201,7 @@ Usage: ... -ActiveRecord options: +Active Record options: [--migration] # Indicates when to generate migration # Default: true diff --git a/guides/source/configuring.md b/guides/source/configuring.md index df3d22debe..e253d639d4 100644 --- a/guides/source/configuring.md +++ b/guides/source/configuring.md @@ -729,7 +729,7 @@ development: timeout: 5000 ``` -Since the connection pooling is handled inside of ActiveRecord by default, all application servers (Thin, mongrel, Unicorn etc.) should behave the same. Initially, the database connection pool is empty and it will create additional connections as the demand for them increases, until it reaches the connection pool limit. +Since the connection pooling is handled inside of Active Record by default, all application servers (Thin, mongrel, Unicorn etc.) should behave the same. Initially, the database connection pool is empty and it will create additional connections as the demand for them increases, until it reaches the connection pool limit. Any one request will check out a connection the first time it requires access to the database, after which it will check the connection back in, at the end of the request, meaning that the additional connection slot will be available again for the next request in the queue. From 6cc1b4280e06e2f6f9447d408d2d5ddd7f469e44 Mon Sep 17 00:00:00 2001 From: Yves Senn Date: Tue, 30 Apr 2013 18:06:23 +0200 Subject: [PATCH 48/51] more naming fixes. * it's Action Mailer not ActionMailer * it's Action Pack not ActionPack * it's Active Support not ActiveSupport /cc @fxn --- guides/source/2_3_release_notes.md | 2 +- guides/source/3_0_release_notes.md | 2 +- guides/source/4_0_release_notes.md | 3 ++- guides/source/active_support_core_extensions.md | 8 +++++--- guides/source/debugging_rails_applications.md | 4 +++- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/guides/source/2_3_release_notes.md b/guides/source/2_3_release_notes.md index 3f1e3cdb87..3c08f148cf 100644 --- a/guides/source/2_3_release_notes.md +++ b/guides/source/2_3_release_notes.md @@ -504,7 +504,7 @@ A lot of folks have adopted the notion of using try() to attempt operations on o ### Swappable Parsers for XMLmini -The support for XML parsing in ActiveSupport has been made more flexible by allowing you to swap in different parsers. By default, it uses the standard REXML implementation, but you can easily specify the faster LibXML or Nokogiri implementations for your own applications, provided you have the appropriate gems installed: +The support for XML parsing in Active Support has been made more flexible by allowing you to swap in different parsers. By default, it uses the standard REXML implementation, but you can easily specify the faster LibXML or Nokogiri implementations for your own applications, provided you have the appropriate gems installed: ```ruby XmlMini.backend = 'LibXML' diff --git a/guides/source/3_0_release_notes.md b/guides/source/3_0_release_notes.md index e7a174cc77..ebe8847168 100644 --- a/guides/source/3_0_release_notes.md +++ b/guides/source/3_0_release_notes.md @@ -580,7 +580,7 @@ Action Mailer has been given a new API with TMail being replaced out with the ne * All mailers are now in `app/mailers` by default. * Can now send email using new API with three methods: `attachments`, `headers` and `mail`. -* ActionMailer now has native support for inline attachments using the `attachments.inline` method. +* Action Mailer now has native support for inline attachments using the `attachments.inline` method. * Action Mailer emailing methods now return `Mail::Message` objects, which can then be sent the `deliver` message to send itself. * All delivery methods are now abstracted out to the Mail gem. * The mail delivery method can accept a hash of all valid mail header fields with their value pair. diff --git a/guides/source/4_0_release_notes.md b/guides/source/4_0_release_notes.md index 5d8d1f93ff..50a3c6fabc 100644 --- a/guides/source/4_0_release_notes.md +++ b/guides/source/4_0_release_notes.md @@ -113,7 +113,8 @@ Please refer to the [Changelog](https://github.com/rails/rails/blob/master/activ * Add `ActiveModel::ForbiddenAttributesProtection`, a simple module to protect attributes from mass assignment when non-permitted attributes are passed. -* Added `ActiveModel::Model`, a mixin to make Ruby objects work with ActionPack out of box. +* Added `ActiveModel::Model`, a mixin to make Ruby objects work with + Action Pack out of box. ### Deprecations diff --git a/guides/source/active_support_core_extensions.md b/guides/source/active_support_core_extensions.md index 263dabce87..54f4b79b3b 100644 --- a/guides/source/active_support_core_extensions.md +++ b/guides/source/active_support_core_extensions.md @@ -10,7 +10,7 @@ After reading this guide, you will know: * What Core Extensions are. * How to load all extensions. * How to cherry-pick just the extensions you want. -* What extensions ActiveSupport provides. +* What extensions Active Support provides. -------------------------------------------------------------------------------- @@ -2374,7 +2374,8 @@ NOTE: Defined in `active_support/core_ext/array/wrap.rb`. ### Duplicating -The method `Array.deep_dup` duplicates itself and all objects inside recursively with ActiveSupport method `Object#deep_dup`. It works like `Array#map` with sending `deep_dup` method to each object inside. +The method `Array.deep_dup` duplicates itself and all objects inside +recursively with Active Support method `Object#deep_dup`. It works like `Array#map` with sending `deep_dup` method to each object inside. ```ruby array = [1, [2, 3]] @@ -2595,7 +2596,8 @@ NOTE: Defined in `active_support/core_ext/hash/deep_merge.rb`. ### Deep duplicating -The method `Hash.deep_dup` duplicates itself and all keys and values inside recursively with ActiveSupport method `Object#deep_dup`. It works like `Enumerator#each_with_object` with sending `deep_dup` method to each pair inside. +The method `Hash.deep_dup` duplicates itself and all keys and values +inside recursively with Active Support method `Object#deep_dup`. It works like `Enumerator#each_with_object` with sending `deep_dup` method to each pair inside. ```ruby hash = { a: 1, b: { c: 2, d: [3, 4] } } diff --git a/guides/source/debugging_rails_applications.md b/guides/source/debugging_rails_applications.md index 8f1d2922ac..70055c1d7d 100644 --- a/guides/source/debugging_rails_applications.md +++ b/guides/source/debugging_rails_applications.md @@ -198,7 +198,9 @@ Adding extra logging like this makes it easy to search for unexpected or unusual ### Tagged Logging -When running multi-user, multi-account applications, it’s often useful to be able to filter the logs using some custom rules. `TaggedLogging` in ActiveSupport helps in doing exactly that by stamping log lines with subdomains, request ids, and anything else to aid debugging such applications. +When running multi-user, multi-account applications, it’s often useful +to be able to filter the logs using some custom rules. `TaggedLogging` +in Active Support helps in doing exactly that by stamping log lines with subdomains, request ids, and anything else to aid debugging such applications. ```ruby logger = ActiveSupport::TaggedLogging.new(Logger.new(STDOUT)) From 80036f9a5341bd831d125dc684841a8433d92070 Mon Sep 17 00:00:00 2001 From: Jonathan Roes Date: Tue, 30 Apr 2013 23:53:01 -0300 Subject: [PATCH 49/51] Correct formatting for remaining booleans --- guides/source/configuring.md | 42 ++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/guides/source/configuring.md b/guides/source/configuring.md index e253d639d4..9ab6449729 100644 --- a/guides/source/configuring.md +++ b/guides/source/configuring.md @@ -62,15 +62,15 @@ These configuration methods are to be called on a `Rails::Railtie` object, such * `config.autoload_paths` accepts an array of paths from which Rails will autoload constants. Default is all directories under `app`. -* `config.cache_classes` controls whether or not application classes and modules should be reloaded on each request. Defaults to false in development mode, and true in test and production modes. Can also be enabled with `threadsafe!`. +* `config.cache_classes` controls whether or not application classes and modules should be reloaded on each request. Defaults to `false` in development mode, and `true` in test and production modes. Can also be enabled with `threadsafe!`. * `config.action_view.cache_template_loading` controls whether or not templates should be reloaded on each request. Defaults to whatever is set for `config.cache_classes`. * `config.cache_store` configures which cache store to use for Rails caching. Options include one of the symbols `:memory_store`, `:file_store`, `:mem_cache_store`, `:null_store`, or an object that implements the cache API. Defaults to `:file_store` if the directory `tmp/cache` exists, and to `:memory_store` otherwise. -* `config.colorize_logging` specifies whether or not to use ANSI color codes when logging information. Defaults to true. +* `config.colorize_logging` specifies whether or not to use ANSI color codes when logging information. Defaults to `true`. -* `config.consider_all_requests_local` is a flag. If true then any error will cause detailed debugging information to be dumped in the HTTP response, and the `Rails::Info` controller will show the application runtime context in `/rails/info/properties`. `true` by default in development and test environments, and `false` in production mode. For finer-grained control, set this to `false` and implement `local_request?` in controllers to specify which requests should provide debugging information on errors. +* `config.consider_all_requests_local` is a flag. If `true` then any error will cause detailed debugging information to be dumped in the HTTP response, and the `Rails::Info` controller will show the application runtime context in `/rails/info/properties`. `true` by default in development and test environments, and `false` in production mode. For finer-grained control, set this to `false` and implement `local_request?` in controllers to specify which requests should provide debugging information on errors. * `config.console` allows you to set class that will be used as console you run `rails console`. It's best to run it in `console` block: @@ -85,9 +85,9 @@ These configuration methods are to be called on a `Rails::Railtie` object, such * `config.dependency_loading` is a flag that allows you to disable constant autoloading setting it to `false`. It only has effect if `config.cache_classes` is true, which it is by default in production mode. This flag is set to `false` by `config.threadsafe!`. -* `config.eager_load` when true, eager loads all registered `config.eager_load_namespaces`. This includes your application, engines, Rails frameworks and any other registered namespace. +* `config.eager_load` when `true`, eager loads all registered `config.eager_load_namespaces`. This includes your application, engines, Rails frameworks and any other registered namespace. -* `config.eager_load_namespaces` registers namespaces that are eager loaded when `config.eager_load` is true. All namespaces in the list must respond to the `eager_load!` method. +* `config.eager_load_namespaces` registers namespaces that are eager loaded when `config.eager_load` is `true`. All namespaces in the list must respond to the `eager_load!` method. * `config.eager_load_paths` accepts an array of paths from which Rails will eager load on boot if cache classes is enabled. Defaults to every folder in the `app` directory of the application. @@ -95,7 +95,7 @@ These configuration methods are to be called on a `Rails::Railtie` object, such * `config.exceptions_app` sets the exceptions application invoked by the ShowException middleware when an exception happens. Defaults to `ActionDispatch::PublicExceptions.new(Rails.public_path)`. -* `config.file_watcher` the class used to detect file updates in the filesystem when `config.reload_classes_only_on_change` is true. Must conform to `ActiveSupport::FileUpdateChecker` API. +* `config.file_watcher` the class used to detect file updates in the filesystem when `config.reload_classes_only_on_change` is `true`. Must conform to `ActiveSupport::FileUpdateChecker` API. * `config.filter_parameters` used for filtering out the parameters that you don't want shown in the logs, such as passwords or credit card numbers. @@ -109,11 +109,11 @@ These configuration methods are to be called on a `Rails::Railtie` object, such * `config.middleware` allows you to configure the application's middleware. This is covered in depth in the [Configuring Middleware](#configuring-middleware) section below. -* `config.reload_classes_only_on_change` enables or disables reloading of classes only when tracked files change. By default tracks everything on autoload paths and is set to true. If `config.cache_classes` is true, this option is ignored. +* `config.reload_classes_only_on_change` enables or disables reloading of classes only when tracked files change. By default tracks everything on autoload paths and is set to `true`. If `config.cache_classes` is `true`, this option is ignored. * `config.secret_key_base` used for specifying a key which allows sessions for the application to be verified against a known secure key to prevent tampering. Applications get `config.secret_key_base` initialized to a random key in `config/initializers/secret_token.rb`. -* `config.serve_static_assets` configures Rails itself to serve static assets. Defaults to true, but in the production environment is turned off as the server software (e.g. Nginx or Apache) used to run the application should serve static assets instead. Unlike the default setting set this to true when running (absolutely not recommended!) or testing your app in production mode using WEBrick. Otherwise you won´t be able use page caching and requests for files that exist regularly under the public directory will anyway hit your Rails app. +* `config.serve_static_assets` configures Rails itself to serve static assets. Defaults to `true`, but in the production environment is turned off as the server software (e.g. Nginx or Apache) used to run the application should serve static assets instead. Unlike the default setting set this to `true` when running (absolutely not recommended!) or testing your app in production mode using WEBrick. Otherwise you won´t be able use page caching and requests for files that exist regularly under the public directory will anyway hit your Rails app. * `config.session_store` is usually set up in `config/initializers/session_store.rb` and specifies what class to use to store the session. Possible values are `:cookie_store` which is the default, `:mem_cache_store`, and `:disabled`. The last one tells Rails not to deal with sessions. Custom session stores can also be specified: @@ -127,13 +127,13 @@ These configuration methods are to be called on a `Rails::Railtie` object, such * `config.beginning_of_week` sets the default beginning of week for the application. Accepts a valid week day symbol (e.g. `:monday`). -* `config.whiny_nils` enables or disables warnings when a certain set of methods are invoked on `nil` and it does not respond to them. Defaults to true in development and test environments. +* `config.whiny_nils` enables or disables warnings when a certain set of methods are invoked on `nil` and it does not respond to them. Defaults to `true` in development and test environments. ### Configuring Assets * `config.assets.enabled` a flag that controls whether the asset pipeline is enabled. It is explicitly initialized in `config/application.rb`. -* `config.assets.compress` a flag that enables the compression of compiled assets. It is explicitly set to true in `config/production.rb`. +* `config.assets.compress` a flag that enables the compression of compiled assets. It is explicitly set to `true` in `config/production.rb`. * `config.assets.css_compressor` defines the CSS compressor to use. It is set by default by `sass-rails`. The unique alternative value at the moment is `:yui`, which uses the `yui-compressor` gem. @@ -258,21 +258,21 @@ config.middleware.delete "Rack::MethodOverride" * `config.active_record.table_name_suffix` lets you set a global string to be appended to table names. If you set this to `_northwest`, then the Customer class will look for `customers_northwest` as its table. The default is an empty string. -* `config.active_record.pluralize_table_names` specifies whether Rails will look for singular or plural table names in the database. If set to true (the default), then the Customer class will use the `customers` table. If set to false, then the Customer class will use the `customer` table. +* `config.active_record.pluralize_table_names` specifies whether Rails will look for singular or plural table names in the database. If set to `true` (the default), then the Customer class will use the `customers` table. If set to `false`, then the Customer class will use the `customer` table. * `config.active_record.default_timezone` determines whether to use `Time.local` (if set to `:local`) or `Time.utc` (if set to `:utc`) when pulling dates and times from the database. The default is `:utc` for Rails, although Active Record defaults to `:local` when used outside of Rails. * `config.active_record.schema_format` controls the format for dumping the database schema to a file. The options are `:ruby` (the default) for a database-independent version that depends on migrations, or `:sql` for a set of (potentially database-dependent) SQL statements. -* `config.active_record.timestamped_migrations` controls whether migrations are numbered with serial integers or with timestamps. The default is true, to use timestamps, which are preferred if there are multiple developers working on the same application. +* `config.active_record.timestamped_migrations` controls whether migrations are numbered with serial integers or with timestamps. The default is `true`, to use timestamps, which are preferred if there are multiple developers working on the same application. -* `config.active_record.lock_optimistically` controls whether Active Record will use optimistic locking and is true by default. +* `config.active_record.lock_optimistically` controls whether Active Record will use optimistic locking and is `true` by default. * `config.active_record.cache_timestamp_format` controls the format of the timestamp value in the cache key. Default is `:number`. The MySQL adapter adds one additional configuration option: -* `ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans` controls whether Active Record will consider all `tinyint(1)` columns in a MySQL database to be booleans and is true by default. +* `ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans` controls whether Active Record will consider all `tinyint(1)` columns in a MySQL database to be booleans and is `true` by default. The schema dumper adds one additional configuration option: @@ -370,11 +370,11 @@ There are a number of settings available on `config.action_mailer`: * `:location` - The location of the sendmail executable. Defaults to `/usr/sbin/sendmail`. * `:arguments` - The command line arguments. Defaults to `-i -t`. -* `config.action_mailer.raise_delivery_errors` specifies whether to raise an error if email delivery cannot be completed. It defaults to true. +* `config.action_mailer.raise_delivery_errors` specifies whether to raise an error if email delivery cannot be completed. It defaults to `true`. * `config.action_mailer.delivery_method` defines the delivery method. The allowed values are `:smtp` (default), `:sendmail`, and `:test`. -* `config.action_mailer.perform_deliveries` specifies whether mail will actually be delivered and is true by default. It can be convenient to set it to `false` for testing. +* `config.action_mailer.perform_deliveries` specifies whether mail will actually be delivered and is `true` by default. It can be convenient to set it to `false` for testing. * `config.action_mailer.default_options` configures Action Mailer defaults. Use to set options like `from` or `reply_to` for every mailer. These default to: @@ -622,13 +622,13 @@ Below is a comprehensive list of all the initializers found in Rails in the orde * `set_clear_dependencies_hook` Provides a hook for `active_record.set_dispatch_hooks` to use, which will run before this initializer. This initializer — which runs only if `cache_classes` is set to `false` — uses `ActionDispatch::Callbacks.after` to remove the constants which have been referenced during the request from the object space so that they will be reloaded during the following request. -* `initialize_dependency_mechanism` If `config.cache_classes` is true, configures `ActiveSupport::Dependencies.mechanism` to `require` dependencies rather than `load` them. +* `initialize_dependency_mechanism` If `config.cache_classes` is `true`, configures `ActiveSupport::Dependencies.mechanism` to `require` dependencies rather than `load` them. * `bootstrap_hook` Runs all configured `before_initialize` blocks. * `i18n.callbacks` In the development environment, sets up a `to_prepare` callback which will call `I18n.reload!` if any of the locales have changed since the last request. In production mode this callback will only run on the first request. -* `active_support.initialize_whiny_nils` Requires `active_support/whiny_nil` if `config.whiny_nils` is true. This file will output errors such as: +* `active_support.initialize_whiny_nils` Requires `active_support/whiny_nil` if `config.whiny_nils` is `true`. This file will output errors such as: ``` Called id for nil, which would mistakenly be 4 — if you really wanted the id of nil, use object_id @@ -660,7 +660,7 @@ Below is a comprehensive list of all the initializers found in Rails in the orde * `action_controller.compile_config_methods` Initializes methods for the config settings specified so that they are quicker to access. -* `active_record.initialize_timezone` Sets `ActiveRecord::Base.time_zone_aware_attributes` to true, as well as setting `ActiveRecord::Base.default_timezone` to UTC. When attributes are read from the database, they will be converted into the time zone specified by `Time.zone`. +* `active_record.initialize_timezone` Sets `ActiveRecord::Base.time_zone_aware_attributes` to `true`, as well as setting `ActiveRecord::Base.default_timezone` to UTC. When attributes are read from the database, they will be converted into the time zone specified by `Time.zone`. * `active_record.logger` Sets `ActiveRecord::Base.logger` — if it's not already set — to `Rails.logger`. @@ -708,13 +708,13 @@ Below is a comprehensive list of all the initializers found in Rails in the orde * `build_middleware_stack` Builds the middleware stack for the application, returning an object which has a `call` method which takes a Rack environment object for the request. -* `eager_load!` If `config.eager_load` is true, runs the `config.before_eager_load` hooks and then calls `eager_load!` which will load all `config.eager_load_namespaces`. +* `eager_load!` If `config.eager_load` is `true`, runs the `config.before_eager_load` hooks and then calls `eager_load!` which will load all `config.eager_load_namespaces`. * `finisher_hook` Provides a hook for after the initialization of process of the application is complete, as well as running all the `config.after_initialize` blocks for the application, railties and engines. * `set_routes_reloader` Configures Action Dispatch to reload the routes file using `ActionDispatch::Callbacks.to_prepare`. -* `disable_dependency_loading` Disables the automatic dependency loading if the `config.eager_load` is set to true. +* `disable_dependency_loading` Disables the automatic dependency loading if the `config.eager_load` is set to `true`. Database pooling ---------------- From 727d0af28cbc3a917afdea8631beac5db3f4ee49 Mon Sep 17 00:00:00 2001 From: Thiago Pinto Date: Wed, 1 May 2013 00:11:43 -0400 Subject: [PATCH 50/51] routes.rb should teach how to use concerns --- .../rails/generators/rails/app/templates/config/routes.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/railties/lib/rails/generators/rails/app/templates/config/routes.rb b/railties/lib/rails/generators/rails/app/templates/config/routes.rb index f877fa1f8a..1794ffa833 100644 --- a/railties/lib/rails/generators/rails/app/templates/config/routes.rb +++ b/railties/lib/rails/generators/rails/app/templates/config/routes.rb @@ -39,6 +39,13 @@ # get 'recent', on: :collection # end # end + + # Example resource route with concerns: + # concern :toggleable do + # post 'toggle' + # end + # resources :posts, concerns: :toggleable + # resources :photos, concerns: :toggleable # Example resource route within a namespace: # namespace :admin do From 8476932aacbc45ce38b007cca0bb3f12e741f709 Mon Sep 17 00:00:00 2001 From: Vijay Dev Date: Wed, 1 May 2013 15:29:02 +0530 Subject: [PATCH 51/51] copy edits [ci skip] --- guides/source/development_dependencies_install.md | 2 +- guides/source/testing.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/source/development_dependencies_install.md b/guides/source/development_dependencies_install.md index 5d9d63e97d..ef622103f4 100644 --- a/guides/source/development_dependencies_install.md +++ b/guides/source/development_dependencies_install.md @@ -24,7 +24,7 @@ Ruby on Rails uses Git for source code control. The [Git homepage](http://git-sc * [Try Git course](http://try.github.io/) is an interactive course that will teach you the basics. * The [official Documentation](http://git-scm.com/documentation) is pretty comprehensive and also contains some videos with the basics of Git * [Everyday Git](http://schacon.github.io/git/everyday.html) will teach you just enough about Git to get by. -* The [PeepCode screencast](https://peepcode.com/products/git) on Git ($12) is easier to follow. +* The [PeepCode screencast](https://peepcode.com/products/git) on Git is easier to follow. * [GitHub](http://help.github.com) offers links to a variety of Git resources. * [Pro Git](http://git-scm.com/book) is an entire book about Git with a Creative Commons license. diff --git a/guides/source/testing.md b/guides/source/testing.md index b198f5632f..b02d0b663c 100644 --- a/guides/source/testing.md +++ b/guides/source/testing.md @@ -372,7 +372,7 @@ Here's an extract of the assertions you can use with `minitest`, the default tes | `assert_raises( exception1, exception2, ... ) { block }` | Ensures that the given block raises one of the given exceptions.| | `assert_nothing_raised( exception1, exception2, ... ) { block }` | Ensures that the given block doesn't raise one of the given exceptions.| | `assert_instance_of( class, obj, [msg] )` | Ensures that `obj` is an instance of `class`.| -| `refute_instance_of( class, obj, [msg] )` | Ensures that `obj` is not an instance of `class`.| +| `refute_instance_of( class, obj, [msg] )` | Ensures that `obj` is not an instance of `class`.| | `assert_kind_of( class, obj, [msg] )` | Ensures that `obj` is or descends from `class`.| | `refute_kind_of( class, obj, [msg] )` | Ensures that `obj` is not an instance of `class` and is not descending from it.| | `assert_respond_to( obj, symbol, [msg] )` | Ensures that `obj` responds to `symbol`.|