Szukaj…


Przesyłanie pojedynczego pliku za pomocą Carrierwave

Rozpoczęcie korzystania z przesyłania plików w Railsach jest dość proste, pierwszą rzeczą, którą musisz zrobić, to wybrać wtyczkę do zarządzania przesyłaniem. Najpopularniejsze to Carrierwave i Paperclip . Oba mają podobną funkcjonalność i bogatą dokumentację

Spójrzmy na przykład z prostym obrazem wysyłania awatara z Carrierwave

Po bundle install Carrierwave wpisz konsolę

$ rails generate uploader ProfileUploader

Spowoduje to utworzenie pliku konfiguracyjnego znajdującego się w /app/uploaders/profile_uploader.rb

Tutaj możesz skonfigurować pamięć (lokalną lub chmurową), zastosować rozszerzenia do manipulacji obrazem (tj. Generowanie kciuków za pomocą MiniMagick) i ustawić białą listę rozszerzeń po stronie serwera

Następnie utwórz nową migrację z tipe ciągiem dla user_pic i zamontuj dla niego uploader w modelu user.rb.

mount_uploader :user_pic, ProfileUploader

Następnie wyświetl formularz do przesłania awatara (może to być widok edycji dla użytkownika)

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

Pamiętaj, aby dołączyć {multipart: true}, aby formularz zamówienia mógł przetwarzać przesyłanie. Zaakceptuj jest opcjonalnym ustawieniem białej listy rozszerzeń po stronie klienta.

Aby wyświetlić awatar, po prostu zrób

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

Model zagnieżdżony - wielokrotne przesyłanie

Jeśli chcesz utworzyć wiele przesyłania, pierwszą rzeczą, którą możesz chcieć zrobić, jest utworzenie nowego modelu i skonfigurowanie relacji

Powiedzmy, że chcesz mieć wiele obrazów dla modelu produktu. Utwórz nowy model i belongs_to aby belongs_to twojego modelu nadrzędnego

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)

jest wymagane, ponieważ accepts_nested_attributes_for pozwala nam utworzyć formularz zagnieżdżony, dzięki czemu możemy przesłać nowy plik, zmienić nazwę produktu i ustalić cenę z jednego formularza

Następnie utwórz formularz w widoku (edytuj / utwórz)

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

Kontroler nie jest niczym specjalnym, jeśli nie chcesz tworzyć nowego, po prostu stwórz nowy w swoim kontrolerze produktu

  # 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

Wyświetl wszystkie obrazy w widoku

    <% @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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow