rails 4.1.14.2 → 4.2.11.1

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