Recherche…


Téléchargement de fichier unique avec Carrierwave

Commencer à utiliser les téléchargements de fichiers dans Rails est assez simple, la première chose à faire est de choisir le plug-in pour gérer les téléchargements. Les plus courants sont Carrierwave et Paperclip . Les deux sont des fonctionnalités similaires et riches en documentation sur

Prenons un exemple avec une image téléchargée par avatar simple avec Carrierwave

Après avoir bundle install Carrierwave, tapez console

$ rails generate uploader ProfileUploader

Cela va créer un fichier de configuration situé dans /app/uploaders/profile_uploader.rb

Ici, vous pouvez configurer le stockage (local ou cloud), appliquer des extensions pour les manipulations d'images (c.-à-d. Générer des vignettes via MiniMagick) et définir la liste blanche des extensions côté serveur.

Ensuite, créez une nouvelle migration avec string tipe pour user_pic et montez-la dans le modèle user.rb.

mount_uploader :user_pic, ProfileUploader

Ensuite, affichez un formulaire pour télécharger l'avatar (peut être une vue d'édition pour l'utilisateur)

<% form_for @user, html: { multipart: true } do |f| %>
    <%= f.file_field :user_pic, accept: 'image/png, image/jpg' %>
    <%= f.submit "update profile pic", class: "btn" %>
<% end %>

Assurez-vous d'inclure {multipart: true} dans le formulaire de commande peut traiter les téléchargements. Accept est une option pour définir la liste blanche des extensions côté client.

Pour afficher un avatar, faites simplement

<%= image_tag @user.user_pic.url %>

Modèle imbriqué - téléchargements multiples

Si vous souhaitez créer plusieurs téléchargements, la première chose à faire est de créer un nouveau modèle et de définir des relations.

Supposons que vous souhaitiez plusieurs images pour le modèle de produit. Créer un nouveau modèle et le faire belongs_to modèle parent

rails g model ProductPhoto

#product.rb
has_many :product_photos, dependent: :destroy
accepts_nested_attributes_for :product_photos

#product_photo.rb
belongs_to :product
mount_uploader :image_url, ProductPhotoUploader # make sure to include uploader (Carrierwave example)

accept_nested_attributes_for est indispensable, car il nous permet de créer un formulaire imbriqué, afin que nous puissions télécharger un nouveau fichier, modifier le nom du produit et définir le prix à partir d'un seul formulaire

Ensuite, créez un formulaire dans une vue (edit / create)

    <%= form_for @product, html: { multipart: true } do |product|%>

        <%= product.text_field :price # just normal type of field %>

        <%= product.fields_for :product_photos do |photo| # nested fields %>
            <%= photo.file_field :image, :multiple => true, name: "product_photos[image_url][]" %>
        <% end %>
        <%= p.submit "Update", class: "btn" %>
    <% end %>

Le contrôleur n'a rien de spécial, si vous ne voulez pas en créer un nouveau, créez-en un nouveau dans votre contrôleur de produit.

  # create an action
  def upload_file
    printer = Product.find_by_id(params[:id])
    @product_photo = printer.prodcut_photos.create(photo_params)
  end

  # strong params
  private
    def photo_params
      params.require(:product_photos).permit(:image)
    end

Afficher toutes les images dans une vue

    <% @product.product_photos.each do |i| %>
        <%= image_tag i.image.url, class: 'img-rounded' %>
    <% end %>


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow