Skip to content
This repository
Browse code

Convert legacy release notes to Markdown

  • Loading branch information...
commit 7a0dad25f3be77211160560dc76a8f37963051d7 1 parent 5e13625
Prem Sichanugrist authored September 06, 2012
383  guides/source/2_2_release_notes.md
Source Rendered
... ...
@@ -1,69 +1,73 @@
1  
-h2. Ruby on Rails 2.2 Release Notes
  1
+Ruby on Rails 2.2 Release Notes
  2
+===============================
2 3
 
3  
-Rails 2.2 delivers a number of new and improved features. This list covers the major upgrades, but doesn't include every little bug fix and change. If you want to see everything, check out the "list of commits":http://github.com/rails/rails/commits/master in the main Rails repository on GitHub.
  4
+Rails 2.2 delivers a number of new and improved features. This list covers the major upgrades, but doesn't include every little bug fix and change. If you want to see everything, check out the [list of commits](http://github.com/rails/rails/commits/master) in the main Rails repository on GitHub.
4 5
 
5  
-Along with Rails, 2.2 marks the launch of the "Ruby on Rails Guides":http://guides.rubyonrails.org/, the first results of the ongoing "Rails Guides hackfest":http://hackfest.rubyonrails.org/guide. This site will deliver high-quality documentation of the major features of Rails.
  6
+Along with Rails, 2.2 marks the launch of the [Ruby on Rails Guides](http://guides.rubyonrails.org/), the first results of the ongoing [Rails Guides hackfest](http://hackfest.rubyonrails.org/guide). This site will deliver high-quality documentation of the major features of Rails.
6 7
 
7  
-endprologue.
  8
+--------------------------------------------------------------------------------
8 9
 
9  
-h3. Infrastructure
  10
+Infrastructure
  11
+--------------
10 12
 
11 13
 Rails 2.2 is a significant release for the infrastructure that keeps Rails humming along and connected to the rest of the world.
12 14
 
13  
-h4. Internationalization
  15
+### Internationalization
14 16
 
15 17
 Rails 2.2 supplies an easy system for internationalization (or i18n, for those of you tired of typing).
16 18
 
17 19
 * Lead Contributors: Rails i18 Team
18 20
 * More information :
19  
-** "Official Rails i18 website":http://rails-i18n.org
20  
-** "Finally. Ruby on Rails gets internationalized":http://www.artweb-design.de/2008/7/18/finally-ruby-on-rails-gets-internationalized
21  
-** "Localizing Rails : Demo application":http://github.com/clemens/i18n_demo_app
  21
+    * [Official Rails i18 website](http://rails-i18n.org)
  22
+    * [Finally. Ruby on Rails gets internationalized](http://www.artweb-design.de/2008/7/18/finally-ruby-on-rails-gets-internationalized)
  23
+    * [Localizing Rails : Demo application](http://github.com/clemens/i18n_demo_app)
22 24
 
23  
-h4. Compatibility with Ruby 1.9 and JRuby
  25
+### Compatibility with Ruby 1.9 and JRuby
24 26
 
25 27
 Along with thread safety, a lot of work has been done to make Rails work well with JRuby and the upcoming Ruby 1.9. With Ruby 1.9 being a moving target, running edge Rails on edge Ruby is still a hit-or-miss proposition, but Rails is ready to make the transition to Ruby 1.9 when the latter is released.
26 28
 
27  
-h3. Documentation
28  
-
29  
-The internal documentation of Rails, in the form of code comments, has been improved in numerous places. In addition, the "Ruby on Rails Guides":http://guides.rubyonrails.org/ project is the definitive source for information on major Rails components. In its first official release, the Guides page includes:
30  
-
31  
-* "Getting Started with Rails":http://guides.rubyonrails.org/getting_started.html
32  
-* "Rails Database Migrations":http://guides.rubyonrails.org/migrations.html
33  
-* "Active Record Associations":http://guides.rubyonrails.org/association_basics.html
34  
-* "Active Record Query Interface":http://guides.rubyonrails.org/active_record_querying.html
35  
-* "Layouts and Rendering in Rails":http://guides.rubyonrails.org/layouts_and_rendering.html
36  
-* "Action View Form Helpers":http://guides.rubyonrails.org/form_helpers.html
37  
-* "Rails Routing from the Outside In":http://guides.rubyonrails.org/routing.html
38  
-* "Action Controller Overview":http://guides.rubyonrails.org/action_controller_overview.html
39  
-* "Rails Caching":http://guides.rubyonrails.org/caching_with_rails.html
40  
-* "A Guide to Testing Rails Applications":http://guides.rubyonrails.org/testing.html
41  
-* "Securing Rails Applications":http://guides.rubyonrails.org/security.html
42  
-* "Debugging Rails Applications":http://guides.rubyonrails.org/debugging_rails_applications.html
43  
-* "Performance Testing Rails Applications":http://guides.rubyonrails.org/performance_testing.html
44  
-* "The Basics of Creating Rails Plugins":http://guides.rubyonrails.org/plugins.html
  29
+Documentation
  30
+-------------
  31
+
  32
+The internal documentation of Rails, in the form of code comments, has been improved in numerous places. In addition, the [Ruby on Rails Guides](http://guides.rubyonrails.org/) project is the definitive source for information on major Rails components. In its first official release, the Guides page includes:
  33
+
  34
+* [Getting Started with Rails](http://guides.rubyonrails.org/getting_started.html)
  35
+* [Rails Database Migrations](http://guides.rubyonrails.org/migrations.html)
  36
+* [Active Record Associations](http://guides.rubyonrails.org/association_basics.html)
  37
+* [Active Record Query Interface](http://guides.rubyonrails.org/active_record_querying.html)
  38
+* [Layouts and Rendering in Rails](http://guides.rubyonrails.org/layouts_and_rendering.html)
  39
+* [Action View Form Helpers](http://guides.rubyonrails.org/form_helpers.html)
  40
+* [Rails Routing from the Outside In](http://guides.rubyonrails.org/routing.html)
  41
+* [Action Controller Overview](http://guides.rubyonrails.org/action_controller_overview.html)
  42
+* [Rails Caching](http://guides.rubyonrails.org/caching_with_rails.html)
  43
+* [A Guide to Testing Rails Applications](http://guides.rubyonrails.org/testing.html)
  44
+* [Securing Rails Applications](http://guides.rubyonrails.org/security.html)
  45
+* [Debugging Rails Applications](http://guides.rubyonrails.org/debugging_rails_applications.html)
  46
+* [Performance Testing Rails Applications](http://guides.rubyonrails.org/performance_testing.html)
  47
+* [The Basics of Creating Rails Plugins](http://guides.rubyonrails.org/plugins.html)
45 48
 
46 49
 All told, the Guides provide tens of thousands of words of guidance for beginning and intermediate Rails developers.
47 50
 
48 51
 If you want to generate these guides locally, inside your application:
49 52
 
50  
-<ruby>
  53
+```
51 54
 rake doc:guides
52  
-</ruby>
  55
+```
53 56
 
54  
-This will put the guides inside +Rails.root/doc/guides+ and you may start surfing straight away by opening +Rails.root/doc/guides/index.html+ in your favourite browser.
  57
+This will put the guides inside `Rails.root/doc/guides` and you may start surfing straight away by opening `Rails.root/doc/guides/index.html` in your favourite browser.
55 58
 
56  
-* Lead Contributors: "Rails Documentation Team":credits.html
57  
-* Major contributions from "Xavier Noria":http://advogato.org/person/fxn/diary.html and "Hongli Lai":http://izumi.plan99.net/blog/.
  59
+* Lead Contributors: [Rails Documentation Team](credits.html)
  60
+* Major contributions from [Xavier Noria":http://advogato.org/person/fxn/diary.html and "Hongli Lai](http://izumi.plan99.net/blog/.)
58 61
 * More information:
59  
-** "Rails Guides hackfest":http://hackfest.rubyonrails.org/guide
60  
-** "Help improve Rails documentation on Git branch":http://weblog.rubyonrails.org/2008/5/2/help-improve-rails-documentation-on-git-branch
  62
+    * [Rails Guides hackfest](http://hackfest.rubyonrails.org/guide)
  63
+    * [Help improve Rails documentation on Git branch](http://weblog.rubyonrails.org/2008/5/2/help-improve-rails-documentation-on-git-branch)
61 64
 
62  
-h3. Better integration with HTTP : Out of the box ETag support
  65
+Better integration with HTTP : Out of the box ETag support
  66
+----------------------------------------------------------
63 67
 
64 68
 Supporting the etag and last modified timestamp in HTTP headers means that Rails can now send back an empty response if it gets a request for a resource that hasn't been modified lately. This allows you to check whether a response needs to be sent at all.
65 69
 
66  
-<ruby>
  70
+```ruby
67 71
 class ArticlesController < ApplicationController
68 72
   def show_with_respond_to_block
69 73
     @article = Article.find(params[:id])
@@ -93,58 +97,60 @@ class ArticlesController < ApplicationController
93 97
     fresh_when(:last_modified => @article.published_at.utc, :etag => @article)
94 98
   end
95 99
 end
96  
-</ruby>
  100
+```
97 101
 
98  
-h3. Thread Safety
  102
+Thread Safety
  103
+-------------
99 104
 
100 105
 The work done to make Rails thread-safe is rolling out in Rails 2.2. Depending on your web server infrastructure, this means you can handle more requests with fewer copies of Rails in memory, leading to better server performance and higher utilization of multiple cores.
101 106
 
102  
-To enable multithreaded dispatching in production mode of your application, add the following line in your +config/environments/production.rb+:
  107
+To enable multithreaded dispatching in production mode of your application, add the following line in your `config/environments/production.rb`:
103 108
 
104  
-<ruby>
  109
+```ruby
105 110
 config.threadsafe!
106  
-</ruby>
  111
+```
107 112
 
108 113
 * More information :
109  
-** "Thread safety for your Rails":http://m.onkey.org/2008/10/23/thread-safety-for-your-rails
110  
-** "Thread safety project announcement":http://weblog.rubyonrails.org/2008/8/16/josh-peek-officially-joins-the-rails-core
111  
-** "Q/A: What Thread-safe Rails Means":http://blog.headius.com/2008/08/qa-what-thread-safe-rails-means.html
  114
+    * [Thread safety for your Rails](http://m.onkey.org/2008/10/23/thread-safety-for-your-rails)
  115
+    * [Thread safety project announcement](http://weblog.rubyonrails.org/2008/8/16/josh-peek-officially-joins-the-rails-core)
  116
+    * [Q/A: What Thread-safe Rails Means](http://blog.headius.com/2008/08/qa-what-thread-safe-rails-means.html)
112 117
 
113  
-h3. Active Record
  118
+Active Record
  119
+-------------
114 120
 
115 121
 There are two big additions to talk about here: transactional migrations and pooled database transactions. There's also a new (and cleaner) syntax for join table conditions, as well as a number of smaller improvements.
116 122
 
117  
-h4. Transactional Migrations
  123
+### Transactional Migrations
118 124
 
119  
-Historically, multiple-step Rails migrations have been a source of trouble. If something went wrong during a migration, everything before the error changed the database and everything after the error wasn't applied. Also, the migration version was stored as having been executed, which means that it couldn't be simply rerun by +rake db:migrate:redo+ after you fix the problem. Transactional migrations change this by wrapping migration steps in a DDL transaction, so that if any of them fail, the entire migration is undone. In Rails 2.2, transactional migrations are supported on PostgreSQL out of the box. The code is extensible to other database types in the future - and IBM has already extended it to support the DB2 adapter.
  125
+Historically, multiple-step Rails migrations have been a source of trouble. If something went wrong during a migration, everything before the error changed the database and everything after the error wasn't applied. Also, the migration version was stored as having been executed, which means that it couldn't be simply rerun by `rake db:migrate:redo` after you fix the problem. Transactional migrations change this by wrapping migration steps in a DDL transaction, so that if any of them fail, the entire migration is undone. In Rails 2.2, transactional migrations are supported on PostgreSQL out of the box. The code is extensible to other database types in the future - and IBM has already extended it to support the DB2 adapter.
120 126
 
121  
-* Lead Contributor: "Adam Wiggins":http://adam.heroku.com/
  127
+* Lead Contributor: [Adam Wiggins](http://adam.heroku.com/)
122 128
 * More information:
123  
-** "DDL Transactions":http://adam.heroku.com/past/2008/9/3/ddl_transactions/
124  
-** "A major milestone for DB2 on Rails":http://db2onrails.com/2008/11/08/a-major-milestone-for-db2-on-rails/
  129
+    * [DDL Transactions](http://adam.heroku.com/past/2008/9/3/ddl_transactions/)
  130
+    * [A major milestone for DB2 on Rails](http://db2onrails.com/2008/11/08/a-major-milestone-for-db2-on-rails/)
125 131
 
126  
-h4. Connection Pooling
  132
+### Connection Pooling
127 133
 
128  
-Connection pooling lets Rails distribute database requests across a pool of database connections that will grow to a maximum size (by default 5, but you can add a +pool+ key to your +database.yml+ to adjust this). This helps remove bottlenecks in applications that support many concurrent users. There's also a +wait_timeout+ that defaults to 5 seconds before giving up. +ActiveRecord::Base.connection_pool+ gives you direct access to the pool if you need it.
  134
+Connection pooling lets Rails distribute database requests across a pool of database connections that will grow to a maximum size (by default 5, but you can add a `pool` key to your `database.yml` to adjust this). This helps remove bottlenecks in applications that support many concurrent users. There's also a `wait_timeout` that defaults to 5 seconds before giving up. `ActiveRecord::Base.connection_pool` gives you direct access to the pool if you need it.
129 135
 
130  
-<ruby>
  136
+```yaml
131 137
 development:
132 138
   adapter: mysql
133 139
   username: root
134 140
   database: sample_development
135 141
   pool: 10
136 142
   wait_timeout: 10
137  
-</ruby>
  143
+```
138 144
 
139  
-* Lead Contributor: "Nick Sieger":http://blog.nicksieger.com/
  145
+* Lead Contributor: [Nick Sieger](http://blog.nicksieger.com/)
140 146
 * More information:
141  
-** "What's New in Edge Rails: Connection Pools":http://ryandaigle.com/articles/2008/9/7/what-s-new-in-edge-rails-connection-pools
  147
+    * [What's New in Edge Rails: Connection Pools](http://ryandaigle.com/articles/2008/9/7/what-s-new-in-edge-rails-connection-pools)
142 148
 
143  
-h4. Hashes for Join Table Conditions
  149
+### Hashes for Join Table Conditions
144 150
 
145 151
 You can now specify conditions on join tables using a hash. This is a big help if you need to query across complex joins.
146 152
 
147  
-<ruby>
  153
+```ruby
148 154
 class Photo < ActiveRecord::Base
149 155
   belongs_to :product
150 156
 end
@@ -155,268 +161,275 @@ end
155 161
 
156 162
 # Get all products with copyright-free photos:
157 163
 Product.all(:joins => :photos, :conditions => { :photos => { :copyright => false }})
158  
-</ruby>
  164
+```
159 165
 
160 166
 * More information:
161  
-** "What's New in Edge Rails: Easy Join Table Conditions":http://ryandaigle.com/articles/2008/7/7/what-s-new-in-edge-rails-easy-join-table-conditions
  167
+    * [What's New in Edge Rails: Easy Join Table Conditions](http://ryandaigle.com/articles/2008/7/7/what-s-new-in-edge-rails-easy-join-table-conditions)
162 168
 
163  
-h4. New Dynamic Finders
  169
+### New Dynamic Finders
164 170
 
165 171
 Two new sets of methods have been added to Active Record's dynamic finders family.
166 172
 
167  
-h5. +find_last_by_<em>attribute</em>+
  173
+#### `find_last_by_attribute`
168 174
 
169  
-The +find_last_by_<em>attribute</em>+ method is equivalent to +Model.last(:conditions => {:attribute => value})+
  175
+The `find_last_by_attribute` method is equivalent to `Model.last(:conditions => {:attribute => value})`
170 176
 
171  
-<ruby>
  177
+```ruby
172 178
 # Get the last user who signed up from London
173 179
 User.find_last_by_city('London')
174  
-</ruby>
  180
+```
175 181
 
176  
-* Lead Contributor: "Emilio Tagua":http://www.workingwithrails.com/person/9147-emilio-tagua
  182
+* Lead Contributor: [Emilio Tagua](http://www.workingwithrails.com/person/9147-emilio-tagua)
177 183
 
178  
-h5. +find_by_<em>attribute</em>!+
  184
+#### `find_by_attribute!`
179 185
 
180  
-The new bang! version of +find_by_<em>attribute</em>!+ is equivalent to +Model.first(:conditions => {:attribute => value}) || raise ActiveRecord::RecordNotFound+ Instead of returning +nil+ if it can't find a matching record, this method will raise an exception if it cannot find a match.
  186
+The new bang! version of `find_by_attribute!` is equivalent to `Model.first(:conditions => {:attribute => value}) || raise ActiveRecord::RecordNotFound` Instead of returning `nil` if it can't find a matching record, this method will raise an exception if it cannot find a match.
181 187
 
182  
-<ruby>
  188
+```ruby
183 189
 # Raise ActiveRecord::RecordNotFound exception if 'Moby' hasn't signed up yet!
184 190
 User.find_by_name!('Moby')
185  
-</ruby>
  191
+```
186 192
 
187  
-* Lead Contributor: "Josh Susser":http://blog.hasmanythrough.com
  193
+* Lead Contributor: [Josh Susser](http://blog.hasmanythrough.com)
188 194
 
189  
-h4. Associations Respect Private/Protected Scope
  195
+### Associations Respect Private/Protected Scope
190 196
 
191  
-Active Record association proxies now respect the scope of methods on the proxied object. Previously (given User has_one :account) +@user.account.private_method+ would call the private method on the associated Account object. That fails in Rails 2.2; if you need this functionality, you should use +@user.account.send(:private_method)+ (or make the method public instead of private or protected). Please note that if you're overriding +method_missing+, you should also override +respond_to+ to match the behavior in order for associations to function normally.
  197
+Active Record association proxies now respect the scope of methods on the proxied object. Previously (given User has_one :account) `@user.account.private_method` would call the private method on the associated Account object. That fails in Rails 2.2; if you need this functionality, you should use `@user.account.send(:private_method)` (or make the method public instead of private or protected). Please note that if you're overriding `method_missing`, you should also override `respond_to` to match the behavior in order for associations to function normally.
192 198
 
193 199
 * Lead Contributor: Adam Milligan
194 200
 * More information:
195  
-** "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/
  201
+    * [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/)
196 202
 
197  
-h4. Other ActiveRecord Changes
  203
+### Other ActiveRecord Changes
198 204
 
199  
-* +rake db:migrate:redo+ now accepts an optional VERSION to target that specific migration to redo
200  
-* Set +config.active_record.timestamped_migrations = false+ to have migrations with numeric prefix instead of UTC timestamp.
201  
-* Counter cache columns (for associations declared with +:counter_cache => true+) do not need to be initialized to zero any longer.
202  
-* +ActiveRecord::Base.human_name+ for an internationalization-aware humane translation of model names
  205
+* `rake db:migrate:redo` now accepts an optional VERSION to target that specific migration to redo
  206
+* Set `config.active_record.timestamped_migrations = false` to have migrations with numeric prefix instead of UTC timestamp.
  207
+* Counter cache columns (for associations declared with `:counter_cache => true`) do not need to be initialized to zero any longer.
  208
+* `ActiveRecord::Base.human_name` for an internationalization-aware humane translation of model names
203 209
 
204  
-h3. Action Controller
  210
+Action Controller
  211
+-----------------
205 212
 
206 213
 On the controller side, there are several changes that will help tidy up your routes. There are also some internal changes in the routing engine to lower memory usage on complex applications.
207 214
 
208  
-h4. Shallow Route Nesting
  215
+### Shallow Route Nesting
209 216
 
210 217
 Shallow route nesting provides a solution to the well-known difficulty of using deeply-nested resources. With shallow nesting, you need only supply enough information to uniquely identify the resource that you want to work with.
211 218
 
212  
-<ruby>
  219
+```ruby
213 220
 map.resources :publishers, :shallow => true do |publisher|
214 221
   publisher.resources :magazines do |magazine|
215 222
     magazine.resources :photos
216 223
   end
217 224
 end
218  
-</ruby>
  225
+```
219 226
 
220 227
 This will enable recognition of (among others) these routes:
221 228
 
222  
-<ruby>
  229
+```
223 230
 /publishers/1           ==> publisher_path(1)
224 231
 /publishers/1/magazines ==> publisher_magazines_path(1)
225 232
 /magazines/2            ==> magazine_path(2)
226 233
 /magazines/2/photos     ==> magazines_photos_path(2)
227 234
 /photos/3               ==> photo_path(3)
228  
-</ruby>
  235
+```
229 236
 
230  
-* Lead Contributor: "S. Brent Faulkner":http://www.unwwwired.net/
  237
+* Lead Contributor: [S. Brent Faulkner](http://www.unwwwired.net/)
231 238
 * More information:
232  
-** "Rails Routing from the Outside In":http://guides.rubyonrails.org/routing.html#nested-resources
233  
-** "What's New in Edge Rails: Shallow Routes":http://ryandaigle.com/articles/2008/9/7/what-s-new-in-edge-rails-shallow-routes
  239
+    * [Rails Routing from the Outside In](http://guides.rubyonrails.org/routing.html#nested-resources)
  240
+    * [What's New in Edge Rails: Shallow Routes](http://ryandaigle.com/articles/2008/9/7/what-s-new-in-edge-rails-shallow-routes)
234 241
 
235  
-h4. Method Arrays for Member or Collection Routes
  242
+### Method Arrays for Member or Collection Routes
236 243
 
237 244
 You can now supply an array of methods for new member or collection routes. This removes the annoyance of having to define a route as accepting any verb as soon as you need it to handle more than one. With Rails 2.2, this is a legitimate route declaration:
238 245
 
239  
-<ruby>
  246
+```ruby
240 247
 map.resources :photos, :collection => { :search => [:get, :post] }
241  
-</ruby>
  248
+```
242 249
 
243  
-* Lead Contributor: "Brennan Dunn":http://brennandunn.com/
  250
+* Lead Contributor: [Brennan Dunn](http://brennandunn.com/)
244 251
 
245  
-h4. Resources With Specific Actions
  252
+### Resources With Specific Actions
246 253
 
247  
-By default, when you use +map.resources+ to create a route, Rails generates routes for seven default actions (index, show, create, new, edit, update, and destroy). But each of these routes takes up memory in your application, and causes Rails to generate additional routing logic. Now you can use the +:only+ and +:except+ options to fine-tune the routes that Rails will generate for resources. You can supply a single action, an array of actions, or the special +:all+ or +:none+ options. These options are inherited by nested resources.
  254
+By default, when you use `map.resources` to create a route, Rails generates routes for seven default actions (index, show, create, new, edit, update, and destroy). But each of these routes takes up memory in your application, and causes Rails to generate additional routing logic. Now you can use the `:only` and `:except` options to fine-tune the routes that Rails will generate for resources. You can supply a single action, an array of actions, or the special `:all` or `:none` options. These options are inherited by nested resources.
248 255
 
249  
-<ruby>
  256
+```ruby
250 257
 map.resources :photos, :only => [:index, :show]
251 258
 map.resources :products, :except => :destroy
252  
-</ruby>
  259
+```
253 260
 
254  
-* Lead Contributor: "Tom Stuart":http://experthuman.com/
  261
+* Lead Contributor: [Tom Stuart](http://experthuman.com/)
255 262
 
256  
-h4. Other Action Controller Changes
  263
+### Other Action Controller Changes
257 264
 
258  
-* You can now easily "show a custom error page":http://m.onkey.org/2008/7/20/rescue-from-dispatching for exceptions raised while routing a request.
259  
-* The HTTP Accept header is disabled by default now. You should prefer the use of formatted URLs (such as +/customers/1.xml+) to indicate the format that you want. If you need the Accept headers, you can turn them back on with +config.action_controller.use_accept_header = true+.
  265
+* You can now easily [show a custom error page](http://m.onkey.org/2008/7/20/rescue-from-dispatching) for exceptions raised while routing a request.
  266
+* The HTTP Accept header is disabled by default now. You should prefer the use of formatted URLs (such as `/customers/1.xml`) to indicate the format that you want. If you need the Accept headers, you can turn them back on with `config.action_controller.use_accept_header = true`.
260 267
 * Benchmarking numbers are now reported in milliseconds rather than tiny fractions of seconds
261 268
 * Rails now supports HTTP-only cookies (and uses them for sessions), which help mitigate some cross-site scripting risks in newer browsers.
262  
-* +redirect_to+ now fully supports URI schemes (so, for example, you can redirect to a svn+ssh: URI).
263  
-* +render+ now supports a +:js+ option to render plain vanilla JavaScript with the right mime type.
  269
+* `redirect_to` now fully supports URI schemes (so, for example, you can redirect to a svn`ssh: URI).
  270
+* `render` now supports a `:js` option to render plain vanilla JavaScript with the right mime type.
264 271
 * Request forgery protection has been tightened up to apply to HTML-formatted content requests only.
265  
-* Polymorphic URLs behave more sensibly if a passed parameter is nil. For example, calling +polymorphic_path([@project, @date, @area])+ with a nil date will give you +project_area_path+.
  272
+* Polymorphic URLs behave more sensibly if a passed parameter is nil. For example, calling `polymorphic_path([@project, @date, @area])` with a nil date will give you `project_area_path`.
266 273
 
267  
-h3. Action View
  274
+Action View
  275
+-----------
268 276
 
269  
-* +javascript_include_tag+ and +stylesheet_link_tag+ support a new +:recursive+ option to be used along with +:all+, so that you can load an entire tree of files with a single line of code.
  277
+* `javascript_include_tag` and `stylesheet_link_tag` support a new `:recursive` option to be used along with `:all`, so that you can load an entire tree of files with a single line of code.
270 278
 * The included Prototype JavaScript library has been upgraded to version 1.6.0.3.
271  
-* +RJS#page.reload+ to reload the browser's current location via JavaScript
272  
-* The +atom_feed+ helper now takes an +:instruct+ option to let you insert XML processing instructions.
  279
+* `RJS#page.reload` to reload the browser's current location via JavaScript
  280
+* The `atom_feed` helper now takes an `:instruct` option to let you insert XML processing instructions.
273 281
 
274  
-h3. Action Mailer
  282
+Action Mailer
  283
+-------------
275 284
 
276  
-Action Mailer now supports mailer layouts. You can make your HTML emails as pretty as your in-browser views by supplying an appropriately-named layout - for example, the +CustomerMailer+ class expects to use +layouts/customer_mailer.html.erb+.
  285
+Action Mailer now supports mailer layouts. You can make your HTML emails as pretty as your in-browser views by supplying an appropriately-named layout - for example, the `CustomerMailer` class expects to use `layouts/customer_mailer.html.erb`.
277 286
 
278 287
 * More information:
279  
-** "What's New in Edge Rails: Mailer Layouts":http://ryandaigle.com/articles/2008/9/7/what-s-new-in-edge-rails-mailer-layouts
  288
+    * [What's New in Edge Rails: Mailer Layouts](http://ryandaigle.com/articles/2008/9/7/what-s-new-in-edge-rails-mailer-layouts)
280 289
 
281 290
 Action Mailer now offers built-in support for GMail's SMTP servers, by turning on STARTTLS automatically. This requires Ruby 1.8.7 to be installed.
282 291
 
283  
-h3. Active Support
  292
+Active Support
  293
+--------------
284 294
 
285  
-Active Support now offers built-in memoization for Rails applications, the +each_with_object+ method, prefix support on delegates, and various other new utility methods.
  295
+Active Support now offers built-in memoization for Rails applications, the `each_with_object` method, prefix support on delegates, and various other new utility methods.
286 296
 
287  
-h4. Memoization
  297
+### Memoization
288 298
 
289 299
 Memoization is a pattern of initializing a method once and then stashing its value away for repeat use. You've probably used this pattern in your own applications:
290 300
 
291  
-<ruby>
  301
+```ruby
292 302
 def full_name
293 303
   @full_name ||= "#{first_name} #{last_name}"
294 304
 end
295  
-</ruby>
  305
+```
296 306
 
297 307
 Memoization lets you handle this task in a declarative fashion:
298 308
 
299  
-<ruby>
  309
+```ruby
300 310
 extend ActiveSupport::Memoizable
301 311
 
302 312
 def full_name
303 313
   "#{first_name} #{last_name}"
304 314
 end
305 315
 memoize :full_name
306  
-</ruby>
  316
+```
307 317
 
308  
-Other features of memoization include +unmemoize+, +unmemoize_all+, and +memoize_all+ to turn memoization on or off.
  318
+Other features of memoization include `unmemoize`, `unmemoize_all`, and `memoize_all` to turn memoization on or off.
309 319
 
310  
-* Lead Contributor: "Josh Peek":http://joshpeek.com/
  320
+* Lead Contributor: [Josh Peek](http://joshpeek.com/)
311 321
 * More information:
312  
-** "What's New in Edge Rails: Easy Memoization":http://ryandaigle.com/articles/2008/7/16/what-s-new-in-edge-rails-memoization
313  
-** "Memo-what? A Guide to Memoization":http://www.railway.at/articles/2008/09/20/a-guide-to-memoization
  322
+    * [What's New in Edge Rails: Easy Memoization](http://ryandaigle.com/articles/2008/7/16/what-s-new-in-edge-rails-memoization)
  323
+    * [Memo-what? A Guide to Memoization](http://www.railway.at/articles/2008/09/20/a-guide-to-memoization)
314 324
 
315  
-h4. each_with_object
  325
+### each_with_object
316 326
 
317  
-The +each_with_object+ method provides an alternative to +inject+, using a method backported from Ruby 1.9. It iterates over a collection, passing the current element and the memo into the block.
  327
+The `each_with_object` method provides an alternative to `inject`, using a method backported from Ruby 1.9. It iterates over a collection, passing the current element and the memo into the block.
318 328
 
319  
-<ruby>
  329
+```ruby
320 330
 %w(foo bar).each_with_object({}) { |str, hsh| hsh[str] = str.upcase } #=> {'foo' => 'FOO', 'bar' => 'BAR'}
321  
-</ruby>
  331
+```
322 332
 
323  
-Lead Contributor: "Adam Keys":http://therealadam.com/
  333
+Lead Contributor: [Adam Keys](http://therealadam.com/)
324 334
 
325  
-h4. Delegates With Prefixes
  335
+### Delegates With Prefixes
326 336
 
327 337
 If you delegate behavior from one class to another, you can now specify a prefix that will be used to identify the delegated methods. For example:
328 338
 
329  
-<ruby>
  339
+```ruby
330 340
 class Vendor < ActiveRecord::Base
331 341
   has_one :account
332 342
   delegate :email, :password, :to => :account, :prefix => true
333 343
 end
334  
-</ruby>
  344
+```
335 345
 
336  
-This will produce delegated methods +vendor#account_email+ and +vendor#account_password+. You can also specify a custom prefix:
  346
+This will produce delegated methods `vendor#account_email` and `vendor#account_password`. You can also specify a custom prefix:
337 347
 
338  
-<ruby>
  348
+```ruby
339 349
 class Vendor < ActiveRecord::Base
340 350
   has_one :account
341 351
   delegate :email, :password, :to => :account, :prefix => :owner
342 352
 end
343  
-</ruby>
  353
+```
344 354
 
345  
-This will produce delegated methods +vendor#owner_email+ and +vendor#owner_password+.
  355
+This will produce delegated methods `vendor#owner_email` and `vendor#owner_password`.
346 356
 
347  
-Lead Contributor: "Daniel Schierbeck":http://workingwithrails.com/person/5830-daniel-schierbeck
  357
+Lead Contributor: [Daniel Schierbeck](http://workingwithrails.com/person/5830-daniel-schierbeck)
348 358
 
349  
-h4. Other Active Support Changes
  359
+### Other Active Support Changes
350 360
 
351  
-* Extensive updates to +ActiveSupport::Multibyte+, including Ruby 1.9 compatibility fixes.
352  
-* The addition of +ActiveSupport::Rescuable+ allows any class to mix in the +rescue_from+ syntax.
353  
-* +past?+, +today?+ and +future?+ for +Date+ and +Time+ classes to facilitate date/time comparisons.
354  
-* +Array#second+ through +Array#fifth+ as aliases for +Array#[1]+ through +Array#[4]+
355  
-* +Enumerable#many?+ to encapsulate +collection.size > 1+
356  
-* +Inflector#parameterize+ produces a URL-ready version of its input, for use in +to_param+.
357  
-* +Time#advance+ recognizes fractional days and weeks, so you can do +1.7.weeks.ago+, +1.5.hours.since+, and so on.
  361
+* Extensive updates to `ActiveSupport::Multibyte`, including Ruby 1.9 compatibility fixes.
  362
+* The addition of `ActiveSupport::Rescuable` allows any class to mix in the `rescue_from` syntax.
  363
+* `past?`, `today?` and `future?` for `Date` and `Time` classes to facilitate date/time comparisons.
  364
+* `Array#second` through `Array#fifth` as aliases for `Array#[1]` through `Array#[4]`
  365
+* `Enumerable#many?` to encapsulate `collection.size > 1`
  366
+* `Inflector#parameterize` produces a URL-ready version of its input, for use in `to_param`.
  367
+* `Time#advance` recognizes fractional days and weeks, so you can do `1.7.weeks.ago`, `1.5.hours.since`, and so on.
358 368
 * The included TzInfo library has been upgraded to version 0.3.12.
359  
-* +ActiveSuport::StringInquirer+ gives you a pretty way to test for equality in strings: +ActiveSupport::StringInquirer.new("abc").abc? => true+
  369
+* `ActiveSuport::StringInquirer` gives you a pretty way to test for equality in strings: `ActiveSupport::StringInquirer.new("abc").abc? => true`
360 370
 
361  
-h3. Railties
  371
+Railties
  372
+--------
362 373
 
363  
-In Railties (the core code of Rails itself) the biggest changes are in the +config.gems+ mechanism.
  374
+In Railties (the core code of Rails itself) the biggest changes are in the `config.gems` mechanism.
364 375
 
365  
-h4. config.gems
  376
+### config.gems
366 377
 
367  
-To avoid deployment issues and make Rails applications more self-contained, it's possible to place copies of all of the gems that your Rails application requires in +/vendor/gems+. This capability first appeared in Rails 2.1, but it's much more flexible and robust in Rails 2.2, handling complicated dependencies between gems. Gem management in Rails includes these commands:
  378
+To avoid deployment issues and make Rails applications more self-contained, it's possible to place copies of all of the gems that your Rails application requires in `/vendor/gems`. This capability first appeared in Rails 2.1, but it's much more flexible and robust in Rails 2.2, handling complicated dependencies between gems. Gem management in Rails includes these commands:
368 379
 
369  
-* +config.gem _gem_name_+ in your +config/environment.rb+ file
370  
-* +rake gems+ to list all configured gems, as well as whether they (and their dependencies) are installed, frozen, or framework (framework gems are those loaded by Rails before the gem dependency code is executed; such gems cannot be frozen)
371  
-* +rake gems:install+ to install missing gems to the computer
372  
-* +rake gems:unpack+ to place a copy of the required gems into +/vendor/gems+
373  
-* +rake gems:unpack:dependencies+ to get copies of the required gems and their dependencies into +/vendor/gems+
374  
-* +rake gems:build+ to build any missing native extensions
375  
-* +rake gems:refresh_specs+ to bring vendored gems created with Rails 2.1 into alignment with the Rails 2.2 way of storing them
  380
+* `config.gem _gem_name_` in your `config/environment.rb` file
  381
+* `rake gems` to list all configured gems, as well as whether they (and their dependencies) are installed, frozen, or framework (framework gems are those loaded by Rails before the gem dependency code is executed; such gems cannot be frozen)
  382
+* `rake gems:install` to install missing gems to the computer
  383
+* `rake gems:unpack` to place a copy of the required gems into `/vendor/gems`
  384
+* `rake gems:unpack:dependencies` to get copies of the required gems and their dependencies into `/vendor/gems`
  385
+* `rake gems:build` to build any missing native extensions
  386
+* `rake gems:refresh_specs` to bring vendored gems created with Rails 2.1 into alignment with the Rails 2.2 way of storing them
376 387
 
377  
-You can unpack or install a single gem by specifying +GEM=_gem_name_+ on the command line.
  388
+You can unpack or install a single gem by specifying `GEM=_gem_name_` on the command line.
378 389
 
379  
-* Lead Contributor: "Matt Jones":http://github.com/al2o3cr
  390
+* Lead Contributor: [Matt Jones](http://github.com/al2o3cr)
380 391
 * More information:
381  
-** "What's New in Edge Rails: Gem Dependencies":http://ryandaigle.com/articles/2008/4/1/what-s-new-in-edge-rails-gem-dependencies
382  
-** "Rails 2.1.2 and 2.2RC1: Update Your RubyGems":http://afreshcup.com/2008/10/25/rails-212-and-22rc1-update-your-rubygems/
383  
-** "Detailed discussion on Lighthouse":http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/1128
  392
+    * [What's New in Edge Rails: Gem Dependencies](http://ryandaigle.com/articles/2008/4/1/what-s-new-in-edge-rails-gem-dependencies)
  393
+    * [Rails 2.1.2 and 2.2RC1: Update Your RubyGems](http://afreshcup.com/2008/10/25/rails-212-and-22rc1-update-your-rubygems/)
  394
+    * [Detailed discussion on Lighthouse](http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/1128)
384 395
 
385  
-h4. Other Railties Changes
  396
+### Other Railties Changes
386 397
 
387  
-* If you're a fan of the "Thin":http://code.macournoyer.com/thin/ web server, you'll be happy to know that +script/server+ now supports Thin directly.
388  
-* +script/plugin install &lt;plugin&gt; -r &lt;revision&gt;+ now works with git-based as well as svn-based plugins.
389  
-* +script/console+ now supports a +--debugger+ option
  398
+* If you're a fan of the [Thin](http://code.macournoyer.com/thin/) web server, you'll be happy to know that `script/server` now supports Thin directly.
  399
+* `script/plugin install &lt;plugin&gt; -r &lt;revision&gt;` now works with git-based as well as svn-based plugins.
  400
+* `script/console` now supports a `--debugger` option
390 401
 * Instructions for setting up a continuous integration server to build Rails itself are included in the Rails source
391  
-* +rake notes:custom ANNOTATION=MYFLAG+ lets you list out custom annotations.
392  
-* Wrapped +Rails.env+ in +StringInquirer+ so you can do +Rails.env.development?+
  402
+* `rake notes:custom ANNOTATION=MYFLAG` lets you list out custom annotations.
  403
+* Wrapped `Rails.env` in `StringInquirer` so you can do `Rails.env.development?`
393 404
 * To eliminate deprecation warnings and properly handle gem dependencies, Rails now requires rubygems 1.3.1 or higher.
394 405
 
395  
-h3. Deprecated
  406
+Deprecated
  407
+----------
396 408
 
397 409
 A few pieces of older code are deprecated in this release:
398 410
 
399  
-* +Rails::SecretKeyGenerator+ has been replaced by +ActiveSupport::SecureRandom+
400  
-* +render_component+ is deprecated. There's a "render_components plugin":http://github.com/rails/render_component/tree/master available if you need this functionality.
  411
+* `Rails::SecretKeyGenerator` has been replaced by `ActiveSupport::SecureRandom`
  412
+* `render_component` is deprecated. There's a [render_components plugin](http://github.com/rails/render_component/tree/master) available if you need this functionality.
401 413
 * Implicit local assignments when rendering partials has been deprecated.
402 414
 
403  
-<ruby>
404  
-def partial_with_implicit_local_assignment
405  
-  @customer = Customer.new("Marcel")
406  
-  render :partial => "customer"
407  
-end
408  
-</ruby>
  415
+    ```ruby
  416
+    def partial_with_implicit_local_assignment
  417
+      @customer = Customer.new("Marcel")
  418
+      render :partial => "customer"
  419
+    end
  420
+    ```
409 421
 
410  
-Previously the above code made available a local variable called +customer+ inside the partial 'customer'. You should explicitly pass all the variables via :locals hash now.
  422
+    Previously the above code made available a local variable called `customer` inside the partial 'customer'. You should explicitly pass all the variables via :locals hash now.
411 423
 
412  
-* +country_select+ has been removed. See the "deprecation page":http://www.rubyonrails.org/deprecation/list-of-countries for more information and a plugin replacement.
413  
-* +ActiveRecord::Base.allow_concurrency+ no longer has any effect.
414  
-* +ActiveRecord::Errors.default_error_messages+ has been deprecated in favor of +I18n.translate('activerecord.errors.messages')+
415  
-* The +%s+ and +%d+ interpolation syntax for internationalization is deprecated.
416  
-* +String#chars+ has been deprecated in favor of +String#mb_chars+.
417  
-* Durations of fractional months or fractional years are deprecated. Use Ruby's core +Date+ and +Time+ class arithmetic instead.
418  
-* +Request#relative_url_root+ is deprecated. Use +ActionController::Base.relative_url_root+ instead.
  424
+* `country_select` has been removed. See the [deprecation page](http://www.rubyonrails.org/deprecation/list-of-countries) for more information and a plugin replacement.
  425
+* `ActiveRecord::Base.allow_concurrency` no longer has any effect.
  426
+* `ActiveRecord::Errors.default_error_messages` has been deprecated in favor of `I18n.translate('activerecord.errors.messages')`
  427
+* The `%s` and `%d` interpolation syntax for internationalization is deprecated.
  428
+* `String#chars` has been deprecated in favor of `String#mb_chars`.
  429
+* Durations of fractional months or fractional years are deprecated. Use Ruby's core `Date` and `Time` class arithmetic instead.
  430
+* `Request#relative_url_root` is deprecated. Use `ActionController::Base.relative_url_root` instead.
419 431
 
420  
-h3. Credits
  432
+Credits
  433
+-------
421 434
 
422  
-Release notes compiled by "Mike Gunderloy":http://afreshcup.com
  435
+Release notes compiled by [Mike Gunderloy](http://afreshcup.com)
535  guides/source/2_3_release_notes.md
Source Rendered
... ...
@@ -1,14 +1,16 @@
1  
-h2. Ruby on Rails 2.3 Release Notes
  1
+Ruby on Rails 2.3 Release Notes
  2
+===============================
2 3
 
3  
-Rails 2.3 delivers a variety of new and improved features, including pervasive Rack integration, refreshed support for Rails Engines, nested transactions for Active Record, dynamic and default scopes, unified rendering, more efficient routing, application templates, and quiet backtraces. This list covers the major upgrades, but doesn't include every little bug fix and change. If you want to see everything, check out the "list of commits":http://github.com/rails/rails/commits/master in the main Rails repository on GitHub or review the +CHANGELOG+ files for the individual Rails components.
  4
+Rails 2.3 delivers a variety of new and improved features, including pervasive Rack integration, refreshed support for Rails Engines, nested transactions for Active Record, dynamic and default scopes, unified rendering, more efficient routing, application templates, and quiet backtraces. This list covers the major upgrades, but doesn't include every little bug fix and change. If you want to see everything, check out the [list of commits](http://github.com/rails/rails/commits/master) in the main Rails repository on GitHub or review the `CHANGELOG` files for the individual Rails components.
4 5
 
5  
-endprologue.
  6
+--------------------------------------------------------------------------------
6 7
 
7  
-h3. Application Architecture
  8
+Application Architecture
  9
+------------------------
8 10
 
9  
-There are two major changes in the architecture of Rails applications: complete integration of the "Rack":http://rack.rubyforge.org/ modular web server interface, and renewed support for Rails Engines.
  11
+There are two major changes in the architecture of Rails applications: complete integration of the [Rack](http://rack.rubyforge.org/) modular web server interface, and renewed support for Rails Engines.
10 12
 
11  
-h4. Rack Integration
  13
+### Rack Integration
12 14
 
13 15
 Rails has now broken with its CGI past, and uses Rack everywhere. This required and resulted in a tremendous number of internal changes (but if you use CGI, don't worry; Rails now supports CGI through a proxy interface.) Still, this is a major change to Rails internals. After upgrading to 2.3, you should test on your local environment and your production environment. Some things to test:
14 16
 
@@ -19,221 +21,225 @@ Rails has now broken with its CGI past, and uses Rack everywhere. This required
19 21
 
20 22
 Here's a summary of the rack-related changes:
21 23
 
22  
-* +script/server+ has been switched to use Rack, which means it supports any Rack compatible server. +script/server+ will also pick up a rackup configuration file if one exists. By default, it will look for a +config.ru+ file, but you can override this with the +-c+ switch.
  24
+* `script/server` has been switched to use Rack, which means it supports any Rack compatible server. `script/server` will also pick up a rackup configuration file if one exists. By default, it will look for a `config.ru` file, but you can override this with the `-c` switch.
23 25
 * The FCGI handler goes through Rack.
24  
-* +ActionController::Dispatcher+ maintains its own default middleware stack. Middlewares can be injected in, reordered, and removed. The stack is compiled into a chain on boot. You can configure the middleware stack in +environment.rb+.
25  
-* The +rake middleware+ task has been added to inspect the middleware stack. This is useful for debugging the order of the middleware stack.
  26
+* `ActionController::Dispatcher` maintains its own default middleware stack. Middlewares can be injected in, reordered, and removed. The stack is compiled into a chain on boot. You can configure the middleware stack in `environment.rb`.
  27
+* The `rake middleware` task has been added to inspect the middleware stack. This is useful for debugging the order of the middleware stack.
26 28
 * The integration test runner has been modified to execute the entire middleware and application stack. This makes integration tests perfect for testing Rack middleware.
27  
-* +ActionController::CGIHandler+ is a backwards compatible CGI wrapper around Rack. The +CGIHandler+ is meant to take an old CGI object and convert its environment information into a Rack compatible form.
28  
-* +CgiRequest+ and +CgiResponse+ have been removed.
  29
+* `ActionController::CGIHandler` is a backwards compatible CGI wrapper around Rack. The `CGIHandler` is meant to take an old CGI object and convert its environment information into a Rack compatible form.
  30
+* `CgiRequest` and `CgiResponse` have been removed.
29 31
 * Session stores are now lazy loaded. If you never access the session object during a request, it will never attempt to load the session data (parse the cookie, load the data from memcache, or lookup an Active Record object).
30  
-* You no longer need to use +CGI::Cookie.new+ in your tests for setting a cookie value. Assigning a +String+ value to request.cookies["foo"] now sets the cookie as expected.
31  
-* +CGI::Session::CookieStore+ has been replaced by +ActionController::Session::CookieStore+.
32  
-* +CGI::Session::MemCacheStore+ has been replaced by +ActionController::Session::MemCacheStore+.
33  
-* +CGI::Session::ActiveRecordStore+ has been replaced by +ActiveRecord::SessionStore+.
34  
-* You can still change your session store with +ActionController::Base.session_store = :active_record_store+.
35  
-* Default sessions options are still set with +ActionController::Base.session = { :key => "..." }+. However, the +:session_domain+ option has been renamed to +:domain+.
36  
-* The mutex that normally wraps your entire request has been moved into middleware, +ActionController::Lock+.
37  
-* +ActionController::AbstractRequest+ and +ActionController::Request+ have been unified. The new +ActionController::Request+ inherits from +Rack::Request+. This affects access to +response.headers['type']+ in test requests. Use +response.content_type+ instead.
38  
-* +ActiveRecord::QueryCache+ middleware is automatically inserted onto the middleware stack if +ActiveRecord+ has been loaded. This middleware sets up and flushes the per-request Active Record query cache.
39  
-* The Rails router and controller classes follow the Rack spec. You can call a controller directly with +SomeController.call(env)+. The router stores the routing parameters in +rack.routing_args+.
40  
-* +ActionController::Request+ inherits from +Rack::Request+.
41  
-* Instead of +config.action_controller.session = { :session_key => 'foo', ...+ use  +config.action_controller.session = { :key => 'foo', ...+.
42  
-* Using the +ParamsParser+ middleware preprocesses any XML, JSON, or YAML requests so they can be read normally with any +Rack::Request+ object after it.
  32
+* You no longer need to use `CGI::Cookie.new` in your tests for setting a cookie value. Assigning a `String` value to request.cookies["foo"] now sets the cookie as expected.
  33
+* `CGI::Session::CookieStore` has been replaced by `ActionController::Session::CookieStore`.
  34
+* `CGI::Session::MemCacheStore` has been replaced by `ActionController::Session::MemCacheStore`.
  35
+* `CGI::Session::ActiveRecordStore` has been replaced by `ActiveRecord::SessionStore`.
  36
+* You can still change your session store with `ActionController::Base.session_store = :active_record_store`.
  37
+* Default sessions options are still set with `ActionController::Base.session = { :key => "..." }`. However, the `:session_domain` option has been renamed to `:domain`.
  38
+* The mutex that normally wraps your entire request has been moved into middleware, `ActionController::Lock`.
  39
+* `ActionController::AbstractRequest` and `ActionController::Request` have been unified. The new `ActionController::Request` inherits from `Rack::Request`. This affects access to `response.headers['type']` in test requests. Use `response.content_type` instead.
  40
+* `ActiveRecord::QueryCache` middleware is automatically inserted onto the middleware stack if `ActiveRecord` has been loaded. This middleware sets up and flushes the per-request Active Record query cache.
  41
+* The Rails router and controller classes follow the Rack spec. You can call a controller directly with `SomeController.call(env)`. The router stores the routing parameters in `rack.routing_args`.
  42
+* `ActionController::Request` inherits from `Rack::Request`.
  43
+* Instead of `config.action_controller.session = { :session_key => 'foo', ...` use  `config.action_controller.session = { :key => 'foo', ...`.
  44
+* Using the `ParamsParser` middleware preprocesses any XML, JSON, or YAML requests so they can be read normally with any `Rack::Request` object after it.
43 45
 
44  
-h4. Renewed Support for Rails Engines
  46
+### Renewed Support for Rails Engines
45 47
 
46  
-After some versions without an upgrade, Rails 2.3 offers some new features for Rails Engines (Rails applications that can be embedded within other applications). First, routing files in engines are automatically loaded and reloaded now, just like your +routes.rb+ file (this also applies to routing files in other plugins). Second, if your plugin has an app folder, then app/[models|controllers|helpers] will automatically be added to the Rails load path. Engines also support adding view paths now, and Action Mailer as well as Action View will use views from engines and other plugins.
  48
+After some versions without an upgrade, Rails 2.3 offers some new features for Rails Engines (Rails applications that can be embedded within other applications). First, routing files in engines are automatically loaded and reloaded now, just like your `routes.rb` file (this also applies to routing files in other plugins). Second, if your plugin has an app folder, then app/[models|controllers|helpers] will automatically be added to the Rails load path. Engines also support adding view paths now, and Action Mailer as well as Action View will use views from engines and other plugins.
47 49
 
48  
-h3. Documentation
  50
+Documentation
  51
+-------------
49 52
 
50  
-The "Ruby on Rails guides":http://guides.rubyonrails.org/ project has published several additional guides for Rails 2.3. In addition, a "separate site":http://edgeguides.rubyonrails.org/ maintains updated copies of the Guides for Edge Rails. Other documentation efforts include a relaunch of the "Rails wiki":http://newwiki.rubyonrails.org/ and early planning for a Rails Book.
  53
+The [Ruby on Rails guides](http://guides.rubyonrails.org/) project has published several additional guides for Rails 2.3. In addition, a [separate site](http://edgeguides.rubyonrails.org/) maintains updated copies of the Guides for Edge Rails. Other documentation efforts include a relaunch of the [Rails wiki](http://newwiki.rubyonrails.org/) and early planning for a Rails Book.
51 54
 
52  
-* More Information: "Rails Documentation Projects":http://weblog.rubyonrails.org/2009/1/15/rails-documentation-projects.
  55
+* More Information: [Rails Documentation Projects](http://weblog.rubyonrails.org/2009/1/15/rails-documentation-projects.)
53 56
 
54  
-h3. Ruby 1.9.1 Support
  57
+Ruby 1.9.1 Support
  58
+------------------
55 59
 
56 60
 Rails 2.3 should pass all of its own tests whether you are running on Ruby 1.8 or the now-released Ruby 1.9.1. You should be aware, though, that moving to 1.9.1 entails checking all of the data adapters, plugins, and other code that you depend on for Ruby 1.9.1 compatibility, as well as Rails core.
57 61
 
58  
-h3. Active Record
  62
+Active Record
  63
+-------------
59 64
 
60 65
 Active Record gets quite a number of new features and bug fixes in Rails 2.3. The highlights include nested attributes, nested transactions, dynamic and default scopes, and batch processing.
61 66
 
62  
-h4. Nested Attributes
  67
+### Nested Attributes
63 68
 
64 69
 Active Record can now update the attributes on nested models directly, provided you tell it to do so:
65 70
 
66  
-<ruby>
  71
+```ruby
67 72
 class Book < ActiveRecord::Base
68 73
   has_one :author
69 74
   has_many :pages
70 75
 
71 76
   accepts_nested_attributes_for :author, :pages
72 77
 end
73  
-</ruby>
  78
+```
74 79
 
75 80
 Turning on nested attributes enables a number of things: automatic (and atomic) saving of a record together with its associated children, child-aware validations, and support for nested forms (discussed later).
76 81
 
77  
-You can also specify requirements for any new records that are added via nested attributes using the +:reject_if+ option:
  82
+You can also specify requirements for any new records that are added via nested attributes using the `:reject_if` option:
78 83
 
79  
-<ruby>
  84
+```ruby
80 85
 accepts_nested_attributes_for :author,
81 86
   :reject_if => proc { |attributes| attributes['name'].blank? }
82  
-</ruby>
  87
+```
83 88
 
84  
-* Lead Contributor: "Eloy Duran":http://superalloy.nl/
85  
-* More Information: "Nested Model Forms":http://weblog.rubyonrails.org/2009/1/26/nested-model-forms
  89
+* Lead Contributor: [Eloy Duran](http://superalloy.nl/)
  90
+* More Information: [Nested Model Forms](http://weblog.rubyonrails.org/2009/1/26/nested-model-forms)
86 91
 
87  
-h4. Nested Transactions
  92
+### Nested Transactions
88 93
 
89 94
 Active Record now supports nested transactions, a much-requested feature. Now you can write code like this:
90 95
 
91  
-<ruby>
  96
+```ruby
92 97
 User.transaction do
93  
-    User.create(:username => 'Admin')
94  
-    User.transaction(:requires_new => true) do
95  
-      User.create(:username => 'Regular')
96  
-      raise ActiveRecord::Rollback
97  
-    end
  98
+  User.create(:username => 'Admin')
  99
+  User.transaction(:requires_new => true) do
  100
+    User.create(:username => 'Regular')
  101
+    raise ActiveRecord::Rollback
98 102
   end
  103
+end
99 104
 
100  
-  User.find(:all)  # => Returns only Admin
101  
-</ruby>
  105
+User.find(:all)  # => Returns only Admin
  106
+```
102 107
 
103  
-Nested transactions let you roll back an inner transaction without affecting the state of the outer transaction. If you want a transaction to be nested, you must explicitly add the +:requires_new+ option; otherwise, a nested transaction simply becomes part of the parent transaction (as it does currently on Rails 2.2). Under the covers, nested transactions are "using savepoints":http://rails.lighthouseapp.com/projects/8994/tickets/383, so they're supported even on databases that don't have true nested transactions. There is also a bit of magic going on to make these transactions play well with transactional fixtures during testing.
  108
+Nested transactions let you roll back an inner transaction without affecting the state of the outer transaction. If you want a transaction to be nested, you must explicitly add the `:requires_new` option; otherwise, a nested transaction simply becomes part of the parent transaction (as it does currently on Rails 2.2). Under the covers, nested transactions are [using savepoints](http://rails.lighthouseapp.com/projects/8994/tickets/383,) so they're supported even on databases that don't have true nested transactions. There is also a bit of magic going on to make these transactions play well with transactional fixtures during testing.
104 109
 
105  
-* Lead Contributors: "Jonathan Viney":http://www.workingwithrails.com/person/4985-jonathan-viney and "Hongli Lai":http://izumi.plan99.net/blog/
  110
+* Lead Contributors: [Jonathan Viney](http://www.workingwithrails.com/person/4985-jonathan-viney) and [Hongli Lai](http://izumi.plan99.net/blog/)
106 111
 
107  
-h4. Dynamic Scopes
  112
+### Dynamic Scopes
108 113
 
109  
-You know about dynamic finders in Rails (which allow you to concoct methods like +find_by_color_and_flavor+ on the fly) and named scopes (which allow you to encapsulate reusable query conditions into friendly names like +currently_active+). Well, now you can have dynamic scope methods. The idea is to put together syntax that allows filtering on the fly _and_ method chaining. For example:
  114
+You know about dynamic finders in Rails (which allow you to concoct methods like `find_by_color_and_flavor` on the fly) and named scopes (which allow you to encapsulate reusable query conditions into friendly names like `currently_active`). Well, now you can have dynamic scope methods. The idea is to put together syntax that allows filtering on the fly _and_ method chaining. For example:
110 115
 
111  
-<ruby>
  116
+```ruby
112 117
 Order.scoped_by_customer_id(12)
113 118
 Order.scoped_by_customer_id(12).find(:all,
114 119
   :conditions => "status = 'open'")
115 120
 Order.scoped_by_customer_id(12).scoped_by_status("open")
116  
-</ruby>
  121
+```
117 122
 
118 123
 There's nothing to define to use dynamic scopes: they just work.
119 124
 
120  
-* Lead Contributor: "Yaroslav Markin":http://evilmartians.com/
121  
-* More Information: "What's New in Edge Rails: Dynamic Scope Methods":http://ryandaigle.com/articles/2008/12/29/what-s-new-in-edge-rails-dynamic-scope-methods.
  125
+* Lead Contributor: [Yaroslav Markin](http://evilmartians.com/)
  126
+* More Information: [What's New in Edge Rails: Dynamic Scope Methods](http://ryandaigle.com/articles/2008/12/29/what-s-new-in-edge-rails-dynamic-scope-methods.)
122 127
 
123  
-h4. Default Scopes
  128
+### Default Scopes
124 129
 
125  
-Rails 2.3 will introduce the notion of _default scopes_ similar to named scopes, but applying to all named scopes or find methods within the model. For example, you can write +default_scope :order => 'name ASC'+ and any time you retrieve records from that model they'll come out sorted by name (unless you override the option, of course).
  130
+Rails 2.3 will introduce the notion of _default scopes_ similar to named scopes, but applying to all named scopes or find methods within the model. For example, you can write `default_scope :order => 'name ASC'` and any time you retrieve records from that model they'll come out sorted by name (unless you override the option, of course).
126 131
 
127 132
 * Lead Contributor: Paweł Kondzior
128  
-* More Information: "What's New in Edge Rails: Default Scoping":http://ryandaigle.com/articles/2008/11/18/what-s-new-in-edge-rails-default-scoping
  133
+* More Information: [What's New in Edge Rails: Default Scoping](http://ryandaigle.com/articles/2008/11/18/what-s-new-in-edge-rails-default-scoping)
129 134
 
130  
-h4. Batch Processing
  135
+### Batch Processing
131 136
 
132  
-You can now process large numbers of records from an ActiveRecord model with less pressure on memory by using +find_in_batches+:
  137
+You can now process large numbers of records from an ActiveRecord model with less pressure on memory by using `find_in_batches`:
133 138
 
134  
-<ruby>
  139
+```ruby
135 140
 Customer.find_in_batches(:conditions => {:active => true}) do |customer_group|
136 141
   customer_group.each { |customer| customer.update_account_balance! }
137 142
 end
138  
-</ruby>
  143
+```
139 144
 
140  
-You can pass most of the +find+ options into +find_in_batches+. However, you cannot specify the order that records will be returned in (they will always be returned in ascending order of primary key, which must be an integer), or use the +:limit+ option. Instead, use the +:batch_size+ option, which defaults to 1000, to set the number of records that will be returned in each batch.
  145
+You can pass most of the `find` options into `find_in_batches`. However, you cannot specify the order that records will be returned in (they will always be returned in ascending order of primary key, which must be an integer), or use the `:limit` option. Instead, use the `:batch_size` option, which defaults to 1000, to set the number of records that will be returned in each batch.
141 146
 
142  
-The new +find_each+ method provides a wrapper around +find_in_batches+ that returns individual records, with the find itself being done in batches (of 1000 by default):
  147
+The new `find_each` method provides a wrapper around `find_in_batches` that returns individual records, with the find itself being done in batches (of 1000 by default):
143 148
 
144  
-<ruby>
  149
+```ruby
145 150
 Customer.find_each do |customer|
146 151
   customer.update_account_balance!
147 152
 end
148  
-</ruby>
  153
+```
149 154
 
150 155
 Note that you should only use this method for batch processing: for small numbers of records (less than 1000), you should just use the regular find methods with your own loop.
151 156
 
152  
-* More Information (at that point the convenience method was called just +each+):
153  
-** "Rails 2.3: Batch Finding":http://afreshcup.com/2009/02/23/rails-23-batch-finding/
154  
-** "What's New in Edge Rails: Batched Find":http://ryandaigle.com/articles/2009/2/23/what-s-new-in-edge-rails-batched-find
  157
+* More Information (at that point the convenience method was called just `each`):
  158
+    * [Rails 2.3: Batch Finding](http://afreshcup.com/2009/02/23/rails-23-batch-finding/)
  159
+    * [What's New in Edge Rails: Batched Find](http://ryandaigle.com/articles/2009/2/23/what-s-new-in-edge-rails-batched-find)
155 160
 
156  
-h4. Multiple Conditions for Callbacks
  161
+### Multiple Conditions for Callbacks
157 162
 
158  
-When using Active Record callbacks, you can now combine +:if+ and +:unless+ options on the same callback, and supply multiple conditions as an array:
  163
+When using Active Record callbacks, you can now combine `:if` and `:unless` options on the same callback, and supply multiple conditions as an array:
159 164
 
160  
-<ruby>
  165
+```ruby
161 166
 before_save :update_credit_rating, :if => :active,
162 167
   :unless => [:admin, :cash_only]
163  
-</ruby>
  168
+```
164 169
 * Lead Contributor: L. Caviola
165 170
 
166  
-h4. Find with having
  171
+### Find with having
167 172
 
168  
-Rails now has a +:having+ option on find (as well as on +has_many+ and +has_and_belongs_to_many+ associations) for filtering records in grouped finds. As those with heavy SQL backgrounds know, this allows filtering based on grouped results:
  173
+Rails now has a `:having` option on find (as well as on `has_many` and `has_and_belongs_to_many` associations) for filtering records in grouped finds. As those with heavy SQL backgrounds know, this allows filtering based on grouped results:
169 174
 
170  
-<ruby>
  175
+```ruby
171 176
 developers =  Developer.find(:all, :group => "salary",
172 177
   :having => "sum(salary) >  10000", :select => "salary")
173  
-</ruby>
  178
+```
174 179
 
175  
-* Lead Contributor: "Emilio Tagua":http://github.com/miloops
  180
+* Lead Contributor: [Emilio Tagua](http://github.com/miloops)
176 181
 
177  
-h4. Reconnecting MySQL Connections
  182
+### Reconnecting MySQL Connections
178 183
 
179  
-MySQL supports a reconnect flag in its connections - if set to true, then the client will try reconnecting to the server before giving up in case of a lost connection. You can now set +reconnect = true+ for your MySQL connections in +database.yml+ to get this behavior from a Rails application. The default is +false+, so the behavior of existing applications doesn't change.
  184
+MySQL supports a reconnect flag in its connections - if set to true, then the client will try reconnecting to the server before giving up in case of a lost connection. You can now set `reconnect = true` for your MySQL connections in `database.yml` to get this behavior from a Rails application. The default is `false`, so the behavior of existing applications doesn't change.
180 185
 
181  
-* Lead Contributor: "Dov Murik":http://twitter.com/dubek
  186
+* Lead Contributor: [Dov Murik](http://twitter.com/dubek)
182 187
 * More information:
183  
-** "Controlling Automatic Reconnection Behavior":http://dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html
184  
-** "MySQL auto-reconnect revisited":http://groups.google.com/group/rubyonrails-core/browse_thread/thread/49d2a7e9c96cb9f4
185  
-
186  
-h4. Other Active Record Changes
187  
-
188  
-* An extra +AS+ was removed from the generated SQL for +has_and_belongs_to_many+ preloading, making it work better for some databases.
189  
-* +ActiveRecord::Base#new_record?+ now returns +false+ rather than +nil+ when confronted with an existing record.
190  
-* A bug in quoting table names in some +has_many :through+ associations was fixed.
191  
-* You can now specify a particular timestamp for +updated_at+ timestamps: +cust = Customer.create(:name => "ABC Industries", :updated_at => 1.day.ago)+
192  
-* Better error messages on failed +find_by_attribute!+ calls.
193  
-* Active Record's +to_xml+ support gets just a little bit more flexible with the addition of a +:camelize+ option.
194  
-* A bug in canceling callbacks from +before_update+ or +before_create+ was fixed.
  188
+    * [Controlling Automatic Reconnection Behavior](http://dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html)
  189
+    * [MySQL auto-reconnect revisited](http://groups.google.com/group/rubyonrails-core/browse_thread/thread/49d2a7e9c96cb9f4)
  190
+
  191
+### Other Active Record Changes
  192
+
  193
+* An extra `AS` was removed from the generated SQL for `has_and_belongs_to_many` preloading, making it work better for some databases.
  194
+* `ActiveRecord::Base#new_record?` now returns `false` rather than `nil` when confronted with an existing record.
  195
+* A bug in quoting table names in some `has_many :through` associations was fixed.
  196
+* You can now specify a particular timestamp for `updated_at` timestamps: `cust = Customer.create(:name => "ABC Industries", :updated_at => 1.day.ago)`
  197
+* Better error messages on failed `find_by_attribute!` calls.
  198
+* Active Record's `to_xml` support gets just a little bit more flexible with the addition of a `:camelize` option.
  199
+* A bug in canceling callbacks from `before_update` or `before_create` was fixed.
195 200
 * Rake tasks for testing databases via JDBC have been added.
196  
-* +validates_length_of+ will use a custom error message with the +:in+ or +:within+ options (if one is supplied).
197  
-* Counts on scoped selects now work properly, so you can do things like +Account.scoped(:select => "DISTINCT credit_limit").count+.
198  
-* +ActiveRecord::Base#invalid?+ now works as the opposite of +ActiveRecord::Base#valid?+.
  201
+* `validates_length_of` will use a custom error message with the `:in` or `:within` options (if one is supplied).
  202
+* Counts on scoped selects now work properly, so you can do things like `Account.scoped(:select => "DISTINCT credit_limit").count`.
  203
+* `ActiveRecord::Base#invalid?` now works as the opposite of `ActiveRecord::Base#valid?`.
199 204
 
200  
-h3. Action Controller
  205
+Action Controller
  206
+-----------------
201 207
 
202 208
 Action Controller rolls out some significant changes to rendering, as well as improvements in routing and other areas, in this release.
203 209
 
204  
-h4. Unified Rendering
  210
+### Unified Rendering
205 211
 
206  
-+ActionController::Base#render+ is a lot smarter about deciding what to render. Now you can just tell it what to render and expect to get the right results. In older versions of Rails, you often need to supply explicit information to render:
  212
+`ActionController::Base#render` is a lot smarter about deciding what to render. Now you can just tell it what to render and expect to get the right results. In older versions of Rails, you often need to supply explicit information to render:
207 213
 
208  
-<ruby>
  214
+```ruby
209 215
 render :file => '/tmp/random_file.erb'
210 216
 render :template => 'other_controller/action'
211 217
 render :action => 'show'
212  
-</ruby>
  218
+```
213 219
 
214 220
 Now in Rails 2.3, you can just supply what you want to render:
215 221
 
216  
-<ruby>
  222
+```ruby
217 223
 render '/tmp/random_file.erb'
218 224
 render 'other_controller/action'
219 225
 render 'show'
220 226
 render :show
221  
-</ruby>
222  
-Rails chooses between file, template, and action depending on whether there is a leading slash, an embedded slash, or no slash at all in what's to be rendered. Note that you can also use a symbol instead of a string when rendering an action. Other rendering styles (+:inline+, +:text+, +:update+, +:nothing+, +:json+, +:xml+, +:js+) still require an explicit option.
  227
+```
  228
+Rails chooses between file, template, and action depending on whether there is a leading slash, an embedded slash, or no slash at all in what's to be rendered. Note that you can also use a symbol instead of a string when rendering an action. Other rendering styles (`:inline`, `:text`, `:update`, `:nothing`, `:json`, `:xml`, `:js`) still require an explicit option.
223 229
 
224  
-h4. Application Controller Renamed
  230
+### Application Controller Renamed
225 231
 
226  
-If you're one of the people who has always been bothered by the special-case naming of +application.rb+, rejoice! It's been reworked to be application_controller.rb in Rails 2.3. In addition, there's a new rake task, +rake rails:update:application_controller+ to do this automatically for you - and it will be run as part of the normal +rake rails:update+ process.
  232
+If you're one of the people who has always been bothered by the special-case naming of `application.rb`, rejoice! It's been reworked to be application_controller.rb in Rails 2.3. In addition, there's a new rake task, `rake rails:update:application_controller` to do this automatically for you - and it will be run as part of the normal `rake rails:update` process.
227 233
 
228 234
 * More Information:
229  
-** "The Death of Application.rb":http://afreshcup.com/2008/11/17/rails-2x-the-death-of-applicationrb/
230  
-** "What's New in Edge Rails: Application.rb Duality is no More":http://ryandaigle.com/articles/2008/11/19/what-s-new-in-edge-rails-application-rb-duality-is-no-more
  235
+    * [The Death of Application.rb](http://afreshcup.com/2008/11/17/rails-2x-the-death-of-applicationrb/)
  236
+    * [What's New in Edge Rails: Application.rb Duality is no More](http://ryandaigle.com/articles/2008/11/19/what-s-new-in-edge-rails-application-rb-duality-is-no-more)
231 237
 
232  
-h4. HTTP Digest Authentication Support
  238
+### HTTP Digest Authentication Support
233 239
 
234  
-Rails now has built-in support for HTTP digest authentication. To use it, you call +authenticate_or_request_with_http_digest+ with a block that returns the user’s password (which is then hashed and compared against the transmitted credentials):
  240
+Rails now has built-in support for HTTP digest authentication. To use it, you call `authenticate_or_request_with_http_digest` with a block that returns the user’s password (which is then hashed and compared against the transmitted credentials):
235 241
 
236  
-<ruby>
  242
+```ruby
237 243
 class PostsController < ApplicationController
238 244
   Users = {"dhh" => "secret"}
239 245
   before_filter :authenticate
@@ -250,91 +256,92 @@ class PostsController < ApplicationController
250 256
     end
251 257
   end
252 258
 end
253  
-</ruby>
  259
+```
254 260
 
255  
-* Lead Contributor: "Gregg Kellogg":http://www.kellogg-assoc.com/
256  
-* More Information: "What's New in Edge Rails: HTTP Digest Authentication":http://ryandaigle.com/articles/2009/1/30/what-s-new-in-edge-rails-http-digest-authentication
  261
+* Lead Contributor: [Gregg Kellogg](http://www.kellogg-assoc.com/)
  262
+* More Information: [What's New in Edge Rails: HTTP Digest Authentication](http://ryandaigle.com/articles/2009/1/30/what-s-new-in-edge-rails-http-digest-authentication)
257 263
 
258  
-h4. More Efficient Routing
  264
+### More Efficient Routing
259 265
 
260  
-There are a couple of significant routing changes in Rails 2.3. The +formatted_+ route helpers are gone, in favor just passing in +:format+ as an option. This cuts down the route generation process by 50% for any resource - and can save a substantial amount of memory (up to 100MB on large applications). If your code uses the +formatted_+ helpers, it will still work for the time being - but that behavior is deprecated and your application will be more efficient if you rewrite those routes using the new standard. Another big change is that Rails now supports multiple routing files, not just +routes.rb+. You can use +RouteSet#add_configuration_file+ to bring in more routes at any time - without clearing the currently-loaded routes. While this change is most useful for Engines, you can use it in any application that needs to load routes in batches.
  266
+There are a couple of significant routing changes in Rails 2.3. The `formatted_` route helpers are gone, in favor just passing in `:format` as an option. This cuts down the route generation process by 50% for any resource - and can save a substantial amount of memory (up to 100MB on large applications). If your code uses the `formatted_` helpers, it will still work for the time being - but that behavior is deprecated and your application will be more efficient if you rewrite those routes using the new standard. Another big change is that Rails now supports multiple routing files, not just `routes.rb`. You can use `RouteSet#add_configuration_file` to bring in more routes at any time - without clearing the currently-loaded routes. While this change is most useful for Engines, you can use it in any application that needs to load routes in batches.
261 267
 
262  
-* Lead Contributors: "Aaron Batalion":http://blog.hungrymachine.com/
  268
+* Lead Contributors: [Aaron Batalion](http://blog.hungrymachine.com/)
263 269
 
264  
-h4. Rack-based Lazy-loaded Sessions
  270
+### Rack-based Lazy-loaded Sessions
265 271
 
266 272
 A big change pushed the underpinnings of Action Controller session storage down to the Rack level. This involved a good deal of work in the code, though it should be completely transparent to your Rails applications (as a bonus, some icky patches around the old CGI session handler got removed). It's still significant, though, for one simple reason: non-Rails Rack applications have access to the same session storage handlers (and therefore the same session) as your Rails applications. In addition, sessions are now lazy-loaded (in line with the loading improvements to the rest of the framework). This means that you no longer need to explicitly disable sessions if you don't want them; just don't refer to them and they won't load.
267 273
 
268  
-h4. MIME Type Handling Changes
  274
+### MIME Type Handling Changes
269 275
 
270  
-There are a couple of changes to the code for handling MIME types in Rails. First, +MIME::Type+ now implements the +=~+ operator, making things much cleaner when you need to check for the presence of a type that has synonyms:
  276
+There are a couple of changes to the code for handling MIME types in Rails. First, `MIME::Type` now implements the `=~` operator, making things much cleaner when you need to check for the presence of a type that has synonyms:
271 277
 
272  
-<ruby>
  278
+```ruby
273 279
 if content_type && Mime::JS =~ content_type
274 280
   # do something cool
275 281
 end
276 282
 
277 283
 Mime::JS =~ "text/javascript"        => true
278 284
 Mime::JS =~ "application/javascript" => true
279  
-</ruby>
  285
+```
280 286
 
281  
-The other change is that the framework now uses the +Mime::JS+ when checking for JavaScript in various spots, making it handle those alternatives cleanly.
  287
+The other change is that the framework now uses the `Mime::JS` when checking for JavaScript in various spots, making it handle those alternatives cleanly.
282 288
 
283  
-* Lead Contributor: "Seth Fitzsimmons":http://www.workingwithrails.com/person/5510-seth-fitzsimmons
  289
+* Lead Contributor: [Seth Fitzsimmons](http://www.workingwithrails.com/person/5510-seth-fitzsimmons)
284 290
 
285  
-h4. Optimization of +respond_to+
  291
+### Optimization of `respond_to`
286 292
 
287  
-In some of the first fruits of the Rails-Merb team merger, Rails 2.3 includes some optimizations for the +respond_to+ method, which is of course heavily used in many Rails applications to allow your controller to format results differently based on the MIME type of the incoming request. After eliminating a call to +method_missing+ and some profiling and tweaking, we're seeing an 8% improvement in the number of requests per second served with a simple +respond_to+ that switches between three formats. The best part? No change at all required to the code of your application to take advantage of this speedup.
  293
+In some of the first fruits of the Rails-Merb team merger, Rails 2.3 includes some optimizations for the `respond_to` method, which is of course heavily used in many Rails applications to allow your controller to format results differently based on the MIME type of the incoming request. After eliminating a call to `method_missing` and some profiling and tweaking, we're seeing an 8% improvement in the number of requests per second served with a simple `respond_to` that switches between three formats. The best part? No change at all required to the code of your application to take advantage of this speedup.
288 294
 
289  
-h4. Improved Caching Performance
  295
+### Improved Caching Performance
290 296
 
291  
-Rails now keeps a per-request local cache of read from the remote cache stores, cutting down on unnecessary reads and leading to better site performance. While this work was originally limited to +MemCacheStore+, it is available to any remote store than implements the required methods.
  297
+Rails now keeps a per-request local cache of read from the remote cache stores, cutting down on unnecessary reads and leading to better site performance. While this work was originally limited to `MemCacheStore`, it is available to any remote store than implements the required methods.
292 298
 
293  
-* Lead Contributor: "Nahum Wild":http://www.motionstandingstill.com/
  299
+* Lead Contributor: [Nahum Wild](http://www.motionstandingstill.com/)
294 300
 
295  
-h4. Localized Views
  301
+### Localized Views
296 302
 
297  
-Rails can now provide localized views, depending on the locale that you have set. For example, suppose you have a +Posts+ controller with a +show+ action. By default, this will render +app/views/posts/show.html.erb+. But if you set +I18n.locale = :da+, it will render +app/views/posts/show.da.html.erb+. If the localized template isn't present, the undecorated version will be used. Rails also includes +I18n#available_locales+ and +I18n::SimpleBackend#available_locales+, which return an array of the translations that are available in the current Rails project.
  303
+Rails can now provide localized views, depending on the locale that you have set. For example, suppose you have a `Posts` controller with a `show` action. By default, this will render `app/views/posts/show.html.erb`. But if you set `I18n.locale = :da`, it will render `app/views/posts/show.da.html.erb`. If the localized template isn't present, the undecorated version will be used. Rails also includes `I18n#available_locales` and `I18n::SimpleBackend#available_locales`, which return an array of the translations that are available in the current Rails project.
298 304
 
299  
-In addition, you can use the same scheme to localize the rescue files in the +public+ directory: +public/500.da.html+ or +public/404.en.html+ work, for example.
  305
+In addition, you can use the same scheme to localize the rescue files in the `public` directory: `public/500.da.html` or `public/404.en.html` work, for example.
300 306
 
301  
-h4. Partial Scoping for Translations
  307
+### Partial Scoping for Translations
302 308
 
303  
-A change to the translation API makes things easier and less repetitive to write key translations within partials. If you call +translate(".foo")+ from the +people/index.html.erb+ template, you'll actually be calling +I18n.translate("people.index.foo")+ If you don't prepend the key with a period, then the API doesn't scope, just as before.
  309
+A change to the translation API makes things easier and less repetitive to write key translations within partials. If you call `translate(".foo")` from the `people/index.html.erb` template, you'll actually be calling `I18n.translate("people.index.foo")` If you don't prepend the key with a period, then the API doesn't scope, just as before.
304 310
 
305  
-h4. Other Action Controller Changes
  311
+### Other Action Controller Changes
306 312
 
307  
-* ETag handling has been cleaned up a bit: Rails will now skip sending an ETag header when there's no body to the response or when sending files with +send_file+.
308  
-* The fact that Rails checks for IP spoofing can be a nuisance for sites that do heavy traffic with cell phones, because their proxies don't generally set things up right. If that's you, you can now set +ActionController::Base.ip_spoofing_check = false+ to disable the check entirely.
309  
-* +ActionController::Dispatcher+ now implements its own middleware stack, which you can see by running +rake middleware+.
  313
+* ETag handling has been cleaned up a bit: Rails will now skip sending an ETag header when there's no body to the response or when sending files with `send_file`.
  314
+* The fact that Rails checks for IP spoofing can be a nuisance for sites that do heavy traffic with cell phones, because their proxies don't generally set things up right. If that's you, you can now set `ActionController::Base.ip_spoofing_check = false` to disable the check entirely.
  315
+* `ActionController::Dispatcher` now implements its own middleware stack, which you can see by running `rake middleware`.
310 316
 * Cookie sessions now have persistent session identifiers, with API compatibility with the server-side stores.
311  
-* You can now use symbols for the +:type+ option of +send_file+ and +send_data+, like this: +send_file("fabulous.png", :type => :png)+.
312  
-* The +:only+ and +:except+ options for +map.resources+ are no longer inherited by nested resources.
  317
+* You can now use symbols for the `:type` option of `send_file` and `send_data`, like this: `send_file("fabulous.png", :type => :png)`.
  318
+* The `:only` and `:except` options for `map.resources` are no longer inherited by nested resources.
313 319
 * The bundled memcached client has been updated to version 1.6.4.99.
314  
-* The +expires_in+, +stale?+, and +fresh_when+ methods now accept a +:public+ option to make them work well with proxy caching.
315  
-* The +:requirements+ option now works properly with additional RESTful member routes.
  320
+* The `expires_in`, `stale?`, and `fresh_when` methods now accept a `:public` option to make them work well with proxy caching.
  321
+* The `:requirements` option now works properly with additional RESTful member routes.
316 322
 * Shallow routes now properly respect namespaces.
317  
-* +polymorphic_url+ does a better job of handling objects with irregular plural names.
  323
+* `polymorphic_url` does a better job of handling objects with irregular plural names.
318 324
 
319  
-h3. Action View
  325
+Action View
  326
+-----------
320 327
 
321  
-Action View in Rails 2.3 picks up nested model forms, improvements to +render+, more flexible prompts for the date select helpers, and a speedup in asset caching, among other things.
  328
+Action View in Rails 2.3 picks up nested model forms, improvements to `render`, more flexible prompts for the date select helpers, and a speedup in asset caching, among other things.