gorkula.com
Selecciona una imagen destacada usando ActionText en Rails
A veces comparto enlaces a este blog en Twitter, la única red social que utilizo.

Las URL que genero no son nada descriptivas. Las hice así a propósito. Para que sean cortas y no tener que pensar. No me importa nada el SEO.

Entonces pensé que al menos podría añadir las etiquetas necesarias al HTML para que al compartir los enlaces en las redes sociales se mostrara automáticamente el título, la descripción y una imagen.

Este blog está montado con Rails. Lo utilizo para aprender. He ideado una manera, espero que funcional, de seleccionar una de las imágenes insertadas en un artículo como imagen principal y que se muestre en las redes sociales.

Inicialmente publiqué el código en el foro de GoRails pero no obtuvo ni una sola respuesta. No tengo ni idea de si lo que he hecho es una barbaridad o tiene algún sentido, pero aquí lo dejo.

Lo primero de todo es que he añadido un campo cover_attachment_id al modelo Post.

En el formulario de edición de un post he añadido el siguiente código:

<% if post.content.embeds.any? %>
  <p>Select cover image:</p>
  <div class="post_cover_select">
    <%= collection_radio_buttons(:post, :cover_attachment_id, post.content.embeds.all, :id, :created_at) do |b|
      b.label(class: "post_cover_radio_button") {
        image_tag(b.object.variant(resize_to_fit: [150, 150])) + b.radio_button
      }
    end %>
  </div>
<% end %>

Si el post tiene algún embed itera y muestra una miniatura junto a un radio button para poder seleccionar la imagen destacada del post.

Originalmente había creado un helper para renderizar la imagen pasando el attachment_id, pero me pareció un poco salvaje hacer una consulta a la base de datos en un helper de una vista, así que acabé añadiendo un método al modelo. Así también es más fácil de usar.

El helper de la vista (desechado):
def cover_image(attachment_id)
  full_url_for ActiveStorage::Attachment.find(attachment_id).variant(resize_to_limit: [600, 600])
end

El método en el modelo (lo que uso ahora):
def cover
  if cover_attachment_id
    content.embeds.find_by(id: cover_attachment_id).variant(resize_to_limit: [600, 600])
  end
end

Para renderizar la imagen de un post basta con:
<%= image_tag post.cover if post.cover %>

Si lo que quiero usar es la url, entonces uso:
<%= full_url_for post.cover if post.cover %>

Y eso es todo. Creo que no ha quedado mal. 
21 Aug - Un comentario -

Comentarios

Deja un comentario