2011-12-23 29 views
7

Me he confundido un poco acerca de la idea de "representar" una "plantilla" debido a la forma en que un autor habla de ella en un libro que estoy leyendo .Rieles: ¿Qué significa en realidad "renderizar una plantilla"

Mi comprensión original de "renderizar una plantilla" era que significaba que Rails proporciona el contenido que se visualiza en la pantalla/se presenta al espectador (de la forma en que se representa un parcial) pero el libro que estoy la lectura parece estar usando el concepto de "renderizar una plantilla" para también significar algo más. Permíteme explicarte en contexto

Este libro (rieles 3 en acción) establece un diseño de página usando el archivo layouts/application.html.erb convencional, y luego "cede" a diferentes páginas de vista, como views/tickets/show.html.erb que agrega más contenido a la pantalla. eso es todo sencillo ..

En esta vista views/tickets/show.html.erb, hay una representación de un parcial (que también es un concepto sencillo).

<div id='tags'><%= render @ticket.tags %></div> 

Ahora dentro de este parcial existe, usando ajax, una llamada a un método de "eliminar" en el "tags_controller.rb" que está diseñado para permitir a los usuarios autorizados para desmontar una "etiqueta" de un "boleto" en nuestra aplicación simulada de administración de proyectos.

<% if can?(:tag, @ticket.project) || current_user.admin? %> 
    <%= link_to "x", remove_ticket_tag_path(@ticket, tag), 
     :remote => true, 
     :method => :delete, 
     :html => { :id => "delete-#{tag.name.parameterize}" } %> 
    <% end %> 

Ahora aquí está la acción "eliminar" en el controlador de etiquetas (que disocia la etiqueta del boleto en la base de datos) ...

def remove 
    @ticket = Ticket.find(params[:ticket_id]) 
    if can?(:tag, @ticket.project) || current_user.admin? 
     @tag = Tag.find(params[:id]) 
     @ticket.tags -= [@tag] 
     @ticket.save 
    end 
    end 
end 

Al final de esta acción de eliminación, la autor originalmente incluyó render :nothing => true, pero luego revisó la acción porque, como él dice, "vas a conseguir que presente una plantilla". Aquí es donde me confundo

La plantilla que se pone esta acción para hacer que es "remove.js.erb", que sólo tiene una línea de jQuery en su interior, cuya finalidad es eliminar la "etiqueta" de la página (es decir, la etiqueta que el usuario ve en la pantalla) ahora que se ha desasociado del ticket en la base de datos.

$('#tag-<%= @tag.name.parameterize %>').remove(); 

Cuando leí "la representación de una plantilla" espero que la aplicación que se va insertar contenido en la página, pero la plantilla dictada por la acción "eliminar" en el controlador sólo llama a una función jQuery que elimina un elemento de la página.

Si se "renderiza" una "plantilla", estoy esperando que se elimine otra plantilla (para dejar espacio para la nueva plantilla), o estoy esperando que el contenido se "renderice" de la manera que un parcial es renderizado ¿Puedes aclarar qué está sucediendo realmente cuando se "renderiza" una "plantilla" en la situación con el jquery en esta pregunta? ¿De verdad está poniendo una nueva página frente al usuario? (Esperaba que se renderizara algún tipo de página física)

+0

+1 para una pregunta bien escrita – bragboy

Respuesta

3

¡Ya casi está allí! Hacer una plantilla siempre se trata de producir contenido, pero para una descripción un poco más amplia del contenido. Podría ser un fragmento de html, por ejemplo, una llamada ajax para obtener nuevos elementos podría producir algún html que describa los nuevos elementos, pero no tiene que ser así.

Una plantilla puede producir javascript como lo hace en su segundo ejemplo. Personalmente trato de evitar esto y, en su lugar, paso el JSON de vuelta al cliente y dejo que el lado del cliente realice el trabajo requerido.

Otro tipo de representación que puede realizar es producir algo de JSON. Las API a menudo lo harán, pero también podría hacer esto en una página normal. Por ejemplo en lugar de la prestación de algunos javascript para borrar la etiqueta x es posible hacer que el JSON

{ to_delete: "tag-123"} 

y luego tener el éxito de su devolución de llamada jQuery usar esa carga útil saber qué elemento va a quitar de la DOM, por tener esto en su aplicación. js archivo de

$('a.delete_tag').live('ajax:success', function(data){ 
    var selector = '#' + data.to_delete; 
    $(selector).remove() 
} 

(Suponiendo que sus vínculos de borrado tenían la clase 'delete_tag') representación JSON como esto no es realmente una plantilla en absoluto, ya que le suele hacer a través de este

render :json => {:to_delete => "tag-#{@tag.name.parameterize}"} 

aunque supongo que podría usar una plantilla erb para esto (no puedo imaginar por qué).

+0

Esto es interesante. Puedes aclarar algo En lugar de usar la plantilla, intenté renderizar: js => "$ ('# tag - <% = @ tag.name.parameterize%>'). Remove();" . Esto funcionó, pero requirió una actualización de la página para eliminar la etiqueta, pero si puse este jquery en una plantilla, no fue necesario actualizar la página para eliminar la etiqueta. Cuando escribes "haz que tu devolución de llamada jQuery use esa carga útil para saber qué elemento eliminar del DOM", ¿es esto algo que me permitiría usar render: js sin el problema de tener que actualizar la página? ¿Puedes explicar/mostrar cómo? Gracias de antemano. – Leahcim

+0

Sospecho que si renderiza js espera una interpolación ruby ​​normal (# {}) en lugar de las etiquetas erb –

+0

gracias por eso. estás en lo correcto. – Leahcim

2

Entiendo que js.erb se "renderiza" ejecutando las funciones javascript dentro de él. Muy a menudo algo como lo de abajo se hace:

jQuery(document).ready(function() { 
    jQuery('#element').html('<%= escape_javascript(render pages/content) %>'); 
}); 
+0

gracias, ¿así que en esta función las páginas/contenido se ponen en el elemento html? – Leahcim

+0

sí, de hecho, puede representar el contenido que normalmente es renderizado por html.erb de esta manera – prusswan

1

Hay una visión general muy sucinta de la representación en http://guides.rubyonrails.org/layouts_and_rendering.html que puede ayudar, ya que también entra en los detalles del método ActionController::Base#render y lo que sucede detrás de las escenas cuando se utiliza render :nothing (por ejemplo). Renderizado, pero también se puede usar para archivos o códigos en línea, no solo como "plantillas" en el sentido tradicional.

+0

He echado un vistazo a esa página, específicamente 2.2.10, que da instrucciones sobre la representación de js directamente desde la acción del controlador como render => " alerta ('Hola Rails'); Por lo tanto, solo para probarlo, moví el jquery de la plantilla remove.js.erb al controlador como se describe en 2.2.10, pero cuando hice clic en el elemento, necesité actualizar la página para que se llevara a cabo la eliminación. . Si tengo el jquery en remove.js.erb, realmente elimina el elemento sin requerir una actualización de página. Similar pero diferente – Leahcim

+0

ver el comentario de Frederick Cheung sobre por qué tuve este problema ... – Leahcim

Cuestiones relacionadas