1

Draper は、コントローラ メソッドの最後でオブジェクトを装飾するか、代わりにそれらのdecorates_associatedメソッドを使用して自動的に装飾することを推奨しています

ビューが受け取るものを明示的に宣言するというアイデアが気に入っています (Rails の残りの部分はこのようには機能しませんが、それでもいい感じです)。したがって、コントローラーの最後ではなく、ビューの上部にあるオブジェクトを装飾することをお勧めします。

したがって、users#show でやりたいこと:

- @user = @user.decorate

%h1= @user.full_name
%p= @user.description

このようにユーザーコントローラーで装飾する代わりに

class UsersController < ApplicationController
  ...
  def show
    @user = User.find(params[:id]
    @user = @user.decorate
  end
end

このように物事を行うことにはキャッシングの問題があると思いますが、それはいい感じです。何か足りない場合はどうすればよいですか?私が提案しているのは悪い習慣ですか?

4

1 に答える 1

2

draper は従来の MVC ロジックを少し混乱させるため、これは非常に良い質問だと思います。リンクした draper README を読むことができるように、draper は、乱雑なヘルパー定義をより構造化されたアプローチに置き換えることを目指しています。

しかし、これは MVC のどの部分に属しますか? Draper はオブジェクトをデコレートすると主張していますが、これはソフトウェア アーキテクチャの表現部分に関連付けることができるため、 Modelにも属さず、実際にはControllerにも適合しません。

@Damien Roche のコメントに続いて、それは実際にはViewにも適合しません。これは、通常、テンプレート ファイルがオブジェクトに対してそのプロパティを表示する以外のアクションを実行することを期待しないためです。また、テンプレートでヘルパーを定義しません。 ?

私の考えでは、ドレーパーは、ビューに到達する前に、コントローラーが表示するために選択したオブジェクトを拡張する仲介者のように考えることができます。そのロジックに従って、私はコマンドの使用を好みます。なぜなら、それはコントローラーとビューの間decorate_assignedに装飾を配置するからです。

追加の注意:「受け取りたいものを宣言するビュー」の意味はわかりますが、これは、通常、アプリケーション全体のモデルごとに 1 つの装飾を定義するという事実とは対照的です。そのため、「特別なリクエスト」の余地はあまりありません

于 2014-06-10T12:37:31.717 に答える