2016-09-18 16 views
0

私は、複数のモデルを持っています。それらのインデックスの表示は、まったく同じコードとレイアウトを共有しています。複数のモデルで同じビューを共有するにはどうすればよいですか?

... /チョコレート/ index.html.erb

<h1 class="col-sm-12 head">Index Bases</h1> 
<hr> 
<% @chocolates.each do |chocolate| %> 

    <%= link_to chocolate do %> 
    <%= set_img(chocolate) %> 
    <% end %> 

    <ul> 
    <li><%= chocolate.name %></li> 
    <li><%= chocolate.position %></li> 
    </ul> 
    <hr> 

    <div> 
    <%= link_to chocolate do %> 
     <span class="glyphicon glyphicon-eye-open"></span> 
    <% end %> 
    <%= link_to edit_chocolate_path(chocolate) do %> 
     <span class="glyphicon glyphicon-edit"></span> 
    <% end %> 
    <%= link_to basis, method: :delete, data: { confirm: 'Are you sure?' } do %> 
     <span class="glyphicon glyphicon-remove"></span> 
    <% end %> 
    </div> 

<% end %> 
<hr> 
<%= link_to '+ Add New Chocolate', new_chocolate_path %> 

... /お菓子/ index.html.erb

<h1 class="col-sm-12 head">Index Bases</h1> 
<hr> 
<% @sweets.each do |sweet| %> 

    <%= link_to sweet do %> 
    <%= set_img(sweet) %> 
    <% end %> 

    <ul> 
    <li><%= sweet.name %></li> 
    <li><%= sweet.position %></li> 
    </ul> 
    <hr> 

    <div> 
    <%= link_to sweet do %> 
     <span class="glyphicon glyphicon-eye-open"></span> 
    <% end %> 
    <%= link_to edit_sweet_path(sweet) do %> 
     <span class="glyphicon glyphicon-edit"></span> 
    <% end %> 
    <%= link_to sweet, method: :delete, data: { confirm: 'Are you sure?' } do %> 
     <span class="glyphicon glyphicon-remove"></span> 
    <% end %> 
    </div> 

<% end %> 
<hr> 
<%= link_to '+ Add New Sweet', new_sweet_path %> 

そして、より多くのモデルがあること同じレイアウトを共有していると私は自分自身を繰り返し続けていると思ったので、変数を使って共有部分を作成し、そのレイアウトを使って各ビューをレンダリングしました。

... /お菓子/ index.html.erb

<% render 'shared/indexGrid', dist: @sweets%> 

... /ビュー/共有/ _indexGrid.html.erb

<% title = dist.class.name.underscore.tr('_', ' ').pluralize.split.map(&:capitalize).join(' ') %> 
<% sing = dist.class.name.underscore %> 

<h1>Index <% title %></h1> 
<hr> 

<% dist.each do |sing| %> 

    <%= link_to sing do %> 
    <%= set_img(sing) %> 
    <% end %> 

    <ul> 
    <li><%= sing.name %></li> 
    <li><%= sing.position %></li> 
    </ul> 
    <hr> 

    <div> 
    <%= link_to sing do %> 
     <span class="glyphicon glyphicon-eye-open"></span> 
    <% end %> 

    <%= link_to send("edit_#{sing.class.name.underscore}_path", sing) do %> 
     <span class="glyphicon glyphicon-edit"></span> 
    <% end %> 

    <%= link_to sing, class: 'square red', method: :delete, data: { confirm: 'Are you sure?' } do %> 
     <span class="glyphicon glyphicon-remove"></span> 
    <% end %> 
    </div> 
<% end %> 
<hr> 
<%= link_to "+ Add New #{title}", send("new_#{sing.class.name.underscore}_path"), { class: 'btn btn-success btn-block'} %> 

しかし、それはなかったの私は思っていた値を返すが、"active_record/relation"を返します。 編集ビューでこれまでと同じ方法を試しましたが、それはdist: @sweetで機能しました。

私はレイアウトを使用することを考えましたが、他のインデックスビューに非常に似ている大きなまとまりのコードを私に残しました。

  • 何私のコードで間違っているとどのようにそれを修正するために...

    は、私はあなたと私の試みを共有している、との質問がありますか?

  • このアプローチはDRYコードの良い習慣と考えられますか?もしそうでなければ、複数のモデルと同じビューコードを共有する最良の方法は、それらのモデルがほぼ同じコードとレイアウトをほぼ共有している場合です。

答えて

1

あなたはmodel_name

を試すことができます
<% title = dist.model_name.to_s.underscore.tr('_', ' ').pluralize.split.map(&:capitalize).join(' ') %> 

以上さらに

<% title = dist.model_name.human.pluralize.titleize %> 

また、あなたに必要なものを教えてください。

とルートをクリーンアップするために、あなたはPolymorphicRoutes

http://api.rubyonrails.org/classes/ActionDispatch/Routing/PolymorphicRoutes.html

を見ることができますので、代わりに

link_to send("edit_#{sing.class.name.underscore}_path", sing) 

のあなたはきれいにする必要があり

link_to 'Edit, edit_polymorphic_path(sing) 

のようなものを使用することができますあなたの共有インデックスページをきれいにしてください。

タイトルを返す(たとえば)ヘルパーを作成することもできます。 100%必要ではありません。

- パート2 -

いいですか?多分?それはどのように非回答です。多くの要因があります。これらのモデルのすべてが常にまったく同じになる可能性はどれくらいありますか?後で別のものを作ることはどれくらい難しく/多くの仕事をするでしょうか?基本的に同じインデックスのページが常に同じインデックスページを持つようなモデルがたくさんある場合、私はおそらくこれに似たことをするでしょう。自動的にビューなどを生成するエンジン/宝石/プラグインでは、同じ種類のアイデアが使用されます。だから私は彼らがいつも同じであると思っています、そして、あなたはいつも同じように見えるようにしています。このようなものは全く問題ありません。

@sweetsのようなものを見るときの部分集合のコレクションは、モデルの単一のインスタンスではありません。おそらくActiveRelationです。だからmodel_nameactive_modelから呼び出すことはあまり役に立たないでしょう。パーシャルのレールガイドを見ると、render @collectionと表示されます。これは基本的に、コレクション内の各オブジェクトの繰り返しだけで、あなたのためのmodel_nameを見て、それを対応する部分に渡してレンダリングします。

個のオブジェクトが含まれている@sweetsのコレクションがある場合、そのコレクションは繰り返し処理されます。 _sweet.html.erb(部分的な位置を特定するための通常の規則に従って)をレンダリングします。これにより、<% dist.each do |sing| %>ブロックを<%=render dist%>に調整して、各モデルに部分的なものがあることを確認して、すべて異なる方法でレンダリングすることができます。

+0

偉大な回答をいただきありがとうございました。質問はまだ答えられていないので、これはそのようなことを行うための最良のアプローチだと思いますか?賢明なやり方のようなモデル間で意見を共有することはまったく正しいと思いますか?私は 'Partial'のドキュメントを見ていましたが、私は疑問に思った' collection'というものを見つけました。 '@ sweets.model_name'を実行したときに、named routsのように多くの値を持つハッシュを返しました私がそれが助けることができるかどうか疑問に思った。 –

+0

はもう少し情報を追加しました。うまくいけば助けてくれるでしょう... – Doon

+0

あなたのおかげで、最後の段落は非常に役に立ちました –

0

簡単な解決策は、パラメータ

<% render 'shared/indexGrid', dist: @sweets, class_name = "Sweets"%> 

それともソースであるかを認識することができます何かを追加するとclass_name含むパーシャルを使用することです....

関連する問題