无法配置我的If ... else语句

时间:2015-12-09 18:10:27

标签: ruby-on-rails ruby

我想声明如下#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 %>

我该怎么做才能让它发挥作用?

2 个答案:

答案 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>哪个产品与此代码相关。我把它作为练习留给你。