2012-04-10 9 views
5

He estado buscando a través de Desbordamiento de pila durante algunas horas, pero ninguna de las preguntas relacionadas parece aplicarse a mi problema.¿Variable de instancia adicional en el controlador no está a la vista?

Soy nuevo en Rails, con este es mi primer proyecto real, y puedo confundir un poco la configuración de MVC. Estoy intentando asignar la variable de instancia @stars mientras que en una acción de la searches_controller.rb:

def create 
    @search = Search.new(params[:search]) 
    tempstr = searchstr(@search) 
    @stars = Star.where("tempstr", :limit => 100) 
end 

@search se crea bien, siendo una búsqueda compleja con diferentes parámetros. tempstr es simplemente un contenedor de cadena simple para los resultados de searchstr(@search), que es un método rápido para convertir los parámetros de búsqueda en una cadena relevante para MySql (que parece ser más fácil que tratar de usar el .where helper normalmente, en este caso). Estoy seguro de que puedo poner searchstr(@search) directamente en .where, pero los he dividido por ahora para poder inspeccionar los elementos a medida que pasan.

De todos modos, aparece el problema cuando trato de llamar al @stars en la vista show.html.erb. Incluso con algo tan simple como esto:

<% @stars.each do |star| %> 
    <%= display stuff %> 
<% end %> 

me sale un error que dice 'each' is not a method of nil:NilClass. Por lo tanto, he cambiado a la siguiente para ver si @stars fue nula: lo suficientemente

<%= @stars.inspect %> 

Claro, @stars es nil. Sin embargo, cuando agrego esta línea al controlador para comprobar que hay @stars:

return render @stars.each 

veo que la variable se llena con los objetos correctos de la estrella de la Star.where(), tal como lo había previsto. Un .inspect rápido muestra que la variable no es nula, cuando está en el controlador.

Por lo tanto, no estoy seguro de por qué la vista lo está recibiendo como nulo si se ha definido en el controlador muy bien. No me sorprendería si fuera yo quien malinterpretara cómo funciona MVC. La clase Star se definió en el modelo Star, pero tal vez es porque estoy tratando de acceder a ella desde el controlador de Búsquedas, y por lo tanto no se inicializa para la vista.

¿Debería hacer esto de otra manera? Intenté usar una variable local (usando stars en lugar de @stars), pero luego la vista dice "Variable local no definida o método 'estrellas'".

Cualquier ayuda sería muy apreciada, ya me he sacudido el cerebro durante horas creando la búsqueda compleja y analizando los datos del archivo estrella en la base de datos, así que estoy un poco agotado. Puedo proporcionar más información si así lo solicita, no estoy seguro de qué otra cosa sería útil para proporcionar una respuesta.

+0

Bueno, ciertamente no quiere <% = @ stars.each%>; ¿Es eso un error tipográfico? Además, '" # {tempstr} "' cuando 'tempstr' ya es una cadena es un poco redundante. Si registra o 'pry' en el controlador ¿' @ stars' realmente contiene valores? –

+0

@Dave Newton - Por un lado, gracias por capturar Tempstr; Originalmente tenía la intención de hacer la sintaxis de .where with rails, que habría necesitado la evaluación. Para 2, el = en que hubo un error tipográfico, y lo arreglaré en la pregunta, gracias de nuevo. Para 3, usando 'logger.debug' para dar salida a '@stars.each do | star | star.ra end' (donde 'star.ra' es una de las variables de la estrella) parece haber registrado todos los contenidos de @stars, que incluyen todas las variables de 2 estrellas que se supone que debe encontrar el .where. Creo que eso significa que contiene valores, aunque podría estar obteniéndolo de otro lado, supongo. – Xadera

Respuesta

3

Está configurando @stars en el método create, pero la vista de la que está hablando es show.html.erb. Intente configurar @stars en el método show también. Algo como esto:

def show 
    @search = Search.find(params[:id]) 
    tempstr = searchstr(@search) 
    @stars = Star.where("tempstr", :limit => 100) 
end 

Si esto no le ayuda, por favor, muestre el resto de ustedes controlador de acciones, por lo que puede ayudar mejor.

+0

¡Sí, tenías toda la razón! Me lo había imaginado no mucho antes de publicar, ¡pero muchas gracias por responder y confirmar! Originalmente pensé que la página Mostrar automáticamente usaba el método Crear al inicializar desde allí, pero estaba equivocado. Un error tan simple me hizo pasar horas cocinando mi cerebro. – Xadera

+0

tu respuesta me ayudó a resolver problemas de rieles totalmente no relacionados. Mereces uptove: D – kubbing

Cuestiones relacionadas