Я использую dropzone.js для загрузки изображений.
В моем js-файле coffeescript у меня есть настройка для dropzone:
Dropzone.autoDiscover = false
dropzone = new Dropzone('#item-form',
maxFiles: 1
maxFilesize: 1
paramName: 'item[image]'
headers: "X-CSRF-Token" : $('meta[name="csrf-token"]').attr('content')
addRemoveLinks: true
clickable: '#image-preview'
previewsContainer: '#image-preview'
thumbnailWidth: 200
thumbnailHeight: 200
parallelUploads: 100;
autoProcessQueue: false
uploadMultiple: false)
$('#item-submit').click (e) ->
e.preventDefault()
e.stopPropagation()
if dropzone.getQueuedFiles().length > 0
dropzone.processQueue()
else
$('#item-form').submit()
return
return
Помимо вариантов, нажатие кнопки отправки в моей форме, если присутствует изображение, будет обрабатывать изображение, а если изображения нет, форма все равно будет отправлена.
Далее мой контроллер (соответствующий код):
def create
@item = current_user.items.build(item_params)
respond_to do |format|
if @item.save
format.html { redirect_to @item, notice: 'Item was successfully created.' }
format.json { render :show, status: :created, location: @item }
else
format.html { render :new }
format.json { render json: @item.errors, status: :unprocessable_entity }
end
end
end
Чем моя форма:
= form_for @item, html: {id: 'item-form', class: 'form', multipart: true} do |f|
= f.text_field :name, class: 'form-control'
%main#image-preview
Add a Photo
.fallback
= f.file_field :image, multiple: false
= f.submit 'Done', id: 'item-submit'
Итак, теперь в этой настройке все работает. Прежде чем я получил ошибку Missing Template
, потому что мне нужно было создать шаблон show.json.erb
, и после того, как я это сделал, в журнале появляется следующее:
Started POST "/items" for 127.0.0.1 at 2015-10-16 21:36:18 -0700
Processing by ItemsController#create as JSON
...................
(10.7ms) COMMIT
Item Store (142.4ms) {"id":12}
Rendered items/show.json.erb (0.4ms)
Completed 201 Created in 2759ms (Views: 6.1ms | Searchkick: 142.4ms | ActiveRecord: 11.9ms)
Итак, теперь мне интересно, при использовании JSON или просто в этом сценарии все вместе, как мне перенаправить на страницу отображения элемента, если она продолжает заставлять меня использовать JSON?
ОБНОВИТЬ
При изменении моего ответа при сохранении элемента:
if @item.save
format.html { redirect_to @item }
format.json { redirect_to @item }
else
Он делает это:
Started GET "/items/13" for 127.0.0.1 at 2015-10-16 22:54:29 -0700
Processing by ItemsController#show as JSON
Parameters: {"id"=>"13"}
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 2]]
Item Load (0.4ms) SELECT "items".* FROM "items" WHERE "items"."id" = $1 LIMIT 1 [["id", 13]]
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 2]]
Rendered items/show.json.erb (0.7ms)
Completed 200 OK in 137ms (Views: 7.5ms | ActiveRecord: 25.2ms)
Итак, я думаю, как я должен делать GET
запросы в виде HTML, чтобы он работал правильно?
ОБНОВЛЕНИЕ 2
Я сделал следующее ниже и также должен был создать файл create.json.erb
.
if @item.save
format.html { redirect_to @item }
format.json { redirect_to item_path(@item, format: :html) } and return
else
Started POST "/items" for 127.0.0.1 at 2015-10-16 23:36:13 -0700
Processing by ItemsController#create as JSON............
(12.9ms) COMMIT
Item Store (426.1ms) {"id":18}
Rendered items/create.json.erb (19.6ms)
Completed 200 OK in 3892ms.....
Он по-прежнему не перенаправляет меня, давая мне те же результаты, что и раньше.
ОБНОВЛЕНИЕ 3
Таким образом, format.json { redirect_to item_path(@item) and return}
не перенаправляет на страницу показа, а обрабатывает в JSON. И выполнение format.json { redirect_to item_path(@item, format: :html) and return}
оставляет мне Started GET "/items/19.html
, что неправильно, поскольку вы не можете получить страницу с .html
в конце.
ОБНОВЛЕНИЕ 3
Все еще не повезло с любой вариацией:
format.json {render :show, status: :created, location: item_url(@item, format: :html )}
Я думаю, что мне нужно перенаправить с помощью window.location
, который является частью JavaScript, где-то в моем коде, но мне нужно провести больше исследований. Меня не волнует, смогу ли я заставить это работать в формате js
или html
, пока это работает.
ОБНОВЛЕНИЕ 4
Итак, я смог получить такое же поведение в новом тестовом приложении на моем GitHub здесь: https://github.com/justintech/dropzonetest. Это выдает Invalid JSON response from server.
Итак, я предполагаю, что мое реальное приложение делает то же самое, но оно просто дает сбой и проходит как полный ответ. странный. Не стесняйтесь проверить это.
JSON
) будет успешным? - person illusionist   schedule 25.10.2015JSON
, вы можете удалить все операторыformat.json {}
и убедиться, что все запросы, которые может сделать клиент, находятся вHTML
запросах. - person illusionist   schedule 26.10.2015else
работал при сбое? - person Timmy Von Heiss   schedule 15.08.2016