11

いくつかの推奨事項 [1] を使用することをお勧めします

<%= current_user.welcome_message %>

それ以外の

<% if current_user.admin? %>
  <%= current_user.admin_welcome_message %>
<% else %>
  <%= current_user.user_welcome_message %>
<% end %>

しかし問題は、コードのどこかに決定ロジックが必要なことです。

私の理解では、コントローラーをよりクリーンにするよりも、決定を下すtemplate方が優れています。controllerそれが正しいか?

これを処理するより良い方法はありますか?

http://robots.thoughtbot.com/post/27572137956/tell-dont-ask

4

10 に答える 10

11

これを不思議に思うのはあなたが初めてではありません。ビューとコントローラーにロジックがほとんどまたはまったくなく、モデルがプレゼンテーションに依存しない場合、プレゼンテーション ロジックはどこに属しますか?

デコレータ パターンと呼ばれる古い手法を使用できることがわかりました。アイデアは、プレゼンテーション ロジックを含む別のクラスでモデル オブジェクトをラップすることです。このラッパー クラスは、デコレータと呼ばれます。デコレーターは、モデルをプレゼンテーションから分離したまま、ビューからロジックを抽象化します。

Draperは、デコレーターを定義するのに役立つ優れた gem です。

あなたが提供したサンプルコードは、次のように抽象化できます。

コントローラーでビューにデコレーターを渡し@user = UserDecorator.new current_userます。

デコレータは次のようになります。

class UserDecorator
  decorates :user

  def welcome_message
    if user.admin?
      "Welcome back, boss"
    else
      "Welcome, #{user.first_name}"
    end
  end
end

そして、あなたのビューは単に含まれます@user.welcome_message

モデル自体には、メッセージを作成するロジックが含まれていないことに注意してください。代わりに、デコレータはモデルをラップし、モデル データを表示可能な形式に変換します。

お役に立てれば!

于 2012-08-02T05:50:30.990 に答える
5

これにはヘルパーを使用します。ロケールに基づいてウェルカム メッセージを翻訳する必要があるとします。

app/helper/user_helper.rb書き込みでは

module UserHelper

  def welcome_message(user)
    if user.admin?
      I18n.t("admin_welcome_message", :name => user.name)
    else
      I18n.t("user_welcome_message", :name => user.name)
    end
  end 

end

そしてあなたの見解では、あなたはただ書くことができます

<%= welcome_message(user) %>

デコレーター/プレゼンターは非常にクリーンなオブジェクト指向のアプローチを提供しますが、ヘルパーを使用する方がはるかに簡単で十分であることに注意してください。

于 2012-08-02T13:52:40.563 に答える
4

いいえ、ユーザークラスにもコントローラーにも条件はまったく必要ありません。ブログ投稿の例の要点は、古き良き OO 設計であるポリモーフィズムに言及することです。

# in application_controller for example
def current_user
  if signed_in?
    User.find(session[:user_id])
  else
    Guest.new
  end  
end

#app/models/user.rb
class User
   def welcome_message
     "hello #{name}"
   end
end

#app/models/guest.rb
class Guest
  def welcome_message
    "welcome newcomer"
  end
end

…お分かりですね。

モデルにプレゼンテーションのみのメソッドを散らかす代わりに、プレゼンターとして機能するデコレーターを作成してください。

require 'delegate'
class UserPresenter < SimpleDelegator
  def welcome_message
    "hello #{name}"
  end
end

そして今、current_user次のようになります。

# application_controller
def current_user
  if signed_in?
    UserPresenter.new(User.find(session[:user_id]))
  else
    Guest.new
  end
end
于 2012-07-29T12:57:36.417 に答える
3

ユーザー モデルを装飾し、welcome_message を直接追加します。はい、これにはある時点である種の条件文が含まれる場合があります。

http://robots.thoughtbot.com/post/14825364877/evaluating-alternative-decorator-implementations-in

于 2012-07-29T12:19:04.597 に答える
1

私の意見では、テキストだけが変更される場合、それはビューに属していません。ページを再構築する必要がある場合は、それがプレゼンテーションロジックです。これは、データが違うだけです。

于 2012-07-27T04:20:18.547 に答える
1

答えについては、Presenters の railscasts エピソードをご覧ください。

于 2012-07-30T09:15:27.950 に答える
1

ビューのロジックは維持するのが難しいため、ビジネス ロジックをモデルに配置し、すべてのビュー ロジックをヘルパーに配置する必要があります。

コードをオブジェクト指向にしたい場合は、デコレーター (オブジェクト指向のヘルパー) を利用します。

最良の例: https://github.com/jcasimir/draper

于 2012-08-02T10:21:34.407 に答える
0

current_user.welcome_message_app/helpers/application_helper.rb_ に定義するコードを配置すると、アプリケーションレイアウトでレンダリングされた任意のビューからアクセスできるようになります。

別のオプションは、特定のビューまたはコントローラーに必ずしも関連付けられていないカスタムヘルパー モジュールを定義し (以下にリンクしたビデオを参照)、includeその機能を持たせたいビュー/コントローラーのモジュール内にそれを定義することです。

これは白か黒かということではありません。しかし、あなたが説明したことから、これはあなたのapplication_controller.rbに固執するのが邪魔なコードであり、独自のコントローラーを正当化する機能を備えたコードではないように聞こえます.最も効果的で効率的なオプションは、カスタムヘルパーモジュールを作成することです.その機能を持たせたいヘルパーにそれを含めます。とはいえ、これは最終的にはアプリケーションの設計者 (つまり、あなた) が決定する必要がある判断です。

これは、2011 年 5 月のヘルパー モジュールの概要をまとめた優れた記事です。

カスタムヘルパー モジュールの概要を示す RailsCast を次に示します(つまり、特定のコントローラーまたはビューに必ずしも関連付けられていないモジュールのようにカスタム)。短く、甘く、そして要点。

于 2012-07-29T12:08:07.667 に答える
0

実際のViewインスタンスを用意することをお勧めします。MVP の Rails パロディ (違いがあります。調べてください) は、残念ながら、ビューがテンプレートであると偽っているようです。それは間違いです。

ビューには、MVC および MVC にインスパイアされたパターンのプレゼンテーション ロジックが含まれていると想定されています。また、複数のテンプレートを操作し、モデル層からの状態と情報を表すためにどのテンプレートを使用するかを決定することも想定されています (モデルは ORM インスタンスではなく層です)。

というわけで、質問に答えると、プレゼンテーション ロジックはコントローラーには存在しません。

于 2012-08-03T23:47:37.700 に答える
0

そのためのヘルパー メソッドを定義できます。モデルでウェルカム文を作成するのは良い考えではないと思いますが、コントローラーでも同様です。しかし、ビューをコードからきれいにするように努めるべきです。そのためにヘルパーを使用できるのであれば、そうするべきです。

于 2012-08-01T19:13:32.763 に答える