blog - Carga de imágenes de Ruby on Rails
rails blog gem (7)
Soy nuevo en los rieles, lo siento mucho si esto es fácil. Me pregunto cuál es la mejor manera de subir imágenes y mostrarlas en Ruby on Rails. Tengo un blog y me gustaría tener la opción de adjuntar una imagen al crear una publicación.
CarrierWave es probablemente la mejor solución para cargar imágenes en Rails. La siguiente publicación describe una solución para la carga de imágenes con CarrierWave, mientras que las transformaciones de imagen se realizan de forma transparente en la nube. Las imágenes cargadas se almacenan en la nube y se envían a través de un CDN. No es necesario instalar RMagick, MiniMagick e ImageMagick. http://cloudinary.com/blog/ruby_on_rails_image_uploads_with_carrierwave_and_cloudinary
CarrierWave es una gema más nueva que Paperclip, y se ve mucho más flexible. También hay un Railscast al respecto: http://railscasts.com/episodes/253-carrierwave-file-uploads
Mucha gente recomienda PaperClip . Quizás quieras probar usarlo primero.
Muchos recomiendan usar Carrierwave
y no soy una excepción, pero quería señalar una cosa. En muchos sitios escritos con RoR (obviamente, no solo es un problema RoR) noto que la solicitud que envía la imagen puede estar pendiente durante 2-3 segundos y con frecuencia aún más, lo que vincula la instancia de la aplicación (que probablemente no sea tan terrible si estás usando subprocesos o no te importa mucho el rendimiento, pero definitivamente lo es si estás usando unicornio). Entonces explicaré cómo evitar eso usando carrierwave:
1) Elija un trabajador de fondo para su aplicación (generalmente voy con Sidekiq)
2) Agregue carrierwave_backgrounder
a su Gemfile y configúrelo para trabajar con su trabajador de fondo y carrierwave (todo en su archivo Léame)
Normalmente tengo control sobre mis directorios, así que voy con la opción store_in_background
de carrierwave_backgrounder
que procesa y almacena la imagen en el sistema de archivos o S3 o lo que sea que esté usando
3) Ahora, cuando actualiza la imagen, su procesamiento y almacenamiento se convierte en fondo, lo que libera la instancia de la aplicación, pero lleva un tiempo, en la mayoría de los casos, más de 1 segundo, y debe devolver alguna respuesta al usuario
4) La forma más sencilla de proporcionarle al usuario alguna respuesta es devolver javascript en el que se cambia la imagen anterior a un gif con una ruleta o algo así y establecer la función SetInterval
javascript que comprueba si la imagen se ha procesado ( carrierwave_background
proporciona una función que puede cambiar la columna booleana de su modelo a verdadero cuando está listo para el procesamiento) enviando una solicitud AJAX
cada 2 segundos o lo que prefiera y cambie la imagen cuando haya sido procesada.
Ahora tiene una instancia de aplicación desatada y una excelente experiencia de usuario al mismo tiempo.
PD: Soy nuevo en los raíles y en el desarrollo web per se, así que esta guía puede tener algunas advertencias que me he perdido
Espero que ayude a alguien.
Ah, y dicho sea de paso, está esta nueva gema llamada refile
, es increíble y puede ser una muy buena opción en algunos casos.
Paperclip es bastante impresionante. Hay un excelente RailsCast al respecto - http://railscasts.com/episodes/134-paperclip
Suponiendo que no necesita funciones sofisticadas, no desea agregar una dependencia y desea almacenar la imagen como un BLOB en su base de datos, puede hacer algo como:
Modelo:
class Image < ActiveRecord::Base
def img=(input_data)
self.filename = input_data.original_filename
self.filetype = input_data.content_type.chomp
self.img = input_data.read
end
end
Controlador:
class ImagesController < ApplicationController
def display_img
@img = Image.find(params[:id])
send_data(@img.img, :type => @img.filetype, :filename => @img.filename,
:disposition => ''inline'')
end
end
Aquí hay un enlace a un tutorial más completo.
attachment_fu ( http://github.com/technoweenie/attachment_fu
) es otra opción, aunque yo personalmente recomendaría PaperClip . No requiere Rmagick, que es una gran ventaja, y es compatible con algunas características geniales como las cargas en S3 con una configuración menor.