Ruby on Rails
Загрузка файлов
Поиск…
Загрузка одного файла с использованием Carrierwave
Начать загрузку файлов в Rails довольно просто, прежде всего вам нужно сделать выбор плагина для управления загрузками. Наиболее распространенными являются Carrierwave и Paperclip . Оба они похожи по функциональности и богаты документацией по
Давайте посмотрим на пример с простым загружаемым изображением аватара с Carrierwave
После bundle install
Carrierwave введите консоль
$ rails generate uploader ProfileUploader
Это создаст файл конфигурации, расположенный в /app/uploaders/profile_uploader.rb
Здесь вы можете настроить хранилище (то есть локальное или облачное), применять расширения для манипуляций с изображениями (т. Е. Генерировать большие пальцы через MiniMagick) и устанавливать белый список на стороне сервера
Затем создайте новую миграцию с типом строки для user_pic и установите загрузчик для него в модели user.rb.
mount_uploader :user_pic, ProfileUploader
Затем отобразите форму для загрузки аватара (это может быть вид редактирования для пользователя)
<% 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 %>
Обязательно включите {multipart: true} в форме заказа, чтобы обрабатывать закачки. Принять необязательно, чтобы установить белый список списка на стороне клиента.
Чтобы отобразить аватар, просто выполните
<%= image_tag @user.user_pic.url %>
Вложенная модель - несколько загрузок
Если вы хотите создать несколько загрузок, прежде всего вы можете создать новую модель и установить отношения
Предположим, вы хотите получить несколько изображений для модели продукта. Создайте новую модель и сделайте ее 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_attributes_for необходимо, поскольку он позволяет нам создавать вложенную форму, поэтому мы можем загружать новый файл, изменять имя продукта и устанавливать цену из одной формы
Затем создайте форму в представлении (отредактируйте / создайте)
<%= 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 %>
Контроллер ничего особенного, если вы не хотите создавать новый, просто создайте новый в своем контроллере продукта
# 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
Показать все изображения в представлении
<% @product.product_photos.each do |i| %>
<%= image_tag i.image.url, class: 'img-rounded' %>
<% end %>