Ruby / Rails - .each迭代器在循环结束时打印整个数组

25

我认为我尝试做的事情非常简单,但我真的不确定为什么这不起作用。我正在使用Rails 3。

基本上,我只是想从现有模型中选择某个列中不同的值,并将它们全部打印出来。大部分情况下,这是可以实现的,但是在我的视图中,每次循环都会将整个数组一并打印出来。

我有一个名为Attractions的模型,每个景点都有一个类别(现在为了简单起见,类别被硬编码在数据库中)。

这是Attraction Model和定义的一个类方法“all_categories”...

class Attraction < ActiveRecord::Base

  def self.all_categories
    Attraction.select("DISTINCT category")
  end

end

这是吸引力控制器

class AttractionsController < ApplicationController
  def index
    @categories = Attraction.all_categories
    @attractions = Attraction.find(:all)
  end

  def show
    @attraction = Attraction.find(params[:id])
  end
end

这是我视图中引起问题的代码 - 没有什么高深技术,只是一个简单的迭代器...

  <%= @categories.each do |c| %>
    <%= c.category %><br/>
  <% end %>

很简单,对吧?这段代码一切正常运行,但是当运行该代码段时,我看到的是:

Architecture
Art
Fashion
Music
[#<Attraction category: "Architecture">, #<Attraction category: "Art">, #<Attraction category: "Fashion">, #<Attraction category: "Music">]
为什么数组会被打印出来?我只想要一个类别列表:
Architecture
Art
Fashion
Music

显然,我对Ruby/Rails很陌生,并且我已经尝试了各种方法来解决这个问题。是否有什么显而易见的问题我忽略了?

非常感谢任何帮助。

2个回答

75
# Change this line with an =:
<%= @categories.each do |c| %>
# ...to this:
<%  @categories.each do |c| %>

你只需要在#each方法的块中获得副作用,而不需要插值返回值。


5
我遇到了同样的问题,最后放弃了,于是通过谷歌搜索我的问题,希望能出现一个Stack Overflow的帖子。这解决了我的问题。在我的情况下,我使用的是HAML,所以将“=”更改为“-”解决了我的问题。谢谢。 - LondonGuy

1

这是因为这就是你执行时发生的事情

def self.all_categories
  Attraction.select("DISTINCT category")
end

它创建一个吸引对象,其属性由您的字段定义。您可以这样做

def self.all_categories
  Attraction.select("DISTINCT category").map(&:category)
end

这也可以工作,尽管我必须实现DigitalRoss建议的解决方案来避免数组在结尾处打印。谢谢! - tarunsachdeva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接