Suche…


Einzelnes Datei-Upload mit Carrierwave

Die Verwendung von Datei-Uploads in Rails ist ziemlich einfach. Als Erstes müssen Sie ein Plugin für die Verwaltung der Uploads auswählen. Die häufigsten Einflüsse sind Carrierwave und Paperclip . Beide sind in ihrer Funktionalität ähnlich und reich an Dokumentation

Schauen wir uns das Beispiel mit einem einfachen Avatar-Upload-Bild mit Carrierwave an

Nach der bundle install Carrierwave geben Sie die Konsole ein

$ rails generate uploader ProfileUploader

Dadurch wird eine Konfigurationsdatei unter /app/uploaders/profile_uploader.rb erstellt

Hier können Sie Speicher einrichten (z. B. lokal oder in der Cloud), Erweiterungen für Bildmanipulationen anwenden (z. B. Thumbnails über MiniMagick generieren) und serverseitige Erweiterungs-Whitelist festlegen

Erstellen Sie als Nächstes eine neue Migration mit dem String-Tipe für user_pic und stellen Sie den Upload- Uploader im user.rb- Modell bereit .

mount_uploader :user_pic, ProfileUploader

Zeigen Sie als Nächstes ein Formular zum Hochladen des Avatars an (möglicherweise eine Bearbeitungsansicht für den Benutzer).

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

Stellen Sie sicher, dass Sie {multipart: true} in das Bestellformular einschließen, um Uploads zu verarbeiten. Accept ist eine Option zum Festlegen einer clientseitigen Erweiterungs-Whitelist.

Um einen Avatar anzuzeigen, machen Sie einfach

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

Geschachteltes Modell - mehrere Uploads

Wenn Sie mehrere Uploads erstellen möchten, sollten Sie zunächst ein neues Modell erstellen und Beziehungen einrichten

Angenommen, Sie möchten mehrere Bilder für das Produktmodell. Erstellen Sie ein neues Modell und machen Sie belongs_to Ihrem übergeordneten Modell

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 ist ein Muss, da wir damit geschachtelte Formulare erstellen können, sodass wir eine neue Datei hochladen, den Produktnamen ändern und den Preis aus einem einzigen Formular festlegen können

Als Nächstes erstellen Sie ein Formular in einer Ansicht (Bearbeiten / Erstellen).

    <%= 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 ist nichts Besonderes. Wenn Sie keinen neuen erstellen möchten, erstellen Sie einfach einen neuen Controller in Ihrem Produktcontroller

  # 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

Alle Bilder in einer Ansicht anzeigen

    <% @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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow