Je suis nouveau chez Rails, donc désolé si cela est facile. Je me demande quel est le meilleur moyen de télécharger des photos et de les afficher dans Ruby on Rails. J'ai un blog et j'aimerais avoir la possibilité de joindre une photo lors de la création d'un article.
Le trombone est assez génial. Il existe un excellent RailsCast à ce sujet - http://railscasts.com/episodes/134-Paperclip
CarrierWave est un bijou plus récent que Paperclip, et il a l'air beaucoup plus flexible ..__ Il existe également un Railscast à ce sujet: http://railscasts.com/episodes/253-carrierwave-file-uploads
En supposant que vous n’ayez pas besoin de fonctionnalités sophistiquées, que vous ne souhaitiez pas ajouter de dépendance et que vous souhaitiez stocker l’image sous forme de BLOB dans votre base de données, vous pouvez procéder comme suit:
Modèle:
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
Manette:
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
Voici un lien vers un tutoriel plus complet.
Beaucoup recommandent d'utiliser Carrierwave
et je ne suis pas une exception, mais je voulais signaler une chose. Sur de nombreux sites écrits avec RoR (il est évident que ce n’est pas seulement une question de RoR), je remarque que la demande qui envoie l’image peut être en attente pendant environ 2-3 secondes et souvent même davantage, ce qui bloque l’instance de l’application (ce qui n’est probablement pas si terrible si vous utilisez des threads ou ne vous souciez pas beaucoup de la performance, c’est certainement le cas si vous utilisez Unicorn). Je vais donc expliquer comment éviter cela avec carrierwave:
1) Choisissez un travailleur de fond pour votre application (je vais généralement avec Sidekiq)
2) Ajoutez carrierwave_backgrounder
à votre Gemfile et configurez-le pour fonctionner avec votre arrière-plan et carrierwave (tout dans son readme)
J'ai généralement le contrôle de mes répertoires alors je vais avec l'option store_in_background
de carrierwave_backgrounder
qui traite et stocke l'image dans le système de fichiers ou S3 ou tout ce que vous utilisez
3) Maintenant, lorsque vous mettez à jour la photo, son traitement et son stockage passent en arrière-plan, ce qui libère votre instance d'application mais cela prend un certain temps, généralement plus d'une seconde, et vous devez renvoyer une réponse à l'utilisateur.
4) Le moyen le plus simple de donner une réponse à l’utilisateur est de retourner le javascript dans lequel vous changez l’ancienne image en un gif avec spinner ou quelque chose comme ça et en définissant la fonction javascript SetInterval
qui vérifie si la photo a été traitée (carrierwave_background
fournit une fonction cela peut changer la colonne booléenne de votre modèle en true lorsque son traitement est terminé) en envoyant une demande AJAX
toutes les 2 secondes ou ce que vous préférez et en modifiant l'image une fois traitée.
Vous disposez maintenant d’une instance d’application non liée et d’une bonne expérience utilisateur.
Post-scriptum Je suis nouveau dans Rails et dans le développement Web en tant que tel, ce guide peut contenir des mises en garde qui m'ont échappé.
J'espère que ça va aider quelqu'un.
Oh, et à propos, il y a ce nouveau joyau appelé refile
, c'est incroyable et peut être une très bonne option dans certains cas.
CarrierWave est probablement la meilleure solution pour le téléchargement d’images dans Rails . Le post suivant décrit une solution pour le téléchargement d’images à l’aide de CarrierWave lorsque les transformations d’images sont effectuées de manière transparente dans le cloud. Les images téléchargées sont stockées dans le nuage et transmises via un CDN. Pas besoin d’installer RMagick, MiniMagick et ImageMagick . http://cloudinary.com/blog/Ruby_on_Rails_image_uploads_with_carrierwave_and_cloudinary
Beaucoup de gens recommandent Trombone . Peut-être que vous voulez essayer d'utiliser cela en premier.
attachment_fu (http://github.com/technoweenie/attachment_fu
) est une autre option bien que je recommande personnellement Trombone . Il ne nécessite pas Rmagick, ce qui est un avantage considérable, et il prend en charge certaines fonctionnalités intéressantes, telles que le téléchargement sur S3 avec une configuration mineure.
Sept 2018
Pour ceux qui vérifient cette question récemment, Rails 5.2+ a maintenant ActiveStorage par défaut et je recommande vivement de la vérifier.
Comme il fait maintenant partie intégrante du noyau de Rails 5.2+, il est très bien intégré et présente d’excellentes capacités hors de la boîte (tous les autres joyaux connus tels que Carrierwave, Shrine, Paperclip, ... sont excellents, mais celui-ci est très utile. bonnes fonctionnalités que nous pouvons considérer pour tout nouveau projet Rails)
L'équipe de trombones a déconseillé la gemme au profit de Rails ActiveStorage.
Voici la page github pour ActiveStorage & de nombreuses ressources sont disponibles partout