rails 4.1.4 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +12 -10
  3. data/guides/CHANGELOG.md +15 -25
  4. data/guides/Rakefile +5 -3
  5. data/guides/assets/javascripts/guides.js +6 -0
  6. data/guides/assets/stylesheets/main.css +4 -1
  7. data/guides/bug_report_templates/action_controller_gem.rb +2 -2
  8. data/guides/bug_report_templates/action_controller_master.rb +3 -2
  9. data/guides/rails_guides/helpers.rb +1 -1
  10. data/guides/rails_guides/levenshtein.rb +29 -21
  11. data/guides/rails_guides/markdown/renderer.rb +1 -1
  12. data/guides/rails_guides/markdown.rb +11 -7
  13. data/guides/rails_guides.rb +2 -2
  14. data/guides/source/2_2_release_notes.md +1 -1
  15. data/guides/source/2_3_release_notes.md +4 -4
  16. data/guides/source/3_0_release_notes.md +8 -8
  17. data/guides/source/3_1_release_notes.md +5 -2
  18. data/guides/source/3_2_release_notes.md +6 -3
  19. data/guides/source/4_0_release_notes.md +6 -3
  20. data/guides/source/4_1_release_notes.md +10 -11
  21. data/guides/source/4_2_release_notes.md +850 -0
  22. data/guides/source/_license.html.erb +1 -1
  23. data/guides/source/_welcome.html.erb +2 -8
  24. data/guides/source/action_controller_overview.md +84 -10
  25. data/guides/source/action_mailer_basics.md +91 -28
  26. data/guides/source/action_view_overview.md +140 -130
  27. data/guides/source/active_job_basics.md +318 -0
  28. data/guides/source/active_model_basics.md +371 -17
  29. data/guides/source/active_record_basics.md +19 -18
  30. data/guides/source/active_record_callbacks.md +12 -9
  31. data/guides/source/{migrations.md → active_record_migrations.md} +135 -226
  32. data/guides/source/active_record_postgresql.md +433 -0
  33. data/guides/source/active_record_querying.md +269 -259
  34. data/guides/source/active_record_validations.md +21 -12
  35. data/guides/source/active_support_core_extensions.md +113 -73
  36. data/guides/source/active_support_instrumentation.md +10 -7
  37. data/guides/source/api_documentation_guidelines.md +62 -16
  38. data/guides/source/asset_pipeline.md +264 -67
  39. data/guides/source/association_basics.md +81 -74
  40. data/guides/source/caching_with_rails.md +32 -7
  41. data/guides/source/command_line.md +52 -30
  42. data/guides/source/configuring.md +132 -29
  43. data/guides/source/constant_autoloading_and_reloading.md +1297 -0
  44. data/guides/source/contributing_to_ruby_on_rails.md +192 -112
  45. data/guides/source/credits.html.erb +2 -2
  46. data/guides/source/debugging_rails_applications.md +448 -294
  47. data/guides/source/development_dependencies_install.md +47 -36
  48. data/guides/source/documents.yaml +19 -7
  49. data/guides/source/engines.md +210 -189
  50. data/guides/source/form_helpers.md +79 -56
  51. data/guides/source/generators.md +24 -11
  52. data/guides/source/getting_started.md +339 -201
  53. data/guides/source/i18n.md +111 -68
  54. data/guides/source/index.html.erb +1 -0
  55. data/guides/source/initialization.md +109 -62
  56. data/guides/source/layout.html.erb +1 -4
  57. data/guides/source/layouts_and_rendering.md +18 -17
  58. data/guides/source/maintenance_policy.md +26 -4
  59. data/guides/source/nested_model_forms.md +7 -4
  60. data/guides/source/plugins.md +27 -27
  61. data/guides/source/rails_application_templates.md +21 -3
  62. data/guides/source/rails_on_rack.md +12 -9
  63. data/guides/source/routing.md +100 -74
  64. data/guides/source/ruby_on_rails_guides_guidelines.md +11 -12
  65. data/guides/source/security.md +40 -34
  66. data/guides/source/testing.md +188 -117
  67. data/guides/source/upgrading_ruby_on_rails.md +284 -29
  68. data/guides/source/working_with_javascript_in_rails.md +18 -16
  69. data/guides/w3c_validator.rb +2 -0
  70. metadata +40 -94
  71. data/guides/code/getting_started/Gemfile +0 -40
  72. data/guides/code/getting_started/Gemfile.lock +0 -125
  73. data/guides/code/getting_started/README.rdoc +0 -28
  74. data/guides/code/getting_started/Rakefile +0 -6
  75. data/guides/code/getting_started/app/assets/javascripts/application.js +0 -15
  76. data/guides/code/getting_started/app/assets/javascripts/comments.js.coffee +0 -3
  77. data/guides/code/getting_started/app/assets/javascripts/posts.js.coffee +0 -3
  78. data/guides/code/getting_started/app/assets/javascripts/welcome.js.coffee +0 -3
  79. data/guides/code/getting_started/app/assets/stylesheets/application.css +0 -13
  80. data/guides/code/getting_started/app/assets/stylesheets/comments.css.scss +0 -3
  81. data/guides/code/getting_started/app/assets/stylesheets/posts.css.scss +0 -3
  82. data/guides/code/getting_started/app/assets/stylesheets/welcome.css.scss +0 -3
  83. data/guides/code/getting_started/app/controllers/application_controller.rb +0 -5
  84. data/guides/code/getting_started/app/controllers/comments_controller.rb +0 -23
  85. data/guides/code/getting_started/app/controllers/posts_controller.rb +0 -53
  86. data/guides/code/getting_started/app/controllers/welcome_controller.rb +0 -4
  87. data/guides/code/getting_started/app/helpers/application_helper.rb +0 -2
  88. data/guides/code/getting_started/app/helpers/comments_helper.rb +0 -2
  89. data/guides/code/getting_started/app/helpers/posts_helper.rb +0 -2
  90. data/guides/code/getting_started/app/helpers/welcome_helper.rb +0 -2
  91. data/guides/code/getting_started/app/models/comment.rb +0 -3
  92. data/guides/code/getting_started/app/models/post.rb +0 -7
  93. data/guides/code/getting_started/app/views/comments/_comment.html.erb +0 -15
  94. data/guides/code/getting_started/app/views/comments/_form.html.erb +0 -13
  95. data/guides/code/getting_started/app/views/layouts/application.html.erb +0 -14
  96. data/guides/code/getting_started/app/views/posts/_form.html.erb +0 -27
  97. data/guides/code/getting_started/app/views/posts/edit.html.erb +0 -5
  98. data/guides/code/getting_started/app/views/posts/index.html.erb +0 -21
  99. data/guides/code/getting_started/app/views/posts/new.html.erb +0 -5
  100. data/guides/code/getting_started/app/views/posts/show.html.erb +0 -18
  101. data/guides/code/getting_started/app/views/welcome/index.html.erb +0 -4
  102. data/guides/code/getting_started/bin/bundle +0 -4
  103. data/guides/code/getting_started/bin/rails +0 -4
  104. data/guides/code/getting_started/bin/rake +0 -4
  105. data/guides/code/getting_started/config/application.rb +0 -18
  106. data/guides/code/getting_started/config/boot.rb +0 -4
  107. data/guides/code/getting_started/config/database.yml +0 -25
  108. data/guides/code/getting_started/config/environment.rb +0 -5
  109. data/guides/code/getting_started/config/environments/development.rb +0 -30
  110. data/guides/code/getting_started/config/environments/production.rb +0 -80
  111. data/guides/code/getting_started/config/environments/test.rb +0 -36
  112. data/guides/code/getting_started/config/initializers/backtrace_silencers.rb +0 -7
  113. data/guides/code/getting_started/config/initializers/filter_parameter_logging.rb +0 -4
  114. data/guides/code/getting_started/config/initializers/inflections.rb +0 -16
  115. data/guides/code/getting_started/config/initializers/locale.rb +0 -9
  116. data/guides/code/getting_started/config/initializers/mime_types.rb +0 -5
  117. data/guides/code/getting_started/config/initializers/secret_token.rb +0 -12
  118. data/guides/code/getting_started/config/initializers/session_store.rb +0 -3
  119. data/guides/code/getting_started/config/initializers/wrap_parameters.rb +0 -14
  120. data/guides/code/getting_started/config/locales/en.yml +0 -23
  121. data/guides/code/getting_started/config/routes.rb +0 -7
  122. data/guides/code/getting_started/config.ru +0 -4
  123. data/guides/code/getting_started/db/migrate/20130122042648_create_posts.rb +0 -10
  124. data/guides/code/getting_started/db/migrate/20130122045842_create_comments.rb +0 -11
  125. data/guides/code/getting_started/db/schema.rb +0 -33
  126. data/guides/code/getting_started/db/seeds.rb +0 -7
  127. data/guides/code/getting_started/public/404.html +0 -60
  128. data/guides/code/getting_started/public/422.html +0 -60
  129. data/guides/code/getting_started/public/500.html +0 -59
  130. data/guides/code/getting_started/public/favicon.ico +0 -0
  131. data/guides/code/getting_started/public/robots.txt +0 -5
  132. data/guides/code/getting_started/test/controllers/comments_controller_test.rb +0 -7
  133. data/guides/code/getting_started/test/controllers/posts_controller_test.rb +0 -7
  134. data/guides/code/getting_started/test/controllers/welcome_controller_test.rb +0 -9
  135. data/guides/code/getting_started/test/fixtures/comments.yml +0 -11
  136. data/guides/code/getting_started/test/fixtures/posts.yml +0 -9
  137. data/guides/code/getting_started/test/helpers/comments_helper_test.rb +0 -4
  138. data/guides/code/getting_started/test/helpers/posts_helper_test.rb +0 -4
  139. data/guides/code/getting_started/test/helpers/welcome_helper_test.rb +0 -4
  140. data/guides/code/getting_started/test/models/comment_test.rb +0 -7
  141. data/guides/code/getting_started/test/models/post_test.rb +0 -7
  142. data/guides/code/getting_started/test/test_helper.rb +0 -12
@@ -0,0 +1,318 @@
1
+ Active Job Basics
2
+ =================
3
+
4
+ This guide provides you with all you need to get started in creating,
5
+ enqueueing and executing background jobs.
6
+
7
+ After reading this guide, you will know:
8
+
9
+ * How to create jobs.
10
+ * How to enqueue jobs.
11
+ * How to run jobs in the background.
12
+ * How to send emails from your application async.
13
+
14
+ --------------------------------------------------------------------------------
15
+
16
+
17
+ Introduction
18
+ ------------
19
+
20
+ Active Job is a framework for declaring jobs and making them run on a variety
21
+ of queueing backends. These jobs can be everything from regularly scheduled
22
+ clean-ups, to billing charges, to mailings. Anything that can be chopped up
23
+ into small units of work and run in parallel, really.
24
+
25
+
26
+ The Purpose of Active Job
27
+ -----------------------------
28
+ The main point is to ensure that all Rails apps will have a job infrastructure
29
+ in place, even if it's in the form of an "immediate runner". We can then have
30
+ framework features and other gems build on top of that, without having to
31
+ worry about API differences between various job runners such as Delayed Job
32
+ and Resque. Picking your queuing backend becomes more of an operational concern,
33
+ then. And you'll be able to switch between them without having to rewrite your jobs.
34
+
35
+
36
+ Creating a Job
37
+ --------------
38
+
39
+ This section will provide a step-by-step guide to creating a job and enqueuing it.
40
+
41
+ ### Create the Job
42
+
43
+ Active Job provides a Rails generator to create jobs. The following will create a
44
+ job in `app/jobs` (with an attached test case under `test/jobs`):
45
+
46
+ ```bash
47
+ $ bin/rails generate job guests_cleanup
48
+ invoke test_unit
49
+ create test/jobs/guests_cleanup_job_test.rb
50
+ create app/jobs/guests_cleanup_job.rb
51
+ ```
52
+
53
+ You can also create a job that will run on a specific queue:
54
+
55
+ ```bash
56
+ $ bin/rails generate job guests_cleanup --queue urgent
57
+ ```
58
+
59
+ If you don't want to use a generator, you could create your own file inside of
60
+ `app/jobs`, just make sure that it inherits from `ActiveJob::Base`.
61
+
62
+ Here's what a job looks like:
63
+
64
+ ```ruby
65
+ class GuestsCleanupJob < ActiveJob::Base
66
+ queue_as :default
67
+
68
+ def perform(*args)
69
+ # Do something later
70
+ end
71
+ end
72
+ ```
73
+
74
+ ### Enqueue the Job
75
+
76
+ Enqueue a job like so:
77
+
78
+ ```ruby
79
+ # Enqueue a job to be performed as soon the queueing system is free.
80
+ MyJob.perform_later record
81
+ ```
82
+
83
+ ```ruby
84
+ # Enqueue a job to be performed tomorrow at noon.
85
+ MyJob.set(wait_until: Date.tomorrow.noon).perform_later(record)
86
+ ```
87
+
88
+ ```ruby
89
+ # Enqueue a job to be performed 1 week from now.
90
+ MyJob.set(wait: 1.week).perform_later(record)
91
+ ```
92
+
93
+ That's it!
94
+
95
+
96
+ Job Execution
97
+ -------------
98
+
99
+ If no adapter is set, the job is immediately executed.
100
+
101
+ ### Backends
102
+
103
+ Active Job has built-in adapters for multiple queueing backends (Sidekiq,
104
+ Resque, Delayed Job and others). To get an up-to-date list of the adapters
105
+ see the API Documentation for [ActiveJob::QueueAdapters](http://api.rubyonrails.org/classes/ActiveJob/QueueAdapters.html).
106
+
107
+ ### Setting the Backend
108
+
109
+ You can easily set your queueing backend:
110
+
111
+ ```ruby
112
+ # config/application.rb
113
+ module YourApp
114
+ class Application < Rails::Application
115
+ # Be sure to have the adapter's gem in your Gemfile and follow
116
+ # the adapter's specific installation and deployment instructions.
117
+ config.active_job.queue_adapter = :sidekiq
118
+ end
119
+ end
120
+ ```
121
+
122
+
123
+ Queues
124
+ ------
125
+
126
+ Most of the adapters support multiple queues. With Active Job you can schedule
127
+ the job to run on a specific queue:
128
+
129
+ ```ruby
130
+ class GuestsCleanupJob < ActiveJob::Base
131
+ queue_as :low_priority
132
+ #....
133
+ end
134
+ ```
135
+
136
+ You can prefix the queue name for all your jobs using
137
+ `config.active_job.queue_name_prefix` in `application.rb`:
138
+
139
+ ```ruby
140
+ # config/application.rb
141
+ module YourApp
142
+ class Application < Rails::Application
143
+ config.active_job.queue_name_prefix = Rails.env
144
+ end
145
+ end
146
+
147
+ # app/jobs/guests_cleanup.rb
148
+ class GuestsCleanupJob < ActiveJob::Base
149
+ queue_as :low_priority
150
+ #....
151
+ end
152
+
153
+ # Now your job will run on queue production_low_priority on your
154
+ # production environment and on staging_low_priority on your staging
155
+ # environment
156
+ ```
157
+
158
+ The default queue name prefix delimiter is '\_'. This can be changed by setting
159
+ `config.active_job.queue_name_delimiter` in `application.rb`:
160
+
161
+ ```ruby
162
+ # config/application.rb
163
+ module YourApp
164
+ class Application < Rails::Application
165
+ config.active_job.queue_name_prefix = Rails.env
166
+ config.active_job.queue_name_delimiter = '.'
167
+ end
168
+ end
169
+
170
+ # app/jobs/guests_cleanup.rb
171
+ class GuestsCleanupJob < ActiveJob::Base
172
+ queue_as :low_priority
173
+ #....
174
+ end
175
+
176
+ # Now your job will run on queue production.low_priority on your
177
+ # production environment and on staging.low_priority on your staging
178
+ # environment
179
+ ```
180
+
181
+ If you want more control on what queue a job will be run you can pass a `:queue`
182
+ option to `#set`:
183
+
184
+ ```ruby
185
+ MyJob.set(queue: :another_queue).perform_later(record)
186
+ ```
187
+
188
+ To control the queue from the job level you can pass a block to `#queue_as`. The
189
+ block will be executed in the job context (so you can access `self.arguments`)
190
+ and you must return the queue name:
191
+
192
+ ```ruby
193
+ class ProcessVideoJob < ActiveJob::Base
194
+ queue_as do
195
+ video = self.arguments.first
196
+ if video.owner.premium?
197
+ :premium_videojobs
198
+ else
199
+ :videojobs
200
+ end
201
+ end
202
+
203
+ def perform(video)
204
+ # do process video
205
+ end
206
+ end
207
+
208
+ ProcessVideoJob.perform_later(Video.last)
209
+ ```
210
+
211
+ NOTE: Make sure your queueing backend "listens" on your queue name. For some
212
+ backends you need to specify the queues to listen to.
213
+
214
+
215
+ Callbacks
216
+ ---------
217
+
218
+ Active Job provides hooks during the lifecycle of a job. Callbacks allow you to
219
+ trigger logic during the lifecycle of a job.
220
+
221
+ ### Available callbacks
222
+
223
+ * `before_enqueue`
224
+ * `around_enqueue`
225
+ * `after_enqueue`
226
+ * `before_perform`
227
+ * `around_perform`
228
+ * `after_perform`
229
+
230
+ ### Usage
231
+
232
+ ```ruby
233
+ class GuestsCleanupJob < ActiveJob::Base
234
+ queue_as :default
235
+
236
+ before_enqueue do |job|
237
+ # do something with the job instance
238
+ end
239
+
240
+ around_perform do |job, block|
241
+ # do something before perform
242
+ block.call
243
+ # do something after perform
244
+ end
245
+
246
+ def perform
247
+ # Do something later
248
+ end
249
+ end
250
+ ```
251
+
252
+
253
+ Action Mailer
254
+ ------------
255
+
256
+ One of the most common jobs in a modern web application is sending emails outside
257
+ of the request-response cycle, so the user doesn't have to wait on it. Active Job
258
+ is integrated with Action Mailer so you can easily send emails asynchronously:
259
+
260
+ ```ruby
261
+ # If you want to send the email now use #deliver_now
262
+ UserMailer.welcome(@user).deliver_now
263
+
264
+ # If you want to send the email through Active Job use #deliver_later
265
+ UserMailer.welcome(@user).deliver_later
266
+ ```
267
+
268
+
269
+ GlobalID
270
+ --------
271
+
272
+ Active Job supports GlobalID for parameters. This makes it possible to pass live
273
+ Active Record objects to your job instead of class/id pairs, which you then have
274
+ to manually deserialize. Before, jobs would look like this:
275
+
276
+ ```ruby
277
+ class TrashableCleanupJob < ActiveJob::Base
278
+ def perform(trashable_class, trashable_id, depth)
279
+ trashable = trashable_class.constantize.find(trashable_id)
280
+ trashable.cleanup(depth)
281
+ end
282
+ end
283
+ ```
284
+
285
+ Now you can simply do:
286
+
287
+ ```ruby
288
+ class TrashableCleanupJob < ActiveJob::Base
289
+ def perform(trashable, depth)
290
+ trashable.cleanup(depth)
291
+ end
292
+ end
293
+ ```
294
+
295
+ This works with any class that mixes in `GlobalID::Identification`, which
296
+ by default has been mixed into Active Model classes.
297
+
298
+
299
+ Exceptions
300
+ ----------
301
+
302
+ Active Job provides a way to catch exceptions raised during the execution of the
303
+ job:
304
+
305
+ ```ruby
306
+
307
+ class GuestsCleanupJob < ActiveJob::Base
308
+ queue_as :default
309
+
310
+ rescue_from(ActiveRecord::RecordNotFound) do |exception|
311
+ # do something with the exception
312
+ end
313
+
314
+ def perform
315
+ # Do something later
316
+ end
317
+ end
318
+ ```