Buscar..


Carga de un solo archivo usando Carrierwave

Comenzar a usar Cargas de archivos en Rails es bastante simple, lo primero que debe hacer es elegir el complemento para administrar las cargas. Las más comunes son Carrierwave y Paperclip . Ambos son similares en funcionalidad y ricos en documentación en

Veamos el ejemplo con una imagen de carga de avatar simple con Carrierwave

Después de bundle install Carrierwave, escriba en la consola

$ rails generate uploader ProfileUploader

Esto creará un archivo de configuración ubicado en /app/uploaders/profile_uploader.rb

Aquí puede configurar el almacenamiento (es decir, local o en la nube), aplicar extensiones para manipulaciones de imágenes (es decir, generar pulgares a través de MiniMagick) y configurar la lista blanca de extensiones del lado del servidor

A continuación, cree una nueva migración con el tipo de cadena para user_pic y monte el cargador en el modelo user.rb.

mount_uploader :user_pic, ProfileUploader

A continuación, muestra un formulario para cargar un avatar (puede ser una vista de edición para el usuario)

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

Asegúrese de incluir {multipart: true} en el formulario de pedido para procesar las cargas. Aceptar es opcional para establecer la lista blanca de extensión del lado del cliente.

Para mostrar un avatar, simplemente haga

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

Modelo anidado - subidas múltiples

Si desea crear múltiples subidas, lo primero que debe hacer es crear un nuevo modelo y establecer relaciones

Supongamos que desea varias imágenes para el modelo de producto. Cree un nuevo modelo y belongs_to su modelo principal

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 es must, porque nos permite crear un formulario anidado, por lo que podemos cargar un nuevo archivo, cambiar el nombre del producto y establecer el precio desde un solo formulario

A continuación, crear formulario en una vista (editar / crear)

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

El controlador no es nada especial, si no desea crear uno nuevo, simplemente cree uno nuevo dentro del controlador de su producto

  # 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

Mostrar todas las imágenes en una vista

    <% @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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow