NO LEAS ESTE ARCHIVO EN GITHUB, LAS GUÍAS SE PUBLICAN EN https://guides.rubyonrails.org.

Helpers de Action View

Después de leer esta guía, sabrás:


Lo siguiente describe algunos de los helpers más comúnmente utilizados disponibles en Action View. Sirve como un buen punto de partida, pero también se recomienda revisar la Documentación API completa, ya que cubre todos los helpers con más detalle.

1 Formato

1.1 Fechas

Estos helpers facilitan la visualización de elementos de fecha y/o hora en formas contextuales legibles por humanos.

1.1.1 distance_of_time_in_words

Informa la distancia aproximada en tiempo entre dos objetos Time o Date o enteros como segundos. Establece include_seconds en verdadero si quieres aproximaciones más detalladas.

distance_of_time_in_words(Time.current, 15.seconds.from_now)
# => menos de un minuto
distance_of_time_in_words(Time.current, 15.seconds.from_now, include_seconds: true)
# => menos de 20 segundos

NOTA: Usamos Time.current en lugar de Time.now porque devuelve la hora actual basada en la zona horaria establecida en Rails, mientras que Time.now devuelve un objeto Time basado en la zona horaria del servidor.

Consulta la Documentación API de distance_of_time_in_words para más información.

1.1.2 time_ago_in_words

Informa la distancia aproximada en tiempo entre un objeto Time o Date, o un entero en segundos, y Time.current.

time_ago_in_words(3.minutes.from_now) # => 3 minutos

Consulta la Documentación API de time_ago_in_words para más información.

1.2 Números

Un conjunto de métodos para convertir números en cadenas formateadas. Se proporcionan métodos para números de teléfono, moneda, porcentaje, precisión, notación posicional y tamaño de archivo.

1.2.1 number_to_currency

Formatea un número en una cadena de moneda (por ejemplo, $13.65).

number_to_currency(1234567890.50) # => $1,234,567,890.50

Consulta la Documentación API de number_to_currency para más información.

1.2.2 number_to_human

Imprime de manera bonita (formatea y aproxima) un número para que sea más legible por los usuarios; útil para números que pueden llegar a ser muy grandes.

number_to_human(1234)    # => 1.23 Mil
number_to_human(1234567) # => 1.23 Millón

Consulta la Documentación API de number_to_human para más información.

1.2.3 number_to_human_size

Formatea los bytes en tamaño en una representación más comprensible; útil para informar tamaños de archivo a los usuarios.

number_to_human_size(1234)    # => 1.21 KB
number_to_human_size(1234567) # => 1.18 MB

Consulta la Documentación API de number_to_human_size para más información.

1.2.4 number_to_percentage

Formatea un número como una cadena de porcentaje.

number_to_percentage(100, precision: 0) # => 100%

Consulta la Documentación API de number_to_percentage para más información.

1.2.5 number_to_phone

Formatea un número en un número de teléfono (EE.UU. por defecto).

number_to_phone(1235551234) # => 123-555-1234

Consulta la Documentación API de number_to_phone para más información.

1.2.6 number_with_delimiter

Formatea un número con miles agrupados usando un delimitador.

number_with_delimiter(12345678) # => 12,345,678

Consulta la Documentación API de number_with_delimiter para más información.

1.2.7 number_with_precision

Formatea un número con el nivel de precision especificado, que por defecto es 3.

number_with_precision(111.2345)               # => 111.235
number_with_precision(111.2345, precision: 2) # => 111.23

Consulta la Documentación API de number_with_precision para más información.

1.3 Texto

Un conjunto de métodos para filtrar, formatear y transformar cadenas.

1.3.1 excerpt

Dado un texto y una frase, excerpt busca y extrae la primera ocurrencia de la frase, más el texto circundante solicitado determinado por un radio. Se antepone/añade un marcador de omisión si el inicio/fin del resultado no coincide con el inicio/fin del texto.

excerpt("Esta es una mañana muy hermosa", "muy", separator: " ", radius: 1)
# => ...una muy hermosa...

excerpt("Esto es también un ejemplo", "un", radius: 8, omission: "<cortar> ")
#=> <cortar> es también un ejemplo

Consulta la Documentación API de excerpt para más información.

1.3.2 pluralize

Devuelve la forma singular o plural de una palabra basada en el valor de un número.

pluralize(1, "persona") # => 1 persona
pluralize(2, "persona") # => 2 personas
pluralize(3, "persona", plural: "usuarios") # => 3 usuarios

Consulta la Documentación API de pluralize para más información.

1.3.3 truncate

Trunca un texto dado a una longitud dada. Si el texto es truncado, un marcador de omisión será añadido al resultado para una longitud total que no exceda longitud.

truncate("Érase una vez en un mundo muy lejano")
# => "Érase una vez en un mundo..."

truncate("Érase una vez en un mundo muy lejano", length: 17)
# => "Érase una vez en..."

truncate("uno-dos-tres-cuatro-cinco", length: 20, separator: "-")
# => "uno-dos-tres..."

truncate("Y encontraron que muchas personas estaban durmiendo mejor.", length: 25, omission: "... (continuado)")
# => "Y encontraron... (continuado)"

truncate("<p>Érase una vez en un mundo muy lejano</p>", escape: false)
# => "<p>Érase una vez en un mu..."

Consulta la Documentación API de truncate para más información.

1.3.4 word_wrap

Envuelve el texto en líneas no más largas que line_width.

word_wrap("Érase una vez", line_width: 8)
# => "Érase\nuna vez\nen"

Consulta la Documentación API de word_wrap para más información.

2 Formularios

Los helpers de formularios simplifican el trabajo con modelos en comparación con el uso de elementos HTML estándar solos. Ofrecen una gama de métodos adaptados para generar formularios basados en tus modelos. Algunos métodos corresponden a un tipo específico de entrada, como campos de texto, campos de contraseña, menús desplegables select, y más. Cuando se envía un formulario, las entradas dentro del formulario se agrupan en el objeto params y se envían de vuelta al controlador.

Puedes aprender más sobre los helpers de formularios en la Guía de Helpers de Formularios de Action View.

Un conjunto de métodos para construir enlaces y URLs que dependen del subsistema de enrutamiento.

3.1 button_to

Genera un formulario que se envía a la URL pasada. El formulario tiene un botón de envío con el valor del nombre.

<%= button_to "Iniciar sesión", sign_in_path %>

generaría el siguiente HTML:

<form method="post" action="/sessions" class="button_to">
  <input type="submit" value="Iniciar sesión" />
</form>

Consulta la Documentación API de button_to para más información.

3.2 current_page?

Devuelve verdadero si la URL de la solicitud actual coincide con las opciones dadas.

<% if current_page?(controller: 'profiles', action: 'show') %>
  <strong>Actualmente en la página del perfil</strong>
<% end %>

Consulta la Documentación API de current_page? para más información.

Enlaza a una URL derivada de url_for bajo el capó. Es comúnmente utilizado para crear enlaces para recursos RESTful, especialmente cuando se pasan modelos como argumentos a link_to.

link_to "Perfil", @profile
# => <a href="/profiles/1">Perfil</a>

link_to "Libro", @book # dado una clave primaria compuesta [:author_id, :id]
# => <a href="/books/2_1">Libro</a>

link_to "Perfiles", profiles_path
# => <a href="/profiles">Perfiles</a>

link_to nil, "https://example.com"
# => <a href="https://www.example.com">https://www.example.com</a>

link_to "Artículos", articles_path, id: "articles", class: "article__container"
# => <a href="/articles" class="article__container" id="articles">Artículos</a>

Puedes usar un bloque si tu objetivo de enlace no cabe en el parámetro de nombre.

<%= link_to @profile do %>
  <strong><%= @profile.name %></strong> -- <span>¡Échale un vistazo!</span>
<% end %>

Generaría el siguiente HTML:

<a href="/profiles/1">
  <strong>David</strong> -- <span>¡Échale un vistazo!</span>
</a>

Consulta la Documentación API de link_to para más información.

3.4 mail_to

Genera una etiqueta de enlace mailto a la dirección de correo electrónico especificada. También puedes especificar el texto del enlace, opciones HTML adicionales, y si deseas codificar la dirección de correo electrónico.

mail_to "john_doe@gmail.com"
# => <a href="mailto:john_doe@gmail.com">john_doe@gmail.com</a>

mail_to "me@john_doe.com", cc: "me@jane_doe.com",
        subject: "Este es un correo electrónico de ejemplo"
# => <a href="mailto:"me@john_doe.com?cc=me@jane_doe.com&subject=Este%20es%20un%20correo%20electrónico%20de%20ejemplo">"me@john_doe.com</a>

Consulta la Documentación API de mail_to para más información.

3.5 url_for

Devuelve la URL para el conjunto de opciones proporcionadas.

url_for @profile
# => /profiles/1

url_for [ @hotel, @booking, page: 2, line: 3 ]
# => /hotels/1/bookings/1?line=3&page=2

url_for @post # dado una clave primaria compuesta [:blog_id, :id]
# => /posts/1_2

4 Sanitización

Un conjunto de métodos para limpiar texto de elementos HTML no deseados. Los helpers son particularmente útiles para ayudar a asegurar que solo HTML/CSS seguro y válido se renderice. También puede ser útil para prevenir ataques XSS escapando o eliminando contenido potencialmente malicioso de la entrada del usuario antes de renderizarlo en tus vistas.

Esta funcionalidad es impulsada internamente por la gema rails-html-sanitizer.

4.1 sanitize

El método sanitize codificará en HTML todas las etiquetas y eliminará todos los atributos que no estén específicamente permitidos.

sanitize @article.body

Si se pasan las opciones :attributes o :tags, solo los atributos y etiquetas mencionados están permitidos y nada más.

sanitize @article.body, tags: %w(table tr td), attributes: %w(id class style)

Para cambiar los valores predeterminados para múltiples usos, por ejemplo, agregando etiquetas de tabla al predeterminado:

# config/application.rb
class Application < Rails::Application
  config.action_view.sanitized_allowed_tags = %w(table tr td)
end

Consulta la Documentación API de sanitize para más información.

4.2 sanitize_css

Sanitiza un bloque de código CSS, especialmente cuando encuentra un atributo de estilo en contenido HTML. sanitize_css es particularmente útil cuando se trata de contenido generado por el usuario o contenido dinámico que incluye atributos de estilo.

El método sanitize_css a continuación eliminará los estilos que no están permitidos.

sanitize_css("background-color: red; color: white; font-size: 16px;")

Consulta la Documentación API de sanitize_css para más información.

Elimina todas las etiquetas de enlace del texto dejando solo el texto del enlace.

strip_links("<a href='https://rubyonrails.org'>Ruby on Rails</a>")
# => Ruby on Rails

strip_links("correos a <a href='mailto:me@email.com'>me@email.com</a>.")
# => correos a me@email.com.

strip_links("Blog: <a href='http://myblog.com/'>Visitar</a>.")
# => Blog: Visitar.

Consulta la Documentación API de strip_links para más información.

4.4 strip_tags

Elimina todas las etiquetas HTML del HTML, incluyendo comentarios y caracteres especiales.

strip_tags("Elimina <i>estas</i> etiquetas!")
# => Elimina estas etiquetas!

strip_tags("<b>Negrita</b> ya no más! <a href='more.html'>Ver más</a>")
# => Negrita ya no más! Ver más

strip_links('<<a href="https://example.org">link malformado & link</a>')
# => &lt;link malformado &amp; link

Consulta la Documentación API de strip_tags para más información.

5 Activos

Un conjunto de métodos para generar HTML que enlaza vistas a activos como imágenes, archivos JavaScript, hojas de estilo y feeds.

Por defecto, Rails enlaza a estos activos en el host actual en la carpeta pública, pero puedes dirigir a Rails a enlazar a activos desde un servidor de activos dedicado configurando config.asset_host en la configuración de la aplicación, típicamente en config/environments/production.rb.

Por ejemplo, digamos que tu host de activos es assets.example.com:

config.asset_host = "assets.example.com"

entonces la URL correspondiente para un image_tag sería:

image_tag("rails.png")
# => <img src="//assets.example.com/images/rails.png" />

5.1 audio_tag

Genera una etiqueta de audio HTML con fuente(s), ya sea como una sola etiqueta para una fuente de cadena o etiquetas de fuente anidadas dentro de un array para múltiples fuentes. Las fuentes pueden ser rutas completas, archivos en tu directorio de audios públicos, o adjuntos de Active Storage.

audio_tag("sound")
# => <audio src="/audios/sound"></audio>

audio_tag("sound.wav", "sound.mid")
# => <audio><source src="/audios/sound.wav" /><source src="/audios/sound.mid" /></audio>

audio_tag("sound", controls: true)
# => <audio controls="controls" src="/audios/sound"></audio>

Internamente, audio_tag usa audio_path de los AssetUrlHelpers para construir la ruta del audio.

Consulta la Documentación API de audio_tag para más información.

Devuelve una etiqueta de enlace que los navegadores y lectores de feeds pueden usar para auto-detectar un feed RSS, Atom, o JSON.

auto_discovery_link_tag(:rss, "http://www.example.com/feed.rss", { title: "RSS Feed" })
# => <link rel="alternate" type="application/rss+xml" title="RSS Feed" href="http://www.example.com/feed.rss" />

Consulta la Documentación API de auto_discovery_link_tag para más información.

Devuelve una etiqueta de enlace para un favicon gestionado por el pipeline de activos. La fuente puede ser una ruta completa o un archivo que exista en tu directorio de activos.

favicon_link_tag
# => <link href="/assets/favicon.ico" rel="icon" type="image/x-icon" />

Consulta la Documentación API de favicon_link_tag para más información.

5.4 image_tag

Devuelve una etiqueta de imagen HTML para la fuente. La fuente puede ser una ruta completa o un archivo que exista en tu directorio app/assets/images.

image_tag("icon.png")
# => <img src="/assets/icon.png" />

image_tag("icon.png", size: "16x10", alt: "Editar Artículo")
# => <img src="/assets/icon.png" width="16" height="10" alt="Editar Artículo" />

Internamente, image_tag usa image_path de los AssetUrlHelpers para construir la ruta de la imagen.

Consulta la Documentación API de image_tag para más información.

5.5 javascript_include_tag

Devuelve una etiqueta de script HTML para cada una de las fuentes proporcionadas. Puedes pasar el nombre del archivo (la extensión .js es opcional) de archivos JavaScript que existen en tu directorio app/assets/javascripts para su inclusión en la página actual, o puedes pasar la ruta completa relativa a tu raíz de documentos.

javascript_include_tag("common")
# => <script src="/assets/common.js"></script>

javascript_include_tag("common", async: true)
# => <script src="/assets/common.js" async="async"></script>

Algunos de los atributos más comunes son async y defer, donde async permitirá que el script se cargue en paralelo para ser analizado y evaluado tan pronto como sea posible, y defer indicará que el script está destinado a ejecutarse después de que el documento haya sido analizado.

Internamente, javascript_include_tag usa javascript_path de los AssetUrlHelpers para construir la ruta del script.

Consulta la Documentación API de javascript_include_tag para más información.

5.6 picture_tag

Devuelve una etiqueta de imagen HTML para la fuente. Admite pasar una Cadena, un Array, o un Bloque.

picture_tag("icon.webp", "icon.png")

Esto genera el siguiente HTML:

<picture>
  <source srcset="/assets/icon.webp" type="image/webp" />
  <source srcset="/assets/icon.png" type="image/png" />
  <img src="/assets/icon.png" />
</picture>

Consulta la Documentación API de picture_tag para más información.

Devuelve una etiqueta de enlace que los navegadores pueden usar para precargar la fuente. La fuente puede ser la ruta de un recurso gestionado por el pipeline de activos, una ruta completa, o un URI.

preload_link_tag("application.css")
# => <link rel="preload" href="/assets/application.css" as="style" type="text/css" />

Consulta la Documentación API de preload_link_tag para más información.

Devuelve una etiqueta de enlace de hoja de estilo para las fuentes especificadas como argumentos. Si no especificas una extensión, .css se añadirá automáticamente.

stylesheet_link_tag("application")
# => <link href="/assets/application.css" rel="stylesheet" />

stylesheet_link_tag("application", media: "all")
# => <link href="/assets/application.css" media="all" rel="stylesheet" />

media se usa para especificar el tipo de medio para el enlace. Los tipos de medios más comunes son all, screen, print, y speech.

Internamente, stylesheet_link_tag usa stylesheet_path de los AssetUrlHelpers para construir la ruta de la hoja de estilo.

Consulta la Documentación API de stylesheet_link_tag para más información.

5.9 video_tag

Genera una etiqueta de video HTML con fuente(s), ya sea como una sola etiqueta para una fuente de cadena o etiquetas de fuente anidadas dentro de un array para múltiples fuentes. Las fuentes pueden ser rutas completas, archivos en tu directorio de videos públicos, o adjuntos de Active Storage.

video_tag("trailer")
# => <video src="/videos/trailer"></video>

video_tag(["trailer.ogg", "trailer.flv"])
# => <video><source src="/videos/trailer.ogg" /><source src="/videos/trailer.flv" /></video>

video_tag("trailer", controls: true)
# => <video controls="controls" src="/videos/trailer"></video>

Internamente, video_tag usa video_path de los AssetUrlHelpers para construir la ruta del video.

Consulta la Documentación API de video_tag para más información.

6 JavaScript

Un conjunto de métodos para trabajar con JavaScript en tus vistas.

6.1 escape_javascript

Escapa retornos de carro y comillas simples y dobles para segmentos de JavaScript. Utilizarías este método para tomar una cadena de texto y asegurarte de que no contenga caracteres inválidos cuando el navegador intente analizarla.

Por ejemplo, si tienes un parcial con un saludo que contiene comillas dobles, puedes escapar el saludo para usarlo en un alerta de JavaScript.

<%# app/views/users/greeting.html.rb %>
Mi nombre es <%= current_user.name %>, y estoy aquí para decir "¡Bienvenido a nuestro sitio web!"
<script>
  var greeting = "<%= escape_javascript render('users/greeting') %>";
  alert(`Hola, ${greeting}`);
</script>

Esto escapará las comillas correctamente y mostrará el saludo en un cuadro de alerta.

Consulta la Documentación API de escape_javascript para más información.

6.2 javascript_tag

Devuelve una etiqueta de JavaScript envolviendo el código proporcionado. Puedes pasar un hash de opciones para controlar el comportamiento de la etiqueta <script>.

javascript_tag("alert('Todo está bien')", type: "application/javascript")
<script type="application/javascript">
//<![CDATA[
alert('Todo está bien')
//]]>
</script>

En lugar de pasar el contenido como un argumento, también puedes usar un bloque.

<%= javascript_tag type: "application/javascript" do %>
  alert("¡Bienvenido a mi aplicación!")
<% end %>

Consulta la Documentación API de javascript_tag para más información.

7 Etiquetas Alternativas

Un conjunto de métodos para generar etiquetas HTML programáticamente.

7.1 tag

Genera una etiqueta HTML independiente con el nombre y opciones dados.

Cada etiqueta se puede construir con:

tag.some_tag_name(optional content, options)

donde el nombre de la etiqueta puede ser, por ejemplo, br, div, section, article, o cualquier etiqueta realmente.

Por ejemplo, aquí hay algunos usos comunes:

tag.h1 "Todos los títulos se ajustan para imprimir"
# => <h1>Todos los títulos se ajustan para imprimir</h1>

tag.div "¡Hola, mundo!"
# => <div>¡Hola, mundo!</div>

Además, puedes pasar opciones para agregar atributos a la etiqueta generada.

tag.section class: %w( gatitos cachorros )
# => <section class="gatitos cachorros"></section>

Además, los atributos HTML data-* se pueden pasar al helper tag usando la opción data, con un hash que contiene pares clave-valor de subatributos. Los subatributos se convierten en atributos data-* que se convierten a guiones para funcionar bien con JavaScript.

tag.div data: { user_id: 123 }
# => <div data-user-id="123"></div>

Consulta la Documentación API de tag para más información.

7.2 token_list

Devuelve una cadena de tokens construida a partir de los argumentos proporcionados. Este método también se alias como class_names.

token_list("gatos", "perros")
# => "gatos perros"

token_list(nil, false, 123, "", "foo", { bar: true })
# => "123 foo bar"

móvil, alineación = true, "centro"
token_list("flex items-#{alineación}", "flex-col": móvil)
# => "flex items-centro flex-col"
class_names("flex items-#{alineación}", "flex-col": móvil) # usando el alias
# => "flex items-centro flex-col"

8 Captura de Bloques

Un conjunto de métodos para permitirte extraer el marcado generado que se puede usar en otras partes de un archivo de plantilla o diseño.

Proporciona un método para capturar bloques en variables a través de capture, y una forma de capturar un bloque de marcado para usar en un diseño a través de content_for.

8.1 capture

El método capture te permite extraer parte de una plantilla en una variable.

<% @greeting = capture do %>
  <p>¡Bienvenido! La fecha y hora es <%= Time.current %></p>
<% end %>

Luego puedes usar esta variable en cualquier parte de tus plantillas, diseños o helpers.

<html>
  <head>
    <title>¡Bienvenido!</title>
  </head>
  <body>
    <%= @greeting %>
  </body>
</html>

El retorno de capture es la cadena generada por el bloque.

@greeting
# => "¡Bienvenido a mi nueva página web brillante! La fecha y hora es 2018-09-06 11:09:16 -0500"

Consulta la Documentación API de capture para más información.

8.2 content_for

Llamar a content_for almacena un bloque de marcado en un identificador para su uso posterior. Puedes hacer llamadas subsiguientes al contenido almacenado en otras plantillas, módulos de helpers o el diseño pasando el identificador como un argumento a yield.

Un caso de uso común es establecer el título de una página en un bloque content_for.

Defines un bloque content_for en la vista de la página especial, y luego lo yield dentro del diseño. Para otras páginas, donde no se utiliza el bloque content_for, permanece vacío, lo que resulta en que no se rinda nada.

<%# app/views/users/special_page.html.erb %>
<% content_for(:html_title) { "Título de Página Especial" } %>
<%# app/views/layouts/application.html.erb %>
<html>
  <head>
    <title><%= content_for?(:html_title) ? yield(:html_title) : "Título Predeterminado" %></title>
  </head>
</html>

Notarás que en el ejemplo anterior, usamos el método predicado content_for? para renderizar condicionalmente un título. Este método verifica si se ha capturado algún contenido usando content_for, lo que te permite ajustar partes de tu diseño basado en el contenido dentro de tus vistas.

Además, puedes emplear content_for dentro de un módulo de helper.

# app/helpers/title_helper.rb
module TitleHelper
  def html_title
    content_for(:html_title) || "Título Predeterminado"
  end
end

Ahora, puedes llamar a html_title en tu diseño para recuperar el contenido almacenado en el bloque content_for. Si se establece un bloque content_for en la página que se está renderizando, como en el caso de la special_page, mostrará el título. De lo contrario, mostrará el texto predeterminado "Título Predeterminado".

ADVERTENCIA: content_for se ignora en cachés. Así que no deberías usarlo para elementos que serán almacenados en caché de fragmentos.

NOTA: Puedes estar pensando cuál es la diferencia entre capture y content_for?

capture se usa para capturar un bloque de marcado en una variable, mientras que content_for se usa para almacenar un bloque de marcado en un identificador para su uso posterior. Internamente, content_for realmente llama a capture. Sin embargo, la diferencia clave radica en su comportamiento cuando se invocan múltiples veces.

content_for se puede llamar repetidamente, concatenando los bloques que recibe para un identificador específico en el orden en que se proporcionan. Cada llamada subsiguiente simplemente se suma a lo que ya está almacenado. En contraste, capture solo devuelve el contenido del bloque, sin llevar un registro de ninguna invocación anterior.

Consulta la Documentación API de content_for para más información.

9 Rendimiento

9.1 benchmark

Envuelve un bloque benchmark alrededor de operaciones costosas o posibles cuellos de botella para obtener una lectura de tiempo para la operación.

<% benchmark "Procesar archivos de datos" do %>
  <%= expensive_files_operation %>
<% end %>

Esto añadiría algo como Procesar archivos de datos (0.34523) al registro, que luego puedes usar para comparar tiempos al optimizar tu código.

NOTA: Este helper es parte de Active Support, y también está disponible en controladores, helpers, modelos, etc.

Consulta la Documentación API de benchmark para más información.

9.2 cache

Puedes almacenar en caché fragmentos de una vista en lugar de una acción o página completa. Esta técnica es útil para almacenar en caché piezas como menús, listas de temas de noticias, fragmentos HTML estáticos, y así sucesivamente. Permite que un fragmento de lógica de vista se envuelva en un bloque de caché y se sirva desde la tienda de caché cuando llegue la próxima solicitud.

El método cache toma un bloque que contiene el contenido que deseas almacenar en caché.

Por ejemplo, podrías almacenar en caché el pie de página de tu diseño de aplicación envolviéndolo en un bloque cache.

<% cache do %>
  <%= render "application/footer" %>
<% end %>

También podrías almacenar en caché basado en instancias de modelo, por ejemplo, puedes almacenar en caché cada artículo en una página pasando el objeto article al método cache. Esto almacenaría en caché cada artículo por separado.

<% @articles.each do |article| %>
  <% cache article do %>
    <%= render article %>
  <% end %>
<% end %>

Cuando tu aplicación recibe su primera solicitud a esta página, Rails escribirá una nueva entrada de caché con una clave única. Una clave se ve algo así:

views/articles/index:bea67108094918eeba32cd4a6f786301/articles/1

Consulta Fragment Caching y la Documentación API de cache para más información.

10 Misceláneo

10.1 atom_feed

Los Feeds Atom son formatos de archivo basados en XML utilizados para sindicar contenido y pueden ser utilizados por usuarios en lectores de feeds para navegar contenido o por motores de búsqueda para ayudar a descubrir información adicional sobre tu sitio.

Este helper facilita la construcción de un feed Atom, y se utiliza principalmente en plantillas Builder para crear XML. Aquí hay un ejemplo completo de uso:

# config/routes.rb
resources :articles
# app/controllers/articles_controller.rb
def index
  @articles = Article.all

  respond_to do |format|
    format.html
    format.atom
  end
end
# app/views/articles/index.atom.builder
atom_feed do |feed|
  feed.title("Índice de Artículos")
  feed.updated(@articles.first.created_at)

  @articles.each do |article|
    feed.entry(article) do |entry|
      entry.title(article.title)
      entry.content(article.body, type: "html")

      entry.author do |author|
        author.name(article.author_name)
      end
    end
  end
end

Consulta la Documentación API de atom_feed para más información.

10.2 debug

Devuelve una representación YAML de un objeto envuelto con una etiqueta pre. Esto crea una forma muy legible de inspeccionar un objeto.

my_hash = { "first" => 1, "second" => "two", "third" => [1, 2, 3] }
debug(my_hash)
<pre class="debug_dump">---
first: 1
second: two
third:
- 1
- 2
- 3
</pre>

Consulta la Documentación API de debug para más información.


Comentarios

Se te anima a ayudar a mejorar la calidad de esta guía.

Por favor contribuye si ves algún error tipográfico o errores fácticos. Para comenzar, puedes leer nuestra sección de contribuciones a la documentación.

También puedes encontrar contenido incompleto o cosas que no están actualizadas. Por favor agrega cualquier documentación faltante para main. Asegúrate de revisar Guías Edge primero para verificar si los problemas ya están resueltos o no en la rama principal. Revisa las Guías de Ruby on Rails para estilo y convenciones.

Si por alguna razón detectas algo que corregir pero no puedes hacerlo tú mismo, por favor abre un issue.

Y por último, pero no menos importante, cualquier tipo de discusión sobre la documentación de Ruby on Rails es muy bienvenida en el Foro oficial de Ruby on Rails.