Bagaimana Anda mengarahkan ulang ke halaman ketika respons terus muncul di JSON?

Saya menggunakan dropzone.js untuk mengunggah gambar.

Dalam file js coffeescript saya, saya memiliki pengaturan untuk 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

Selain opsi, klik tombol kirim di formulir saya, jika ada gambar, gambar akan diproses dan jika tidak ada gambar, tetap kirimkan formulir.

Berikutnya adalah pengontrol saya (kode yang relevan):

  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

Dari formulir saya:

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

Jadi sekarang pengaturan ini semuanya berfungsi. Sebelum saya mendapat kesalahan Missing Template karena saya perlu membuat templat show.json.erb dan setelah saya melakukannya, saya mendapat ini di log:

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)

Jadi sekarang saya bertanya-tanya kapan menggunakan JSON atau hanya dalam skenario ini secara bersamaan, bagaimana cara mengalihkan ke halaman tampilan item jika terus memaksa saya untuk menggunakan JSON?

MEMPERBARUI

Saat mengubah respons saya saat item disimpan:

if @item.save
  format.html { redirect_to @item }
  format.json { redirect_to @item }
else

Ini melakukan ini:

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)

Jadi saya yakin bagaimana saya harus melakukan GET permintaan sebagai HTML agar dapat berfungsi dengan benar?

PEMBARUAN 2

Saya melakukan hal berikut di bawah ini dan harus membuat file create.json.erb juga.

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

Itu masih tidak mengarahkan saya memberi saya hasil yang sama seperti sebelumnya.

PEMBARUAN 3

Jadi melakukan format.json { redirect_to item_path(@item) and return} tidak mengalihkan ke halaman pertunjukan tetapi memproses di JSON. Dan melakukan format.json { redirect_to item_path(@item, format: :html) and return} menyisakan Started GET "/items/19.html yang salah karena Anda tidak bisa mendapatkan halaman dengan .html di akhir.

PEMBARUAN 3

Masih belum berhasil dengan variasi apa pun:

format.json {render :show, status: :created, location: item_url(@item, format: :html )}

Saya pikir saya harus mengalihkan dengan window.location yang merupakan bagian dari JavaScript, di suatu tempat dalam kode saya tetapi perlu melakukan penelitian lebih lanjut. Saya tidak peduli apakah saya dapat menjalankannya dalam format js atau html selama masih berfungsi.

PEMBARUAN 4

Oke, jadi saya bisa mendapatkan perilaku yang sama dalam aplikasi pengujian baru di GitHub saya di sini: https://github.com/justintech/dropzonetest. Yang ini menampilkan Invalid JSON response from server. Jadi saya kira aplikasi saya yang sebenarnya melakukan hal yang sama tetapi hanya mengalami gangguan dan lolos sebagai respons lengkap. aneh. Jangan ragu untuk memeriksanya.


person John Huntington    schedule 17.10.2015    source sumber
comment
apa yang ingin Anda tanggapi jika create_action Anda (dalam format JSON) berhasil?   -  person illusionist    schedule 25.10.2015
comment
@illusionist HTML jika memungkinkan.   -  person John Huntington    schedule 26.10.2015
comment
jika Anda tidak akan pernah merespons dengan format JSON maka Anda dapat menghapus semua pernyataan format.json {} dan memastikan bahwa semua permintaan yang dapat dibuat klien ada dalam permintaan HTML   -  person illusionist    schedule 26.10.2015
comment
apakah Anda akhirnya membutuhkan file js.erb? itu tidak ditampilkan dalam kode tetapi Anda menyebutkannya. saya bisa membuat proyek serupa saya berfungsi tanpanya.   -  person Timmy Von Heiss    schedule 15.08.2016
comment
apakah Anda memeriksa apakah kode pengontrol else berfungsi dengan gagal?   -  person Timmy Von Heiss    schedule 15.08.2016


Jawaban (3)


Lupakan bagian format jika Anda ingin kedua format merespons sama. Yang Anda butuhkan hanyalah pengalihan. Coba saja redirect_to(@item).

Edit:

Saya melihat kode Anda. Saya menemukan bahwa yang berikut ini berfungsi:

item_controller.rb:

def create
  @item = Item.new(item_params)

  respond_to do |format|
    if @item.save
      format.html { redirect_to @item, notice: 'Item was successfully created.' }
      format.json { render json: @item }
    else
      format.html { render :new }
      format.json { render json: @item.errors, status: :unprocessable_entity }
    end
  end
end

di item.kopi:

$(document).ready ->
  # disable auto discover
  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()

  dropzone.on 'success', (file, responseText) ->
    window.location.href = '/items/' + responseText.id
person Bassel Samman    schedule 25.10.2015
comment
Itu tidak berhasil. Itu masalah aslinya, makanya saya harus memformatnya atau apalah. Ada yang aneh dengan cara kerja Dropzone.js. - person John Huntington; 26.10.2015
comment
Oke, apakah Anda yakin simpanannya berhasil. Mungkin gagal dan malah mencoba merender. Anda dapat mengubah arah render dengan meneruskan opsi lokasi. - person Bassel Samman; 26.10.2015
comment
jika Anda melihat UPDATE 2 di atas, penyimpanan sudah selesai dan dapat mengakses halaman tampilan item. Hanya pengalihan saja yang tidak terjadi. Area gambar dropzone.js akan diproses dan setelah selesai, halaman tersebut tetap sama. - person John Huntington; 26.10.2015
comment
Sebenarnya apa yang kamu lakukan awalnya benar, jadi aneh. Anda dapat mencoba mengubahnya dengan ini untuk berjaga-jaga: format.json { render :show, status: :created, location: item_url(@item)} - person Bassel Samman; 26.10.2015
comment
Saya mencoba mengubah status menjadi success dan redirect dan juga format menjadi html tetapi masih belum berhasil. - person John Huntington; 26.10.2015
comment
@JohnHuntington bisakah Anda membantu saya menulis dropzone.on 'failure' di pertanyaan ini -- stackoverflow.com/questions/38960487/ - person Timmy Von Heiss; 15.08.2016

Jika Anda ingin redirect_to halaman items show seperti yang Anda lakukan untuk format html, mengapa tidak melakukan hal yang sama untuk format json juga?:

  if @item.save
    format.html { redirect_to @item, notice: 'Item was successfully created.' }
    format.json { redirect_to @item, notice: 'Item was successfully created.' }
  # rest of your codes
  end
person K M Rakibul Islam    schedule 17.10.2015
comment
Terima kasih sejauh ini sepertinya saya berada di jalur yang benar. Lihat hasil edit saya untuk melihat apa yang terjadi jika saya melakukan apa yang Anda katakan. - person John Huntington; 17.10.2015
comment
Bagaimana dengan redirect_to item_path(@item, format: :html)? - person K M Rakibul Islam; 17.10.2015
comment
Ini aneh. Ia mengembalikan Processing by ItemsController#show as HTML sebagaimana mestinya tetapi masih tetap berada di halaman yang sama. - person John Huntington; 17.10.2015
comment
bisakah Anda mencoba: redirect_to item_path(@item, format: :html) and return? - person K M Rakibul Islam; 17.10.2015
comment
Itu membuat saya harus membuat create.json.erb yang merender Rendered items/create.json.erb. Kecuali saya tidak meletakkannya di tempat yang tepat. Lihat hasil edit saya jika perlu. - person John Huntington; 17.10.2015
comment
Saat ini. tidak begitu yakin apakah itu benar-benar mungkin. Bisakah Anda memposting file routes.rb Anda? Saya akan memeriksanya dan menghubungi Anda kembali. - person K M Rakibul Islam; 17.10.2015
comment
Ini adalah rute saya di tautan inti ini: gist.github.com/justintech/db7bfa5b494d77b7ad2d - person John Huntington; 17.10.2015
comment
itu harus diproses dengan tindakan show TETAPI bukan create. - person K M Rakibul Islam; 17.10.2015
comment
coba yang ini: format.json { redirect_to item_path(@item, format: :html) and return} pengembalian Anda di luar blok. - person K M Rakibul Islam; 17.10.2015
comment
Saya rasa saya memahami masalahnya. Apakah seharusnya melakukan ini? Started GET "/items/19.html? Dengan kata .html di akhir tautan. Kelihatannya aneh. - person John Huntington; 17.10.2015
comment
mungkin karena kami menentukan: format: :html, jika Anda menghapusnya, maka itu akan hilang. - person K M Rakibul Islam; 17.10.2015
comment
Bisakah Anda mereproduksi masalah tersebut dalam proyek terpisah dan membagikan tautan github sehingga kami dapat melihatnya secara lokal? - person K M Rakibul Islam; 27.10.2015
comment
Oke, jadi saya bisa mendapatkan perilaku yang sama dalam aplikasi pengujian baru di GitHub saya di sini: github.com/ justintech/dropzonetest. Yang ini menampilkan Invalid JSON response from server. Jadi saya kira aplikasi saya yang sebenarnya melakukan hal yang sama tetapi hanya mengalami gangguan dan lolos sebagai selesai. aneh. - person John Huntington; 27.10.2015
comment
Saya mencoba membuatnya berfungsi seperti yang Anda inginkan, tetapi sepertinya tidak ada yang berfungsi sesuai keinginan Anda. Cobalah berpikir dengan cara berbeda, coba pikirkan kembali masalah aslinya. Apa tujuan akhir Anda? Apa yang sebenarnya ingin Anda capai? Saya yakin ada cara yang lebih baik untuk melakukan itu! Anda hanya perlu mengatasi masalah dari sudut yang berbeda. - person K M Rakibul Islam; 27.10.2015
comment
Ya, saya sedang berpikir untuk menambahkan gambar di halaman lain. Selamat mencoba. Saya menghargainya. - person John Huntington; 27.10.2015

FYI

Kalimat Anda:
format.json { redirect_to item_path(@item, format: :html) and return} menyisakan Started GET "/items/19.html yang salah karena Anda tidak bisa mendapatkan halaman dengan .html di akhir.

ini tidak diproses seperti yang Anda pikirkan; Rails tidak mencari halaman seperti 1.html, ia meneruskan nomor 1 sebagai params[:id] = 1 dan html sebagai format permintaan.

Karena ada .html dalam permintaan

format.html {} diaktifkan jika tidak format.json {} akan diaktifkan jika permintaannya /1.json

person illusionist    schedule 25.10.2015
comment
Namun padahal format.html sudah diaktifkan. Itu masih akan menggunakan JSON untuk mengirimkan formulir saya. Tapi ini baik-baik saja. Yang ingin saya lakukan adalah setelah gambar saya diproses, buka halaman berikutnya apakah memungkinkan pada HTML atau JS. - person John Huntington; 26.10.2015
comment
bagaimana formulir diserahkan; melalui AJAX atau biasa Form submit? ; terlebih lagi standar mengatakan bahwa jika klien meminta JSON Anda harus merespons dengan data JSON apa pun yang terjadi. - person illusionist; 26.10.2015
comment
Itu dikirimkan oleh JSON ketika ada gambar tetapi jika tidak ada gambar, maka itu akan melakukan HTML biasa - person John Huntington; 26.10.2015