PaperClip, Subir Archivos en Ruby on Rails

Resultado de imagen de paperclip

Paperclip es un gem de Ruby creada para hacer el adjuntar archivos muy fácil.

Paperclip requiere la instalación de ImageMagick en tu máquina.

Mac:

brew install imagemagick

Ubuntu:

sudo apt-get install imagemagick

 

En el Gemfile añadimos la gema paperclip:

gem "paperclip"

La instalamos:

bundle install

 

Cambiamos la bbdd para que guarde la referencia de las imagenes. Normalmente se guarda la referencia de la imagen. La imagen se guarda en carpetas del proyecto.

rails generate migration add_cover_to_articles

Se nos crea la siguiente migración:

class AddCoverToArticles < ActiveRecord::Migration[5.2]
  def change
  end
end

Pero le añadimos lo siguiente:

class AddCoverToArticles < ActiveRecord::Migration[5.2]
  def change
    add_attachment :articles,:cover
  end
end

 

Hacemos un migrate

rails db:migrate

 

Modificamos el modelo de ActiveRecord

class Article < ApplicationRecord
 .
 .
 .
  has_attached_file :cover, styles: {medium:"1280x720", thumb:"800x600"}  # Tiene un archivo adjunto llamado cover con dos versiones de tamaño
  validates_attachment_content_type :cover, content_type: /\Aimage\/.*\Z/ # Validación para evitar ataques y solo se suban los archivos de unas extensiones predefinidas
 
 .
 .

 

Ahora en la vista de creación añadimos el campo para adjuntar la imagen:

<%= form_for(@article) do |formulario| %>  
 .
 .
 .
  <div class="field">
    Portada: <%= formulario.file_field :cover %>
  </div>
 .
 .
 .

 

Rails añade automáticamente el atributo enctype=»multipart/form-data al formulario al ver que existe un field file.

Modificamos los parametros fuertes en el controlador para que nos dejen mandar el cover:

 .
 .
 .
  private

  def article_params
    params.require(:article).permit(:title,:body,:cover)
  end

 .
 .
 .

 

Ahora modificamos la vista de visualizar (show):

 .
 . 
 .
  <div class="field">
    <%= image_tag @article.cover.url(:thumb) %>
  </div>
 .
 . 
 .