我将举一个例子。
假设我将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>
答案 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 %>