Cargar imagen de rieles usando Dragonfly

La carga de archivos es una característica importante en las aplicaciones web. Además de permitir a los usuarios cargar imágenes de perfil, el uso de las funciones de carga de archivos varía. Te he mostrado cómo habilitar la carga de archivos en tu aplicación Rails usando diferentes gemas. Hoy te mostraré cómo hacer lo mismo usando Dragonfly..

Dragonfly es una gema de Ruby altamente personalizable para el manejo de imágenes y otros archivos adjuntos y ya está en uso en miles de sitios web.

Se le puede dar una tarea para habilitar la carga de archivos en una aplicación de Rails y es posible que no quiera hacer uso de las otras gemas que están ahí fuera. Puedes darle un tiro a Dragonfly, y definitivamente no te arrepentirás..

En este tutorial crearás una aplicación Rails simple; Nombré el mío Dragon-Uploader. La aplicación tendrá una sola característica: carga de imágenes..

Instalando ImageMagick

Para utilizar Dragonfly, necesita tener instalado ImageMagick en su máquina. Siga cualquiera de los pasos a continuación, dependiendo de su sistema operativo.

Usuarios de Mac:

brew install imagemagick

Usuarios de Ubuntu:

sudo apt-get install imagemagick

Generación de aplicaciones Rails

rieles nuevo dragon-uploader -T

los -T La opción asegura que su aplicación Rails se genere sin el conjunto de pruebas predeterminado.

Ir a tu Gemfile y agrega el libélula joya.

#Gemfile gema 'libélula', '~> 1.0', '> = 1.0.12'

No te olvides de atar.

instalación de paquete

Generemos nuestro controlador..

Los carriles generan el controlador Fotos

Integrando libélula

El primer paso para integrar Dragonfly en su aplicación Rails es ejecutar el comando de generación de dragonfly desde su terminal.

rieles generan libélula

Esto creará un archivo de inicialización para Dragonfly en tu config / inicializadores carpeta.

El archivo se ve así:

# config / intializers / dragonfly.rb require 'dragonfly' # Configure Dragonfly.app.configure hacer que el tipo de usuario sea el mejor de la cuenta de cada mes. 'public / system / dragonfly', Rails.env), server_root: Rails.root.join ('public') end # Logger Dragonfly.logger = Rails.logger # Montar como middleware Rails.application.middleware.use Dragonfly :: Middleware # ¿Agregar la funcionalidad del modelo si está definida? (ActiveRecord :: Base) ActiveRecord :: Base.extend Dragonfly :: Model ActiveRecord :: Base.extend Dragonfly :: Model :: Validations end

rieles generan modelo foto

# app / models / photo.rb class Photo < ActiveRecord::Base dragonfly_accessor :image end 

Dragonfly proporciona un accesorio que deberá agregar a su modelo. Con esto podrás leer y escribir imágenes..

Ahora navega a tu archivo de migración y agrega columnas.

# xxx_create_photos.rb clase CreatePhotos < ActiveRecord::Migration def change create_table :photos do |t| t.string :image_uid t.string :title t.timestamps null: false end end end

Nota: Si estás haciendo uso de avatar y no imagen como lo hice arriba, deberías cambiar la columna a avatar_uid.

Migra tu base de datos:

rastrillo db: migrar

Configura tu Controlador de fotos Con las acciones necesarias para subir una imagen. Debe tener un aspecto como este:

# app / controllers / photos_controller.rb clase PhotosController < ApplicationController def index @photos = Photo.all end def new @photo = Photo.new end def create @photo = Photo.new(photo_params) if @photo.save redirect_to photos_path else render :new end end private def photo_params params.require(:photo).permit(:image, :title) end end

Tendrás que configurar tus rutas..

Por ahora, agregue rutas a las tres acciones que ha creado..

# config / route.rb Rails.application.routes.draw do resource: photos only: [: index,: new,: create] root para: "photos # index" end

Necesitas configurar tus puntos de vista como lo tengo a continuación:

# app / views / photos / index.html.erb 

Las fotos

<%= notice %>

<% @photos.each do |photo| %> <% end %>
Título Imagen
<%= photo.title %> <%= link_to image_tag(photo.image.thumb('100x100').url), photo.image.url %> <%= link_to 'Show', photo %> <%= link_to 'Edit', edit_photo_path(photo) %> <%= link_to 'Destroy', photo, method: :delete, data: confirm: 'Are you sure?' %>
# app / views / photos / new.html.erb <%= form_for @photo do |f| %> 
<%= f.label :title %> <%= f.text_field :title %>
<%= f.label :image %> <%= f.file_field :image %>
<%= f.submit :submit %>
<% end %>

Volveremos a estas vistas más tarde..

Validaciones

Por motivos de seguridad, no desea otorgar a sus usuarios el privilegio de cargar archivos de ningún tipo. Dragonfly le proporciona los métodos necesarios para esto en sus inicializadores..

# config / initializers / dragonfly.rb # ¿Agregar funcionalidad de modelo si está definida? (ActiveRecord :: Base) ActiveRecord :: Base.extend Dragonfly :: Model ActiveRecord :: Base.extend Dragonfly :: Model :: Validations end

Ahora edita tu modelo de foto para que se parezca a lo que tengo a continuación:

# app / models / photo.rb class Photo < ActiveRecord::Base dragonfly_accessor :image #title validation validates_presence_of :title #image validations validates_presence_of :image validates_size_of :image, maximum: 400.kilobytes, message: "should not be more than 400KB", if: :image_changed? validates_property :format, of: :image, in: ['jpeg', 'png', 'gif'], message: "the formats allowed are: .jpeg, .png, .gif", if: :image_changed? end

Aquí está una lista completa de las validaciones que ofrece Dragonfly:

clase Foto extender Dragonfly :: Modelo :: Validaciones validates_presence_of: image validates_size_of: image, máximo: 500.kilobytes # Verificar la extensión de archivo validates_property: ext, of:: image, as: 'jpg' #… or… validates_property: mime_type, of :: image, as: 'image / jpeg' #… o analice el formato con imagemagick… validates_property: format, of:: image, in: ['jpeg', 'png', 'gif'] validates_property: width, of :: imagen, en: (0… 400), mensaje: "é demais cara!" # ... o es posible que desee utilizar image_changed? método ... validate_property: format, of:: image, as: 'png', if:: image_changed? fin

Puedes leer más sobre esto en la documentación de Dragonfly..

También debe considerar darles a sus usuarios la opción de editar sus imágenes guardadas. Para hacer esto, necesitamos agregar dos métodos de acción a nuestro Controlador de fotos y crear una página de edición en nuestras vistas. Es posible que desee agregar la acción de eliminar y mostrar mientras está en ello, como tengo a continuación:

# app / controllers / photos_controller.rb clase PhotosController < ApplicationController before_action :set_photos, only: [:show, :edit, :update, :destroy] def index @photos = Photo.all end def new @photo = Photo.new end def create @photo = Photo.new(photo_params) if @photo.save redirect_to @photo else render :new end end def show end def edit end def update if @photo.update(photo_params) redirect_to @photo, notice: "photo successfully updated" else render :edit end end def destroy @photo.destroy redirect_to photos_url, notice: 'photo was successfully destroyed.' end private def photo_params params.require(:photo).permit(:image, :title) end def set_photos @photo = Photo.find(params[:id]) end end
# app / views / photos / edit.html.erb <%= form_for @photo do |f| %> <% if @photo.errors.any? %> 

<%= pluralize(@photo.errors.count, "error") %> Prohibido guardar esta foto:

    <% @photo.errors.full_messages.each do |message| %>
  • <%= message %>
  • <% end %>
<% end %>
<%= f.label :title %> <%= f.text_field :title %>
<%= f.label :image %> <%= f.file_field :image %>
<%= f.submit :submit %>
<% end %> <%= link_to "Show", @photo %> | <%= link_to "Back", photos_path %>
# app / views / photos / show.html.erb 
Título: <%= @photo.title %>
Imagen: <%= image_tag @photo.image.thumb('400x200#').url if @photo.image_stored? %>
<%= link_to 'Edit', edit_photo_path(@photo) %> | <%= link_to 'Back', photos_path %>

Si intenta acceder a la página de mostrar o editar, se le presentarán los errores. Esto se debe a que restringimos la ruta a : new,: index, y: update. Ahora adelante y cambia eso; Debe tener un aspecto como este:

# config / route.rb Rails.application.routes.draw do resources: raíz de las fotos a: "photos # index" end

Conclusión

En este punto, ahora puede integrar Dragonfly en su aplicación Rails. Asegúrese de revisar la documentación si desea probar más funciones que no se mencionan aquí. Espero que lo hayan disfrutado.

Recuerde, siempre puede agregar comentarios, preguntas y comentarios en el siguiente formulario.