2010-10-31 4 views
23

Creo que lo que estoy tratando de hacer es bastante simple, y realmente no estoy seguro de por qué esto no está funcionando. Estoy usando Rails 3.Ruby/Rails - .ete iterator está imprimiendo una matriz completa al final del ciclo

Esencialmente, estoy tratando de seleccionar los valores distintos de una columna en un modelo existente, e imprimirlos todos. En su mayor parte, esto funciona, pero el .each loop en mi vista también termina imprimiendo todo el conjunto al final del ciclo. (

que un modelo llamado Lugares de interés, y cada atracción tiene una categoría (en este momento la categoría está codificada en la base de datos para simplificar).

Este es el modelo de atracción y un método de clase "all_categories" definidos .. .

class Attraction < ActiveRecord::Base 

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

end 

Este es el controlador de atracción

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

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

Este es el código en mi opinión de que está causando problemas - no es ciencia de cohetes, ju st un simple iterador, ...

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

Bastante simple, ¿no? Todo esto está bien correr, pero esto es lo que veo cuando ese segmento de código es ejecutado:

Architecture 
Art 
Fashion 
Music 
[#<Attraction category: "Architecture">, #<Attraction category: "Art">, #<Attraction category: "Fashion">, #<Attraction category: "Music">] 

¿Por qué es la matriz al final impresa? Todo lo que quiero es una lista de las categorías:

Architecture 
Art 
Fashion 
Music 

Obviamente, soy nuevo a Ruby/Rails, y he tratado de buscar por todas partes para una solución a esta. ¿Hay algo obvio que me estoy perdiendo?

Agradecer cualquier ayuda.

Respuesta

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

solo deseas los efectos secundarios en el bloque del método #each, que no quieren que la interpolación del valor devuelto.

+0

¿Es exactamente la misma línea? – shingara

+4

'<% =' vs '<%' ... – DigitalRoss

+0

¡Muchas gracias! – tarunsachdeva

1

es porque es lo que sucede cuando se hace

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

Es crear un objeto de atracción con atributo de definir por su campo. Usted puede hacer

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

Esto también funciona, aunque tengo que implementar la solución sugerida por DigitalRoss para evitar la impresión de matriz al final. ¡Gracias! – tarunsachdeva

Cuestiones relacionadas