0

我有一个应用程序,我在其中添加了一个边栏,其中列出了产品所属的所有类别。

该功能运行良好,但存在问题。

该代码仅扫描当前页面上的产品,而不是可用的实际类别。那是:

在我的应用程序中有 5 个产品类别(有),但在当前页面上只有 3 个产品。所以代码只显示了 3 个类别,而不是实际的 5 个。我该如何解决这个问题?这与实例变量有什么关系吗?

这是来自 application.html.erb 的代码

<div>
  <% a = [""] %>
    <h1>Categories</h1>
    <% @products.each do |product| %>
    <% a = a + [product.category] %>
    <% a = a.uniq %>        
  <% end %>

  <% a.each do |c| %>
     <p class="text-error"><%= c %></p>
  <% end %>
</div>

迁移文件..

class CreateProducts < ActiveRecord::Migration
   def change
     create_table :products do |t|
       t.string :name
       t.text :description
       t.date :delivery_date
       t.decimal :price

       t.timestamps
    end
   end
 end

 class CreateCommentsTable < ActiveRecord::Migration
  def up
    create_table :comments do |t|
      t.string :commenter
      t.text :body
      t.references :product

      t.timestamps
    end
    add_index :comments, :product_id
  end

  def down
  end
 end


 class AddCategoryToProducts < ActiveRecord::Migration
   def change
     add_column :products, :category, :string
   end
end

路线..

resources :products do
    resources :comments 
end

该代码位于https://github.com/abhishekdagarit/sample-app.git

可能需要你快速浏览一下来回答这个问题......

4

3 回答 3

1

如果您将单独的Category模型映射到categories表,那么Category.select(:name).uniq将返回唯一的类别。

在您的情况下,您在表格中有类别列。所以在那种情况下

Product.select(:category).uniq将返回具有唯一类别的产品列表。

所以现在你的模板会更干净:

<% for product in Product.select(:category).uniq %>
   <%= product.category %>
<% end %>
于 2012-09-26T06:11:14.083 回答
1

如果您想显示所有类别,只需执行

<% for category in Category.all %>
   <%= category.name %>
<% end %>

除非您尝试显示附加产品的类别

于 2012-09-26T02:47:37.450 回答
0

我假设您的侧边栏也使用与页面布局其余部分相同的请求进行处理(即没有单独的控制器操作)。

@products您很可能会在两个地方使用...一种用于获取主页的产品,另一种用于获取所有产品...您可能必须重命名它们并相应地对其进行修改...

如果这没有帮助,请显示更多代码......与渲染页面的支持相关......

于 2012-09-25T12:14:46.923 回答