2

RoRに慣れるためにサンプルサイトを構築しています。「Railsを使ったアジャイルWeb開発」という本をある程度まで読んで、今は実験して参考にしていますが、問題の答えが見つかりませんでした。

私は2つの興味のあるモデルを持っています。1つはスーパーマーケットチェーンで、もう1つはスーパーマーケットです。明らかに、スーパーマーケットチェーンにはたくさんのスーパーマーケットがあります。私がやろうとしているのは、単一のスーパーマーケットチェーンの基本的な「表示」ページを取得して、それに属するスーパーマーケットのリストを表示することです。

また、繰り返したくなかったので(明らかに非常に悪いことなので)、「render」を使用して、スーパーマーケットのindex.html.erbをsupermarketchain/show.html.erbページに挿入できると思いました。 :

<%= render :template => 'supermarkets/index' %>

ただし、ページでの出力はゼロでした。

私の次のアプローチは、これを部分的にすることでした:

<div id="supermarket-list">
  <h1><%= I18n.t "supermarket.title" %></h1>

  <table>
    <% for s in @supermarkets %>
    <tr class="<%= cycle('list-line-odd', 'list-line-even') %>">
        <td> 
            <%= s.supermarketchain.name %>
        </td>
        <td>
            <%= s.address %>
        </td>
        <td class="list-actions">
            <%= link_to I18n.t("general.show"), s%> <br/>
            <%= link_to I18n.t("general.edit"), edit_supermarket_path(s) %> <br />
            <%= link_to I18n.t("general.delete"), s, :confirm => I18n.t("general.confirmation"), :method => :delete %>
        </td>
    </tr>
    <%end%>
  </table>
</div>

そして、以下を使用します。

<% @supermarkets = Supermarket.all %>

<%= render :partial => 'supermarkets/supermarket' %>

スーパーマーケットチェーンのショーページに挿入します。

私が疑問に思っているのは、これが良い習慣であるかどうかです。表示したいのがスーパーマーケットのコントローラーの「インデックス」アクションの正確な結果である場合、パーシャルで使用するために変数を初期化するのは奇妙に思えます。コメント?

必要な説明を求めてください。

4

4 に答える 4

1

Railsでは、他のコントローラーからパーシャルをレンダリングすることはまったく問題ありません。通常、パーシャルが実際には特定のコントローラーに属していない場合は、に配置されapp/views/sharedます。この場合、私は思うが、スーパーマーケットのコントローラーで部分的に保つことは理にかなっている。

supermarkets/_supermarket.html.erb両方のセクションで同じパーシャルを使用する方法は次のとおりです。パーシャルでは、ローカル変数をsupermarket使用できます。

# supermarketchain/show.html.erb
<%= render :partial => "supermarkets/supermarket", :collection => @supermarketchain.supermarkets %>

# supermarkets/show.html.erb
<%= render :partial => "supermarket", :object => @supermarket %>
于 2010-01-04T05:43:04.737 に答える
0

代わりに、

<%= render :partial => 'supermarket', :collection => Supermarket.all, :as => :s %>

パーシャルは、変数名を使用して、スーパーマーケットごとに1回呼び出されますs

于 2009-12-23T23:03:07.303 に答える
0

私はこれに苦労しましたが、パーシャルをレンダリングする方法としては実際にはサポートされていないことがわかりました。通常、Rails開発者の規則を信頼しているので、おそらくそれは良い考えではないと判断しました。

そこでテンプレートを使用してもうまくいくとは思いません。おそらく使用できますがrender_to_string、これはハックのようであり、将来的にはさらに頭痛の種になる可能性があります。

また、コレクションをレンダリングする場合は、ビューではなく、コントローラーアクションでインスタンス変数を設定するのが最善の方法です。

def index
  @supermarkets = Supermarket.all
end

そして、ビューindex.html.erbで、次のように呼び出します。

<%= render @supermarkets %>

次に、配列のすべてのメンバーを反復処理し、views/supermarkets/_supermarket.html.erbそれぞれに対してレンダリングします。「スーパーマーケット」は、パーシャルで使用可能な現在のメンバーです。

<%= supermarket.name %><br />
<%= supermarket.address %>

これらのレンダリングの多くのパフォーマンスについて心配していますが、ログと時間を監視するだけです。レンダリングの時間と元のビューで手動で実行する時間はほぼ同じだと思います。

于 2009-12-23T23:46:28.213 に答える
0

さて、これが正しければ、チェーンのリストがあり、各チェーンにはスーパーマーケットのリストがありますよね?2つのモデル間に関連付けの設定はありますか?あなたが持っているなら、それは物事を単純化するだけだからです。この場合、モデルの名前を「supermarketchains」から「chain」に変更するとします(混乱を解消します)。次のようにモデルを関連付けることができます>

has_many:スーパーマーケット

そしてスーパーマーケットモデルで。

所属する:チェーン

そこから、それは次のようなループの問題です。

<% if chain.supermarkets.count > 0 %>

#Do stuff.

<% end %>

とはいえ、その情報を取得するようにコントローラーをセットアップしていない場合は、余分な作業が必要になる可能性があります。

于 2009-12-24T00:25:57.760 に答える