Ruby on Rails
Datei-Uploads
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 %>