2011-07-25 38 views
22

Soy bastante nuevo en los rieles y me preguntaba cómo puedo mostrar una variable desde mi controlador a mi vista.Rails 3: Variable de pantalla del controlador en la vista

Básicamente, tengo 2 archivos: articles_controller.rb y _article.html.erb

En mi archivo de controlador que tengo una variable @article_votes que quiero mostrar en mi opinión. He intentado usar <%= @article_votes %> pero no muestra nada en absoluto.

¿Alguien tiene alguna orientación? ¡Gracias!

+0

¿Estás seguro @article_votes contiene algo? Puedes probar "puts article_votes: # {@ article_votes}" en tu controlador y verifica tus registros/development.log para ver si hay alguna salida. –

+4

¡NUNCA uses puts en la aplicación Rails! Use logger.debug en su lugar, consulte la sección 2.3 aquí http://guides.rubyonrails.org/debugging_rails_applications.html o use debig simple en la vista. También documentado en esa página – jamesc

Respuesta

43

No estoy seguro de cómo las nuevas son a los rieles. Cualquier variable de instancia que defina dentro de su controlador se puede alcanzar dentro de las vistas.

lo tanto, si @article_votes se define en el controlador, escribiendo

<pre> 
    <%= @article_votes.inspect %> 
</pre> 

en algún lugar de su punto de vista debería aparecer en la página.

Pero el _article.html.erb no se muestra de forma predeterminada. Si tiene un método show en su ArticlesController, se representa la vista llamada show.html.erb. Este es un enfoque general, por lo que para el método index, se debe llamar index.html.erb.

Espero que esto ayude.

+0

¡Eso lo hizo! ¡Gracias por tu ayuda! – Ben

1

_article.html.erb es una vista parcial. ¿Estás seguro de que en el navegador estás mostrando la acción adecuada?

2

La salida de <% =% @article_votes> dependerá de qué clase de los @article_votes es un objeto de e independientemente de si en realidad se está renderizando esa plantilla _article.html.erb

Sólo tiene que llamar <% = render: partial => 'article'%> en el archivo index.html.erb o el archivo .html.erb se llama así por la acción del controlador que está utilizando para tratar de mostrar esta vista.

Normalmente viene de un controlador @article_votes sería una matriz (por convención) los nombres en plural denotan una matriz de objetos y un nombre singular denota un objeto específico de una clase ActiveRecord basada en una tabla llamada article_votes que contendría todos los valores celebrado en la mesa para un registro específico.

Asegúrese de que @article_votes es una instancia de una clase que no sea nula

Si es sólo una cadena a continuación (@article_votes = "Una cadena"), entonces se verá que, en su opinión. Si es el resultado de una llamada a ActiveRecord para encontrar todos los objetos del modelo ArticleVotes, entonces será una matriz que estará vacía si no hay nada en la tabla. Necesitará obtener un objeto específico de esa matriz y luego tendrá que elegir cuál de los métodos disponibles en ese objeto desea mostrar

por ej.

Suponiendo que la tabla article_votes tiene una columna llamada name y tiene 1 registro article_vote en esa tabla con el valor 'This is an name', el siguiente código en la acción del controlador podría mostrarle " este es un nombre" en la pantalla

@article_vote = ArticleVote.first

Si tuviera <% = @ article_vote.name%> en su parcial y suponiendo que realmente se renderiza que parcial

2

Si llama a un parcial, deberá pasarle la variable @article_votes.

<@= render 'article', :article_votes => @article_votes %> 

Ahora dentro de su parcial puede utilizar

<%= article_votes %> 
+0

llamando <% = article_votes%>, aunque probablemente no tenga el resultado deseado, debería ser algo así como article_votes.some_attribute – jamesc

+1

Dado que '@ article_votes' es una variable de instancia del controlador, no es necesario pasar la variable, aunque se puede considerar una buena práctica para los parciales no depender de variables de instancia (esto fomenta la reutilización en otras vistas). En segundo lugar, lo que dice @jamesw: prefiero escribir 'article_votes.inspect' si no sabes qué esperar: generará una cadena legible en todos los casos. – nathanvda

+0

Debería haber sido más claro. La variable 'article_votes' estaría entonces disponible dentro del parcial. Entonces, sí, puedes llamar a cualquier atributo asociado con la variable. [Como se describe aquí] (http://rails-bestpractices.com/posts/27-replace-instance-variable-with-local-variable) – Trent

0

Otra cosa importante con la que me he encontrado es que los valores de las variables se deben establecer antes de realizar la llamada.

Tenía un bloque "crear" estándar donde si el modelo no se guardaba, devolvería errores. En este caso, estaba estableciendo una variable de instancia para que la re-render se desplazara a la forma donde estaban los errores.

No pude entender por qué mi variable no se estaba configurando cuando claramente estaba configurándola. Tan pronto como lo moví sobre la "acción de render:: nuevo" funcionó.

Cuestiones relacionadas