2.4.x.Search§アクション合成この章では、アクションの一部機能を汎用的な形で切り出して定義する方法を紹介していきます。§アクション合成の基本アクションの呼び出しをロギングする、簡単なロギングデコーレータの例から始めてみましょう。一つめの方法は、アクション自体を定義する代わりに、アクションを生成するためのヘルパーメソッドを提供することです。}}このヘルパーメソッドは次のように利用できます。ボディパーサーしか利用できません。そこで、次のようなヘルパーメソッドも定義してみます。}}これは次のように利用できます。ラッパーとして定義する方法もあります。action.parser}これを利用すると、他のアクション値をラップすることができます。}}この方法ではラップされたアクションのボディパーサーがそのまま再利用されるため、次のような記述が可能です。クラスを定義せずに全く同じ機能を持つラッパーを記述することもできます。以下は既存のアクションをラップしてセッション変数を追加する例です。次は、認証を伴うアクションという、より複雑ですが一般的な例を見てみましょう。ここでの問題は、認証されたユーザだけをラップしたアクションへ通すことです。}このヘルパーメソッドは次のように利用することができます。アクションの実装が用意されています。関数だとされていましたが、完全には正しくありません。トレイトは以下のように定義されています。オブジェクトをアクションのコードに渡し、アクションのコードの結果を返します。関数だと考えることができます。トレイトは、リクエストボディをパースする前にリクエストヘッダ情報の取得を行う必要があるコードを、アクションと合成する時に有効です。ステータスをリクエストボディをパースせずに返しています。次は、先ほどの例を、アクションを丸ごとラップせずに記述してみましょう。}}これは次のように利用します。指定することはできない、ということです。これはカリー化を使うと解決できます。}}これは次のように利用することができます。(二つの引数をひとつにまとめる、とも言い換えられます)。}}これを利用すると、次のような記述ができます。request.user.name)}ボディパーサーを指定できるようにすると、この実装はもっと一般的な形に拡張することができます。チームによってメンテナンスされているものではありません。確認することができます。読んで、お気軽にプルリクエストを送ってください。