ОБНОВЛЕНИЕ ПЯТЫХ
Я только что выполнил отладчик, и это журнал (стрелка отображается в строке 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>
Но это не работает.Скорее, он делает «начинается», а затем «откаты», когда я нажимаю кнопку отправки.Интересно, что кнопка показывает индикатор выполнения загрузки для каждого изображения.
Однако изображений, когда я смотрю на «шоу» для товара, там нет.Полагаю, изображения не сохраняются в продукте из-за «отката».Я посмотрел на журнал, и кажется, что в нем нет ничего существенного.
Исходя из этого, что я мог сделать, чтобы заставить это работать?Есть ли более простой способ реализовать то, что я хочу сделать?