Ruby on Rails
Bestandsuploads
Zoeken…
Uploaden van één bestand met Carrierwave
Het gebruik van Bestandsuploads in Rails is vrij eenvoudig, het eerste wat u moet doen, is de plug-in kiezen voor het beheren van uploads. De meest voorkomende zijn Carrierwave en Paperclip . Beide zijn vergelijkbaar in functionaliteit en rijk aan documentatie over
Laten we eens kijken met een eenvoudige avatar-uploadafbeelding met Carrierwave
Typ Carrierwave na de bundle install
in de console
$ rails generate uploader ProfileUploader
Hiermee wordt een configuratiebestand gemaakt op /app/uploaders/profile_uploader.rb
Hier kunt u opslag instellen (bijv. Lokaal of cloud), extensies toepassen voor beeldmanipulatie (bijv. Duimen genereren via MiniMagick) en een witte lijst met server-extensie instellen
Maak vervolgens een nieuwe migratie met string tipe voor user_pic en mount de uploader ervoor in het user.rb- model.
mount_uploader :user_pic, ProfileUploader
Geef vervolgens een formulier weer om de avatar te uploaden (dit kan een bewerkingsweergave zijn voor de gebruiker)
<% 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 %>
Zorg ervoor dat u {multipart: true} in het bestelformulier uploads verwerkt. Accepteren is een optionele optie om de witte lijst met extensie aan de clientzijde in te stellen.
Om een avatar weer te geven, gewoon doen
<%= image_tag @user.user_pic.url %>
Genest model - meerdere uploads
Als u meerdere uploads wilt maken, is het eerste wat u wilt doen, een nieuw model maken en relaties instellen
Stel dat u meerdere afbeeldingen voor het productmodel wilt. Maak een nieuw model en zorg dat het belongs_to
uw belongs_to
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 is must, omdat het ons in staat stelt om een genest formulier te maken, zodat we een nieuw bestand kunnen uploaden, de productnaam kunnen wijzigen en de prijs van een enkel formulier kunnen instellen
Maak vervolgens een formulier in een weergave (bewerken / maken)
<%= 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 %>
Controller is niets bijzonders, als u geen nieuwe wilt maken, maakt u gewoon een nieuwe in uw productcontroller
# 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
Toon alle afbeeldingen in een weergave
<% @product.product_photos.each do |i| %>
<%= image_tag i.image.url, class: 'img-rounded' %>
<% end %>