Ricerca…


Caricamento di singoli file usando Carrierwave

Iniziare a usare File Uploads in Rails è abbastanza semplice, la prima cosa che devi fare è scegliere il plugin per la gestione dei caricamenti. Le forze più comuni sono Carrierwave e Paperclip . Entrambi sono simili per funzionalità e ricchi di documentazione su

Diamo un'occhiata all'esempio con l'immagine di caricamento avatar semplice con Carrierwave

Dopo l' bundle install Carrierwave, digitare nella console

$ rails generate uploader ProfileUploader

Questo creerà un file di configurazione situato in /app/uploaders/profile_uploader.rb

Qui puoi impostare lo spazio di archiviazione (ad es. Locale o cloud), applicare estensioni per manipolazioni di immagini (ad esempio generare thumbs tramite MiniMagick) e impostare l'elenco bianco di estensioni lato server

Successivamente, crea nuova migrazione con string tipe per user_pic e installa uploader per esso nel modello user.rb.

mount_uploader :user_pic, ProfileUploader

Successivamente, visualizza un modulo per caricare l'avatar (potrebbe essere una vista di modifica per l'utente)

<% 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 %>

Assicurati di includere {multipart: true} nel modulo d'ordine in grado di elaborare i caricamenti. Accept è un optional per impostare la white-list dell'estensione lato client.

Per visualizzare un avatar, fallo semplicemente

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

Modello annidato: più caricamenti

Se si desidera creare più caricamenti, la prima cosa che si potrebbe voler fare è creare un nuovo modello e impostare le relazioni

Supponiamo che tu desideri immagini multiple per il modello del prodotto. Crea un nuovo modello e belongs_to al modello principale

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 è necessario, perché ci consente di creare un modulo annidato, in modo che possiamo caricare nuovo file, cambiare il nome del prodotto e impostare il prezzo da un unico modulo

Successivamente, crea un modulo in una vista (modifica / crea)

    <%= 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 %>

Il controller non è niente di speciale, se non vuoi crearne uno nuovo, creane uno nuovo all'interno del controller del prodotto

  # 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

Mostra tutte le immagini in una vista

    <% @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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow