Ruby on Rails
Przesyłanie plików
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 %>