tutorial rails blog ruby-on-rails ruby file-upload blogs

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



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.



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.