我想声明如下#34;如果您的产品属于类别,或者您现在属于此类别,则类别具有不同的<div>
标记&#34;。
我尝试过一些变种,但是我收到了这个错误:
<undefined method 'id' for #<Category::ActiveRecord_Relation:XXX>
这是我的aplication.html.erb代码:
<% category = Category.all %>
<% product = Product.all %>
<% category.each do |category_c| %>
<% if category_c.id == product.category.id or category_c.id == category.id then %>
<div class="current">
<%= link_to category.name, category %>
</div>
<% else %>
<div class="category_link">
<%= link_to category.name, category %>
</div>
<% end %>
<% end %>
我该怎么做才能让它发挥作用?
答案 0 :(得分:1)
所以你的问题存在是因为你在.id
上调用了category
,这是你数据库中所有Category
模型的集合,因为你在这里分配了它<% category = Category.all %>
id
var h = $( window ).height();
$('.bg').css({
'height' : h,
'background-size' : "auto" + h
})
1}},没有(set! z 10)
与之关联。
答案 1 :(得分:0)
如前所述 - 您正在将一个ID [{1}}与一组类别进行比较 - 这些类别无效。
现在,对于初学者来说......养成以复数形式命名成套事物的习惯是很好的...这将使下次更明确地突出这种错误。在这种情况下,您的代码应调整为:
category_c.id
在尝试显示指向当前类别的链接时,您可能会注意到还使用变量<% categories = Category.all %>
<% products = Product.all %>
<% categories.each do |category_c| %>
<%# note, this line will still break at this stage %>
<% if category_c.id == product.category.id or category_c.id == categories.id then %>
<div class="current">
<%= link_to category_c.name, category_c %>
</div>
<% else %>
<div class="category_link">
<%= link_to category_c.name, category_c %>
</div>
<% end %>
<% end %>
(这是一组类别)这是错误的,因为您应该显示单个类别。
将类别集命名为category
会使您在意外使用集时更明显地表示单个类别(反之亦然)...所以坚持习惯。
如果只有一个,使用单数(例如类别/产品)如果有一组,则使用复数(例如类别/产品)
其次 - 如果您想要的是查看产品的类别是否属于类别集...那么您需要使用稍微不同的比较方式:
categories
休息 - 因为你试图打电话给#34; id&#34;在一组类别上...... 但是一组类别没有一个id ... 只有集合中的每个类别都有一个id。
而是首先尝试取出类别的ID ...然后判断该类别是否包含
if category_c.id == categories.id
第三......通常最好只将if / else放在最小的部分 - 只根据你的条件改变部分。
如果您查看if / else - 无论您的条件是真还是假,该类别和div的链接都是相同的。唯一不同的部分是你在div中使用的css类......所以只需把if / else放在那个部分就像这样:
if categories.map(&:id).include?(category_c.id)
注意:这有点难看......所以让我们把这个条件放到一个变量中并使用它:
<% categories = Category.all %>
<% products = Product.all %>
<% categories.each do |category_c| %>
<div class="<% if category_c.id == product.category.id or category_c.id == categories.id then %>current<% else %>category_link<% end %>">
<%= link_to category_c.name, category_c %>
</div>
<% end %>
第四。
除非你知道区别是什么...... 始终使用<% categories = Category.all %>
<% products = Product.all %>
<% categories.each do |category_c| %>
<% category_matches = category_c.id == product.category.id or category_c.id == categories.id %>
<div class="<%= category_matches ? 'current' : 'category_link' %>">
<%= link_to category_c.name, category_c %>
</div>
<% end %>
和&&
而不是||
和and
- 你可以稍后研究这些差异如果你喜欢......但即使是红宝石专业人士也会使用or
和&&
代替||
和and
- 所以直到你知道为什么要使用其他的...只需遵循标准做法即可:
or
现在 - 我认为我们真的不需要<% categories = Category.all %>
<% products = Product.all %>
<% categories.each do |category_c| %>
<% category_matches = category_c.id == product.category.id || category_c.id == categories.id %>
<div class="<%= category_matches ? 'current' : 'category_link' %>">
<%= link_to category_c.name, category_c %>
</div>
<% end %>
变量......它在其他任何地方都没有使用过......所以只需要摆脱它。
categories
所以最后的事情是....你有一套产品......但你要与单个产品的id进行比较...... 我不知道你是如何从一组产品到一个单一的产品 - 你不是在整套产品上进行迭代......你必须要想一想如何找到你想要的产品< em>哪个产品与此代码相关。我把它作为练习留给你。