0

私のアプリのすべてshowのアクションには、すべてのモデルに対して同じテンプレートがあります(これは管理者ポータルタイプのインターフェイスです)。show.html.erbこれらのモデルはすべて継承していると思います。

コントローラーはすべて、ExplicitResourcesを使用するため、親ビューに表示resourceされているモデルの属性を表示するために使用する、などのいくつかのヘルパー変数にアクセスできます。resource.attributes

私がやりたいのは、各モデルに表示されている属性をホワイトリストに登録することです。これを行うには2つの方法を考えました...1つ目は、モデルの継承元のクラスでメソッドを定義することです。たとえば、メソッドが呼び出さattr_visibleれ、モデルの各属性を定義します。このアプローチが気に入らない理由は、モデルにビューロジックが多すぎるためです。むしろ、モデルにビューを提供し、ビューに表示内容を決定させたいと思います。

2番目のアプローチは、この質問の内容です。ファイルを作成し、表示/app/views/users/show.html.erbするユーザーの属性を設定したいのですが、次のように言います。

@attributes = [:name, :email, :etc]

次に、この質問の冒頭で説明した親ビューにそれらを渡します。そのビューは、ループして@attributes必要な属性を表示できるようになります。

superビューから「」タイプのメソッドを使用することはできますか?ビューの継承について私が読んだすべてのことは、ビューがディレクトリ構造内のどこにあるかに基づいてロードされ、その後は運が悪いことを示唆しています。

編集:私は自分がやりたいことをやった。/ app / views/usersディレクトリに次のような部分的な_show.html.erbを定義しました。

<% @attributes = ['name', ...] %>

そして、親ビューで、<%= render "show" %>ループする前に呼び出します@attributes。これは機能しますが、呼び出したときに実際には何もレンダリングしていないため、不格好に感じますrender。もっと良い方法はありますか?

4

1 に答える 1

0

これにはプレゼンターを使用できます。モデルに「ビュー」ロジックを追加するには、このタイプのオブジェクトを使用する方が適切です。ドレーパーを見てください。

リソースが装飾されたら、電話visible_attributesなどで電話をかけることができます。もちろん、リソースごとにそのメソッドを実装する必要があります。

ビューの継承は、ビューをレンダリングするときではなく、ビューを探すときに機能します。元のプラグインの実装を見てください。

もう1つの方法は、show親ビューを呼び出しrenderresourceクラスのパーシャルをいくつか作成することです。

Railsビューをよりよく理解するために、Railsビューをお勧めします:美しく保守可能なユーザーエクスペリエンスを作成する

于 2012-11-07T16:47:39.330 に答える