Sök…


Uppladdning av en fil med Carrierwave

Börja använda File Uploads in Rails är ganska enkelt, det första du måste göra är att välja plugin för att hantera uppladdningar. De vanligaste krafterna är Carrierwave och Paperclip . Båda har liknande funktionalitet och är rik på dokumentation om

Låt oss ta en titt på exempel med enkel avataruppladdningsbild med Carrierwave

Skriv bundle install Carrierwave

$ rails generate uploader ProfileUploader

Detta skapar en konfigurationsfil som finns på /app/uploaders/profile_uploader.rb

Här kan du ställa in lagring (dvs lokalt eller moln), tillämpa tillägg för bildmanipulationer (dvs. skapa tummar via MiniMagick) och ställa in vitlista på serverns förlängning

Skapa sedan ny migrering med strängtyp för user_pic och montera uppladdare för den i user.rb- modellen.

mount_uploader :user_pic, ProfileUploader

Visa sedan ett formulär för att ladda upp avatar (kan vara en redigeringsvy för användaren)

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

Se till att inkludera {multipart: true} i ordningsformuläret kan behandla uppladdningar. Accept är ett valfritt för att ställa in vitlista på klientsidan-förlängningen.

För att visa en avatar, helt enkelt göra

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

Kapslad modell - flera uppladdningar

Om du vill skapa flera uppladdningar är det första du kanske vill göra en ny modell och skapa relationer

Låt oss säga att du vill ha flera bilder för produktmodellen. Skapa en ny modell och gör att den belongs_to din 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)

accepts_nested_attribut_for är måste, eftersom det tillåter oss att skapa kapslad form, så vi kan ladda upp ny fil, ändra produktnamn och fastställa pris från en enda form

Skapa sedan form i en vy (redigera / skapa)

    <%= 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 är inget speciellt, om du inte vill skapa en ny, bara skapa en ny inuti din produktkontroller

  # 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

Visa alla bilder i en vy

    <% @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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow