Ruby on Rails
Upload di file
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 %>