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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow