Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

5.2キャッチアップ翻訳 active_record_callbacks.md #748

Merged
merged 3 commits into from Mar 1, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
48 changes: 23 additions & 25 deletions guides/source/ja/active_record_callbacks.md
Expand Up @@ -15,7 +15,7 @@ Active Record コールバック
オブジェクトのライフサイクル
---------------------

Railsアプリケーションを普通に操作すると、その内部でオブジェクトが作成されたり、更新されたりdestroyされたりします。Active Recordはこの<em>オブジェクトライフサイクル</em>へのフックを提供しており、これを使ってアプリケーションやデータを制御できます
Railsアプリケーションを普通に操作すると、その内部でオブジェクトが作成されたり、更新されたりdestroyされたりします。Active Recordはこの**オブジェクトライフサイクル**へのフックを提供しており、これを用いてアプリケーションやデータを制御できます

コールバックは、オブジェクトの状態が切り替わる「前」または「後」にロジックをトリガします。

Expand All @@ -26,7 +26,7 @@ Railsアプリケーションを普通に操作すると、その内部でオブ

### コールバックの登録

コールバックを利用するためには、コールバックを登録する必要があります。コールバックの実装は普通のメソッドと特に違うところはありません。これをコールバックとして登録するには、マクロのようなスタイルのクラスメソッドを使用します
コールバックを利用するためには、コールバックを登録する必要があります。コールバックの実装は普通のメソッドと特に違うところはありません。これをコールバックとして登録するには、マクロのようなスタイルのクラスメソッドを使います

```ruby
class User < ApplicationRecord
Expand Down Expand Up @@ -115,7 +115,7 @@ Active Recordで利用可能なコールバックの一覧を以下に示しま

WARNING: `after_save`コールバックは作成と更新の両方で呼び出されますが、コールバックマクロの呼び出し順にかかわらず、必ず、より詳細な`after_create`コールバックや`after_update`コールバックより _後_ に呼び出されます。

NOTE: `before_destroy`コールバックは、`dependent: :destroy`よりも前に配置する(または`prepend: true`オプションを用いる)べきです。これは、そのレコードが`dependent: :destroy`によって削除されるよりも前に`before_destroy`コールバックが実行されるようにするためです。
NOTE: `before_destroy`コールバックは、`dependent: :destroy`よりも**前**に配置する(または`prepend: true`オプションを用いる)べきです。理由は、そのレコードが`dependent: :destroy`によって削除されるよりも前に`before_destroy`コールバックが実行されるようにするためです。

### `after_initialize`と`after_find`

Expand Down Expand Up @@ -148,20 +148,20 @@ end

### `after_touch`

`after_touch`コールバックは、Active Recordオブジェクトがタッチされるたびに呼び出されます
`after_touch`コールバックは、Active Recordオブジェクトがtouchされるたびに呼び出されます

```ruby
class User < ApplicationRecord
after_touch do |user|
puts "オブジェクトにタッチしました"
puts "オブジェクトにtouchしました"
end
end

>> u = User.create(name: 'Kuldeep')
=> #<User id: 1, name: "Kuldeep", created_at: "2013-11-25 12:17:49", updated_at: "2013-11-25 12:17:49">

>> u.touch
オブジェクトにタッチしました
オブジェクトにtouchしました
=> true
```

Expand All @@ -171,7 +171,7 @@ end
class Employee < ApplicationRecord
belongs_to :company, touch: true
after_touch do
puts 'Employeeモデルにタッチされました'
puts 'Employeeモデルにtouchされました'
end
end

Expand All @@ -181,7 +181,7 @@ class Company < ApplicationRecord

private
def log_when_employees_or_company_touched
puts 'Employee/Companyにタッチされました'
puts 'Employee/Companyにtouchされました'
end
end

Expand All @@ -190,8 +190,8 @@ end

# @employee.company.touchをトリガーする
>> @employee.touch
Employeeにタッチされました
Employee/Companyにタッチされました
Employeeにtouchされました
Employee/Companyにtouchされました
=> true
```

Expand Down Expand Up @@ -228,12 +228,12 @@ Employee/Companyにタッチされました

`after_initialize`コールバックは、そのクラスの新しいオブジェクトが初期化されるたびに呼び出されます。

NOTE: `find_by_*`メソッドと`find_by_*!`メソッドは、属性ごとに自動的に生成される動的なfinderメソッドです。詳細については[動的finderのセクション](active_record_querying.html#動的検索)を参照してください。
NOTE: `find_by_*`メソッドと`find_by_*!`メソッドは、属性ごとに自動的に生成される動的なfinderメソッドです。詳しくは[動的finderのセクション](active_record_querying.html#動的検索)を参照してください。

コールバックをスキップする
------------------

検証(validation)の場合と同様、以下のメソッドを使用するとコールバックをスキップできます
検証(validation)の場合と同様、以下のメソッドでコールバックをスキップできます

* `decrement`
* `decrement_counter`
Expand All @@ -247,9 +247,7 @@ NOTE: `find_by_*`メソッドと`find_by_*!`メソッドは、属性ごとに自
* `update_all`
* `update_counters`


重要なビジネスルールやアプリケーションロジックがコールバックに実装されている可能性があるので、これらのメソッドの使用には十分気をつけてください。コールバックをうかつにバイパスすると、データの不整合が発生する可能性があります。

重要なビジネスルールやアプリケーションロジックはたいていコールバックに仕込まれますので、これらのメソッドの利用には十分注意すべきです。コールバックをうかつにバイパスすると、データの不整合が発生する可能性があります。

コールバックの停止
-----------------
Expand All @@ -267,7 +265,7 @@ WARNING: `ActiveRecord::Rollback`や`ActiveRecord::RecordInvalid`を除く例外
リレーションシップのコールバック
--------------------

コールバックはモデルのリレーションシップを経由して動作できます。また、リレーションシップを使用してコールバックを定義することすらできます。1人のユーザーが多数のポストを持っている状況を例に取ります。あるユーザーが所有するポストは、そのユーザーがdestroyされたらdestroyされる必要があります。`User`モデルに`after_destroy`コールバックを追加し、このコールバックで`Post`モデルへのリレーションシップを経由すると以下のようになります。
コールバックはモデルのリレーションシップを経由して動作できます。また、リレーションシップを用いてコールバックを定義することすらできます。1人のユーザーが多数の投稿(post)を持っている状況を例に取ります。あるユーザーが所有する投稿は、そのユーザーがdestroyされたらdestroyされる必要があります。`User`モデルに`after_destroy`コールバックを追加し、このコールバックで`Post`モデルへのリレーションシップを経由すると以下のようになります。

```ruby
class User < ApplicationRecord
Expand All @@ -294,21 +292,21 @@ Post destroyed
条件付きコールバック
---------------------

検証と同様、与えられた述語による条件を満たす場合に実行されるコールバックメソッドの呼び出しを作成することもできます。これを行なうには、コールバックで`:if`オプションまたは`:unless`オプションを使用します。このオプションはシンボル、`Proc`、または`Array`を引数に取ります。特定の状況でのみコールバックが呼び出される必要がある場合は、`:if`オプションを使用します。特定の状況ではコールバックを呼び出してはならない場合は、`:unless`オプションを使用します
検証と同様、与えられた述語の条件を満たす場合に実行されるコールバックメソッドの呼び出しを作成することもできます。これを行なうには、コールバックで`:if`オプションまたは`:unless`オプションを使います。このオプションはシンボル、`Proc`、または`Array`を引数に取ります。特定の状況でのみコールバックが呼び出される必要がある場合は、`:if`オプションを使います。特定の状況ではコールバックを呼び出してはならない場合は、`:unless`オプションを使います

### `:if`および`:unless`オプションでシンボルを使用する
### `:if`および`:unless`オプションでシンボルを使う

`:if`オプションまたは`:unless`オプションは、コールバックの直前に呼び出される述語メソッド(訳注: trueかfalseのいずれかの値のみを返すメソッド)の名前に対応するシンボルと関連付けることができます。`:if`オプションを使用する場合、述語メソッドがfalseを返せばコールバックは実行されません。`:unless`オプションを使用する場合、述語メソッドがtrueを返せばコールバックは実行されません。これはコールバックで最もよく使用されるオプションです。この方法で登録することで、いくつもの異なる述語メソッドを登録して、コールバックを呼び出すべきかどうかをチェックすることができます。
`:if`オプションまたは`:unless`オプションは、コールバックの直前に呼び出される述語メソッド(訳注: trueかfalseのいずれかの値のみを返すメソッド)の名前に対応するシンボルと関連付けることができます。`:if`オプションを使う場合、述語メソッドがfalseを返せばコールバックは実行されません。`:unless`オプションを使う場合、述語メソッドがtrueを返せばコールバックは実行されません。これはコールバックで最もよく使われるオプションです。この方法で登録することで、いくつもの異なる述語メソッドを登録して、コールバックを呼び出すべきかどうかをチェックすることができます。

```ruby
class Order < ApplicationRecord
before_save :normalize_card_number, if: :paid_with_card?
end
```

### `:if`および`:unless`オプションで`Proc`を使用する
### `:if`および`:unless`オプションで`Proc`を使う

最後に、`:if`および`:unless`オプションで`Proc`オブジェクトを使用することもできます。このオプションは、1行以内に収まるワンライナーで検証を行う場合に最適です。
最後に、`:if`および`:unless`オプションで`Proc`オブジェクトを使うこともできます。このオプションは、1行以内に収まるワンライナーで検証を行う場合に最適です。

```ruby
class Order < ApplicationRecord
Expand All @@ -319,7 +317,7 @@ end

### コールバックで複数の条件を指定する

1つの条件付きコールバック宣言内で、`:if`オプションと`:unless`オプションを同時に使用することができます
1つの条件付きコールバック宣言内で、`:if`オプションと`:unless`オプションを同時に使えます

```ruby
class Comment < ApplicationRecord
Expand All @@ -345,7 +343,7 @@ class PictureFileCallbacks
end
```

上のようにクラス内で宣言することにより、コールバックメソッドはモデルオブジェクトをパラメータとして受け取れるようになります。これでこのコールバッククラスをモデルで使用できます
上のようにクラス内で宣言することにより、コールバックメソッドはモデルオブジェクトをパラメータとして受け取れるようになります。これで、このコールバッククラスをモデルで使えます

```ruby
class PictureFile < ApplicationRecord
Expand Down Expand Up @@ -380,7 +378,7 @@ end

データベースのトランザクションが完了したときにトリガされるコールバックが2つあります。`after_commit`と`after_rollback`です。これらのコールバックは`after_save`コールバックときわめて似通っていますが、データベースの変更のコミットまたはロールバックが完了するまでトリガされない点が異なります。これらのメソッドは、Active Recordのモデルから、データベーストランザクションの一部に含まれていない外部のシステムとやりとりを行ないたい場合に特に便利です。

例として、直前の例に使用した`PictureFile`モデルで、対応するレコードがdestroyされた後にファイルを1つ削除する必要があるとしましょう。`after_destroy`コールバックの直後に何らかの例外が発生してトランザクションがロールバックすると、ファイルが削除され、モデルの一貫性が損なわれたままになります。ここで、以下のコードにある`picture_file_2`オブジェクトが無効で、`save!`メソッドがエラーを発生するとします。
例として、直前の例に用いた`PictureFile`モデルで、対応するレコードがdestroyされた後にファイルを1つ削除する必要があるとしましょう。`after_destroy`コールバックの直後に何らかの例外が発生してトランザクションがロールバックすると、ファイルが削除され、モデルの一貫性が損なわれたままになります。ここで、以下のコードにある`picture_file_2`オブジェクトが無効で、`save!`メソッドがエラーを発生するとします。

```ruby
PictureFile.transaction do
Expand All @@ -389,7 +387,7 @@ PictureFile.transaction do
end
```

`after_commit`コールバックを使用することで、このような場合に対応することができます
`after_commit`コールバックを使えば、このような場合に対応できます

```ruby
class PictureFile < ApplicationRecord
Expand Down