Поиск…


Загрузка одного файла с использованием 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 %>


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow