什么应该是从控制器传递多个activerecord对象到视图的方法?

时间:2013-03-07 12:10:59

标签: ruby-on-rails ruby-on-rails-3 activerecord

我将举一个例子。

假设我将Category和Product作为我的两个模型,另一个ChosenProduct指定/处理它们之间的多对多关系。现在当我有某些类别时,我正在循环迭代这些类别获取相应的产品。如何在我的视图中访问这些多个产品对象?

我是Rails和MVC的新手,所以现在我在我的视图中执行此任务。但我认为这不应该是正确的方法。我该怎么做呢?

我按要求添加了我的观看代码。这对我来说很好。但我不认为它漂亮。

    <ul>
    <% @categories.each do |category| %>
    <li>
    <%= image_submit_tag("add.png", :height => "20", :width => '20', :name=>"add_product_to_#{category.id}", :id=>"add_product_to_#{category.id}" ) %>

    <%= category.category_name %>
    <% @chosen_products = category.chosen_products %>
    <% @chosen_products.each do |chosen_product| %>
        <% @products = Product.where(:id => chosen_product.product_id).all %>
        <% @products.each do |product| %>
            <ul>
                <li><%= product.product_name %>
                    <ul>
                        <li><%= image_tag("#{product.product_image_url}", :size => "200x200", :alt => "Can not load image!") %></li>
                        <li><%= product.product_image_url %></li>
                    </ul>
                </li>
            </ul>
        <% end %>
    <% end %>
<% end %>
</li>
</ul>

2 个答案:

答案 0 :(得分:0)

要迭代同一个类的对象集合,您必须使用partial,它将为您迭代您的集合。假设:

#controller
def index
 @categories = Category.all
end

然后,您需要在视图/类别中使用视图逻辑调用_category.html.erb的部分视图。让我们假设你的部分是:

    <div class="info">
       <p class="name"><%= category.name %></p>
</div>

部分将收到一组类别,它将自动迭代集合。因此,在部分中,您必须以单数形式调用对象,在本例中为category以引用正在呈现的实际对象。

然后在index.html.erb视图中,您只需渲染部分内容。

<%= render @categories %>

<%= render(partial: "categories/category", collection: @categories) || "<h1>There are no categories</h1>".html_safe %>

如果集合||为空,则第二个选项将呈现@categories旁边的内容。

答案 1 :(得分:0)

我假设您已将模型之间的关联定义为

应用程序/模型/ chosen_product.rb

class ChosenProduct < ActiveRecord::Base
  belongs_to :category
  belongs_to :product
end

应用程序/模型/ category.rb

class Category < ActiveRecord::Base
  has_many :chosen_products
  has_many :products, through: :chosen_products
end

所以在你的观点中,你可以做到

<ul>
  <% @categories.each do |category| %>
  <li>
    <%= image_submit_tag("add.png", :height => "20", :width => '20', :name=>"add_product_to_#{category.id}", :id=>"add_product_to_#{category.id}" ) %>

    <%= category.category_name %>
    <% category.products.each do |product| %>
      <ul>
         <li><%= product.product_name %>
            <ul>
               <li><%= image_tag("#{product.product_image_url}", :size => "200x200", :alt => "Can not load image!") %></li>
               <li><%= product.product_image_url %></li>
            </ul>
         </li>
      </ul>
    <% end %>
 </li>
<% end %>