Добавлен индикатор загрузки изображений (Paperclip, Javascript), но сами изображения не сохраняются.Как я могу это исправить? - PullRequest
0 голосов
/ 19 февраля 2019

ОБНОВЛЕНИЕ ПЯТЫХ

Я только что выполнил отладчик, и это журнал (стрелка отображается в строке 61), поэтому похоже, что элемент продукта просто потерпит неудачу.

   47:  def create
   48:    @product = Product.new(product_params)
   49:
   50:    respond_to do |format|
   51:      if @product.save
   52:
   53:        if params[:images]
   54:          params[:images].each { |image|
   55:            @product.pictures.create(image: image)
   56:          }
   57:        end
   58:        flash[:notice] = "The product was successfully added."
   59:        redirect_to show_product_path and return
   60:      else
=> 61:        flash[:notice] = "The product was not able to be saved."
   62:        redirect_to new_product_path and return
   63:      end
   64:    end
   65:  end

ОБНОВЛЕНИЕ ЧЕТЫРЕ

Мои извинения, как и в предыдущем обновлении, я что-то пропустил в контроллере Product, только команда перенаправления.

  def create
    @product = Product.new(product_params)

    respond_to do |format|
      if @product.save

        if params[:images]
          params[:images].each { |image|
            @product.pictures.create(image: image)
          }
        end
        flash[:notice] = "The product was successfully added."
        redirect_to show_product_path and return
      else
        flash[:notice] = "The product was not able to be saved."
        redirect_to new_product_path and return
      end
    end
  end

ОБНОВЛЕНИЕ ТРИ

Я только что понял, так как я удалил некоторый код, возможно, я упустил что-то важное.У меня есть модель User, которая:

class User < ActiveRecord::Base
    has_many :products, :dependent => :destroy
end

По сути, пользователь создает продукт, сам продукт имеет изображения, привязанные к нему с помощью модели изображений.Надеюсь, это объясняет все немного яснее.

ОБНОВЛЕНИЕ ВТОРОЕ

Я все еще получаю ту же ошибку, что и выше, но я обновил модели следующим образом:

(изменил пользователей на пользователя, забудьте добавить в foreign_key, необязательно: true не работает, ошибка - это неизвестный ключ)

class Product < ActiveRecord::Base
  belongs_to :user, :foreign_key => 'user_id', optional: true
  has_many :pictures, :dependent => :destroy
end


class Picture < ActiveRecord::Base
  belongs_to :product, optional: true
  has_attached_file :image,
    :path => ":rails_root/public/images/:id/:filename",
    :url  => "/images/:id/:filename"

  do_not_validate_attachment_file_type :image
end

UPDATE ONE

Это журнал, когда я загружаю изображения:

Started POST "/products" for [IP ADDRESS] at [DATE AND TIME]
Processing by ProductsController#create as */*
  Parameters: {"file"=>#<ActionDispatch::Http::UploadedFile:0x007f621971b808 @tempfile=#<Tempfile:/tmp/RackMultipart20190227-181-kldesh.JPG>,     @original_filename="book1.JPG", @content_type="image/jpeg",     @headers="Content-Disposition: form-data; name=\"file\";     filename=\"book1.JPG\"\r\nContent-Type: image/jpeg\r\n">, "product"=>    {"name"=>"test"}}
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1  ORDER BY "users"."id" ASC LIMIT 1  [["id", 21]]
   (0.2ms)  BEGIN
   (0.2ms)  ROLLBACK
Redirected to http://localhost:3000/products/new
Completed 200 OK in 7ms (ActiveRecord: 0.7ms)

По сути, изображения не могут быть сохранены, и он перенаправляет обратно на новую страницу продуктов.Я не могу понять, почему это так.

ОРИГИНАЛЬНЫЙ ВОПРОС

Итак, у меня есть базовая система загрузки изображений с использованием Paperclip (которая позволяет использовать несколько изображенийзагрузки и они связаны с каждым созданным продуктом).Моя проблема сейчас пытается добавить в индикатор загрузки изображения, и после поиска, кажется, Jquery является лучшим для этого.

Я следил за этим: https://github.com/hayageek/jquery-upload-file и я просто не могу заставить его работать.

Итак, у меня есть "Продукты", которые сами связаны с "Картинками"».Продукция имеет отношения один ко многим с изображениями.

Схема:

  create_table "products", force: :cascade do |t|
    t.string   "name"
    t.string   "description"
    t.integer  "image"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "user_id"
  end

  create_table "pictures", force: :cascade do |t|
    t.string   "description"
    t.string   "image"
    t.integer  "product_id"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "product_token"
    t.string   "image_file_name"
    t.string   "image_content_type"
    t.integer  "image_file_size"
    t.datetime "image_updated_at"
  end

Модель:

class Product < ActiveRecord::Base
  belongs_to :users
  has_many :pictures, :dependent => :destroy
end


class Picture < ActiveRecord::Base
  belongs_to :product
  has_attached_file :image,
    :path => ":rails_root/public/images/:id/:filename",
    :url  => "/images/:id/:filename"

  do_not_validate_attachment_file_type :image
end

Контроллер (Продукция):

(Я намеренно пропустил некоторые вещи, но я решил, что главным будет действие create)

  def create
    @product = Product.new(product_params)

    respond_to do |format|
      if @product.save

        if params[:images]
          params[:images].each { |image|
            @product.pictures.create(image: image)
          }
        end
        flash[:notice] = "The product was successfully added."
        format.html { redirect_to @product, notice: 'Product was successfully created.' }
        format.json { render json: @product, status: :created, location: @product }
      else
        flash[:notice] = "The product was not able to be saved."
        format.html { render action: "new" }
        format.json { render json: @product.errors, status: :unprocessable_entity }
      end
    end
  end

View (для новых продуктов) (Опять же, я удалил код, чтобы показать наиболее релевантныйвещи):

<%= form_for @product, :html => { :class => 'form-horizontal', multipart: true } do |f| %>
  <div class="control-group">
    <%= f.label :name, :class => 'control-label' %>
    <div class="controls">
      <%= f.text_field :name, :class => 'text_field' %>
    </div>
  </div>

  <div class="control-group">
    <%= f.label :description, :class => 'control-label' %>
    <div class="controls">
      <%= f.text_field :description, :class => 'text_field' %>
    </div>
  </div>

  <div class="control-group">
    <%= f.label :pictures, :class => 'control-label' %>
    <div class="controls">
      <%= file_field_tag "images[]", type: :file, multiple: true %>
    </div>
  </div>

  <div class="form-actions">
    <%= f.submit nil, :class => 'btn btn-primary' %>
  </div>
<% end %>

Показать (для продуктов):

        <td> Name </td>
        <td> <%= @product.name %> </td>
    <div class = "images_styling"> Photos </div>
    <% @products.pictures.each do |picture| %>
    <%= image_tag picture.images.url(:medium) %>
    <% end %>

Теперь вот что я пытался сделать:

(добавлен идентификатор fileUpload,и идентификатор сохранения в отправке)

Просмотреть форму для новых продуктов

  <div class="control-group">
    <%= f.label :pictures, :class => 'control-label' %>
    <div class="controls" id="fileUpload" >
      <%= file_field_tag "images[]", type: :file, multiple: true %>
    </div>
  </div>

  <div id="save" class="form-actions">
    <%= f.submit nil, :class => 'btn btn-primary' %>
  </div>

И это скрипт, который я получил в Интернете (он присутствует в виде для формы новых продуктов):

<script type="text/javascript">
  $(document).ready(function () {

      var fileUpload = $("#fileUpload").uploadFile({
      url: "/products",
      multiple: true,
      autoSubmit: false,
      showCancel: false,
      showAbort: false,
      dragDrop: true,
      maxFileCount: 4,
      showPreview: true,
      showProgress: true,
      showStatusAfterSuccess: true,
      dynamicFormData: function () {
        var name = $('#product_name').val();
        var data = {"product[name]": name};
        return data;
      }
    });

    $("#save").click(function (e) {
      $("#save").prop("disabled", true);
      fileUpload.startUpload();
      e.preventDefault();
    });


  });

</script>

Но это не работает.Скорее, он делает «начинается», а затем «откаты», когда я нажимаю кнопку отправки.Интересно, что кнопка показывает индикатор выполнения загрузки для каждого изображения.

Однако изображений, когда я смотрю на «шоу» для товара, там нет.Полагаю, изображения не сохраняются в продукте из-за «отката».Я посмотрел на журнал, и кажется, что в нем нет ничего существенного.

Исходя из этого, что я мог сделать, чтобы заставить это работать?Есть ли более простой способ реализовать то, что я хочу сделать?

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

В соответствии с журналом, выполнение никогда не завершается успешно в строке if @product.save ProductsController#create.

Используя логгер или отладчик, можете ли вы сказать, выполняет ли выполнение действие вообще?

Есть ли before_action или around_action в этом контроллере или любом суперклассе (включая миксины), который перенаправляет на /products/new?


А, так что @product.save не работает.Измените его на @product.save!, что вызовет исключение вместо того, чтобы возвращать «успех ложно», и взгляните на то, что вызвало исключение.

0 голосов
/ 27 февраля 2019

Rails 5+ делает все belongs_to отношения обязательными по умолчанию .Решите вашу проблему, либо установив :user и :product в своей форме, либо в контроллере или модели, либо сделав оба параметра optional: true.

. Также вы не можете иметь belongs_to :users (то есть принадлежать-Много не вещь).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...