Я использую dropzone.js для загрузки изображений.
В моем файле coffeescript js у меня есть настройка для 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 или просто в этом сценарии, как мне перенаправить на страницу show item, если она заставит меня использовать 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.
Итак, я предполагаю, что мое реальное приложение делает то же самое, но оно просто глючит и проходит как полный ответ. странно. Не стесняйтесь проверить это.