with rails how from ruby-on-rails partial-views

ruby-on-rails - how - view rails



Rails: confundido acerca de la sintaxis para pasar locales a parciales (4)

Aquí está la fuente del método de renderización de http://api.rubyonrails.org/classes/ActionView/Rendering.html#method-i-render :

def render(options = {}, locals = {}, &block) case options # Here is your last case when Hash if block_given? _render_partial(options.merge(:partial => options.delete(:layout)), &block) elsif options.key?(:partial) _render_partial(options) else template = _determine_template(options) lookup_context.freeze_formats(template.formats, true) _render_template(template, options[:layout], options) end when :update update_page(&block) else # here the first three cases _render_partial(:partial => options, :locals => locals) end end

¡Espero que esto ayude!

Entender Rails "magia" con respecto a la representación de parciales (y pasar locales en ellos).

Por qué funciona esto:

<%= render "rabbits/form" %>

Y este trabajo:

<%= render "rabbits/form", :parent => @warren, :flash => flash %>

pero esto no funciona:

<%= render "rabbits/form", :locals => { :parent => @warren, :flash => flash } %>

Pero esto hace:

<%= render :partial =>"rabbits/form", :locals => { :parent => @warren, :flash => flash } %>

Además, ¿cómo puedo buscar estos matices para que no tenga que molestar a la gente en SO?


La respuesta corta es el método de representación que examina el primer argumento que se pasa. Si pasa un hash (que incluye :partial => ''foo'', :locals => {blah blah blah} ), pasará en todos sus argumentos como un hash y analizarlos en consecuencia.

Si pasa una cadena como primer argumento, asume que el primer argumento es su nombre parcial, y pasará el resto como sus locales. Sin embargo, en esa llamada posterior, en realidad asigna :locals => your_locals_argument , que en este caso es todo :locals => {locals hash} , en lugar de solo {locals hash} ; es decir, terminas con :locals => {:locals => {locals hash}} , en lugar de :locals => {locals hash} .

Así que mi consejo es que siempre apruebe explícitamente los valores de la misma manera todo el tiempo, y no tendrá problemas. Para aprender sobre esto, fui directamente al código mismo ( actionpack / lib / base.rb , método de render() en Rails 2; Rails 3 es diferente). Es un buen ejercicio.

Además, no se preocupe por "molestar" a las personas en SO. Es por eso que este sitio existe. Incluso aprendí algo de esto.


Para ser sincero, solo sé sobre estos casos de uso, porque he estado al día con Rails durante los últimos años y he leído los anuncios de que se ha agregado una nueva forma de hacerlo. A menudo me equivoco, pero generalmente se corrige fácilmente.

Es una de esas partes de la API de Rails que no ha sido completamente pensada, si me preguntas. Simplemente acumuló más y más azúcar sintáctico a lo largo de los años, sin desaprobar ninguno de los viejos comportamientos. El método de render tiene diabetes.

Para hacerlo aún peor, el render se comporta de manera diferente en el controlador y la vista. También miro el contenido del primer argumento para ver si es un archivo, plantilla, acción o parcial. Si comienza con una barra, entonces es un archivo, o algo así.

Estoy a favor de usar la notación más corta siempre que sea posible. Debido a que las anotaciones cortas sí comunican el intento bastante bien. Al leerlo, generalmente hace lo que crees que hace. Escribirlo no es tan sencillo.


si necesita especificar: locales, debe especificar: parcial o: plantilla

<%= render :partial => "rabbits/form", :locals => {...} %>

Deberia trabajar