2010-12-09 8 views
96

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

Por qué funciona esto:

<%= render "rabbits/form" %> 

Y este trabajo:

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

sin que esto signifique no trabajo:

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

pero esto:

<%= 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 S.O.?

+3

En un comentario a continuación usted decía que los documentos rails api no son tan buscables. Deberías probar este sitio en su lugar: http://apidock.com/rails. También tiene ruby ​​y rspec allí. – ryeguy

Respuesta

150

La respuesta corta es el método de representación que examina el primer argumento que pasa. Si pasa un hash (que incluye :partial => 'foo', :locals => {blah blah blah}), pasará todos sus argumentos como un hash y los analizará 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, realmente asigna :locals => your_locals_argument, que en este caso es el total :locals => {locals hash}, en lugar de solo {locals hash}; es decir, termina con :locals => {:locals => {locals hash}}, en lugar de :locals => {locals hash}.

Así que mi consejo es que siempre pase explícitamente 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, render() método 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.

5

si es necesario especificar: los locales, es necesario que especifique: parcial o plantilla

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

deben trabajar

+0

tiene que ver con la forma en que ruby ​​evalúa el hash si tienes curiosidad de esa manera. – sethvargo

+0

De hecho, funciona ... como especifiqué en mi pregunta ... pero lo que me pregunto es * ¿por qué? * ¿Y dónde está esto documentado? solo mirando la fuente? Y, si esa es la única forma de encontrar y comprender estos innumerables matices en Rails, entonces me pregunto * cómo * y * dónde * ir a buscar e interpretar esto desde la fuente. No puedo simplemente hacer clic en "renderizar" y luego profundizar en la fuente (no con TextMate de todos modos) o ¿puedo? – Meltemi

+1

¡ah! entonces realmente estás interesado :). Sí, la única forma de resolver estas cosas es a.) Tener una corazonada como tú yb.) Ver el código fuente. No tengo ni idea de cómo profundizar en la fuente aunque ... lo siento – sethvargo

1

Aquí es la fuente de método render 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 esta ayuda!

+0

Esto sí * ayuda *, ¡gracias! Pero no * me ayuda * a ayudarme a mí mismo ... si sabes a qué me refiero ... – Meltemi

2

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 API de Rails que no se ha pensado bien, 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 utilizar 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.

Cuestiones relacionadas