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.
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? –
@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