0

使用事例:

次の例を考えてみましょう。

Class Foo < ActiveRecord::Base
 belongs_to :user
 attr_accessible :title
end
Class User < ActiveRecord::Base
 has_many :foo
 attr_accessible :name
end

ログインしたユーザーが Foo を作成すると、そのユーザー レコードに関連付けられます。ログインしていないユーザーが作成した Foo は、どのユーザーにも関連付けられません。これは単なる例であり、私のアプリケーションには多くの同様の使用例があります。

問題:

問題は、私のビュー コードが多数の if 条件や次のような三項演算で乱雑になることです。

<% foo.user ? foo.user.name : "not set"%>

現在の解決策:

これを克服するために、null オブジェクト デザイン パターンを使用しています。User クラスは NullUser オブジェクトを定義します (その名前は「未設定」に設定されます)。foo オブジェクトにユーザー オブジェクトがない場合、NullUser オブジェクトが返されます。nil チェックを行う Foo クラスのユーザー メソッドをオーバーライドしました。

質問:

  1. これに対するより良い解決策はありますか?
  2. Rails アクティブ レコード モデルの null オブジェクト パターンを容易にする gem はありますか。
4

2 に答える 2

1

これは、ユーザー オブジェクトをラップするデコレータの完璧なケースのように思えます。何を表示するかに関するすべてのロジックはそこに入ります。ビューが気にするのは、オブジェクトの名前を吐き出すことができるということだけです。

Draperは、Rails のデコレータに適しています。

そして、適切な手段としてRailscast

于 2013-04-25T10:20:23.897 に答える