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..
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
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
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.erbLas fotos
<%= notice %>
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..
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? %><% end %><%= pluralize(@photo.errors.count, "error") %> Prohibido guardar esta foto:
<% @photo.errors.full_messages.each do |message| %>
- <%= message %>
<% 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.erbTí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
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.