Menggunakan Pub pribadi dengan saluran yang memiliki kunci segmen dan varian skrip kopi

Saya mencoba mereplikasi sistem pemberitahuan push yang mirip dengan Facebook menggunakan private_pub. Idealnya saya ingin menautkan ini untuk menampilkan pemberitahuan menggunakan permata seperti gritter (saran permata lainnya dipersilakan )

Setiap kali tindakan tertentu dari pengontrol dipanggil, saya ingin mengirimkan pemberitahuan ke semua pelanggan yang merupakan bagian dari id tertentu. Selama Anda masuk, Anda berlangganan saluran tersebut, dicapai dengan menempatkan subscribe_to di tata letak.

dalam tampilan:

<%= subscribe_to "/messages/#{@group_id}" %>

di pengontrol

PrivatePub.publish_to("/messages/#{@group_id}", "alert('test')")

ini berfungsi dengan baik, namun saya ingin mendapatkan sesuatu yang lebih canggih daripada alert sebagai respons (seperti pemberitahuan yang lebih kasar), jadi sebagai gantinya:

PrivatePub.publish_to("/messages/#{@group_id}", data: @some_data)

Mengikuti tutorial, mereka menggunakan skrip kopi untuk ini. Namun, saya tidak dapat mengaktifkan peringatan sederhana (mungkin karena id di saluran)

Dalam ini pertanyaan, OP dapat menyelesaikannya menggunakan tampilan js.erb. Tapi saya tidak bisa membuatnya berfungsi.

penafian: pengetahuan js dan coffeescript saya hampir nol.

Bantuan apa pun dihargai :)


EDIT

Beberapa info lebih lanjut: Saya memiliki metode di pengontrol yang merupakan bagian dari API publik, dan mengharapkan permintaan POST. Jika semuanya baik-baik saja, respons sukses JSON akan dikirimkan. Selain itu, metode yang sama mengirimkan pemberitahuan ke semua pengguna grup tertentu.

Saya sebenarnya berhasil membuat ini berfungsi, menempatkan ini di pengontrol:

metode panggilan balik:

respond_to do |format|
    format.js #-> calls callback.js.erb
    #format.json { render json: {"success" => true}.to_json }
end

dan memasukkan barang-barang yang lebih kasar ke dalam my_api_controller/callback.js.erb:

<% publish_to "/messages/#{@group_id}" do %>
    <%= add_gritter(
    "Nova " + link_to("reserva", reservation_path(@r)) + " de #{@channel} para " + 
    link_to(@hostel_name, hostel_path(@hostel_id)),
    :title => "Nova reserva!",
    :sticky => true,
    :image => :notice
) %>
<% end %>

catatan: karena langganan saluran dilakukan di setiap tampilan (melalui tata letak), Anda dapat menerima pemberitahuan di halaman/tampilan mana pun

Masalah saya saat ini adalah, seperti yang bisa Anda tebak, respons JSON. Karena saya tidak dapat merender dua respons, hanya js.erb yang dipanggil, tetapi respons JSON tidak pernah terkirim


person Cristiano Sousa    schedule 14.01.2014    source sumber
comment
Akan segera menyarankan penggunaan JS untuk ini. Izinkan saya menulis jawabannya   -  person Richard Peck    schedule 14.01.2014


Jawaban (3)


Meskipun saya tidak punya banyak pengalaman dengan permata ini, berikut ini sesuatu yang mungkin bisa membantu:


JS

Di sisi klien, JS Anda pada dasarnya menjalankan eventlistener pada objek private_pub (ditentukan saat Anda menyertakan private_pub / gritter JS di halaman Anda), yang dapat Anda gunakan untuk melakukan tindakan lain (peringatan panggilan, menambahkan data ke halaman, dll)

Tampaknya back-end Anda berfungsi, hanya penerimaan & pemrosesan data dari server yang bermasalah. Untuk mengatasinya, Anda dapat melakukan 2 hal: 1) menjalankan panggilan JS standar dari application.js atau menjalankan file js dari tindakan pengontrol Anda:


Pengontrol

Menurut dokumentasi private_pub, Anda harus melakukan ini untuk membuat file JS:

#app/controllers/your_controller.rb
def create
    @message = "Hello"

    respond_to do |format| 
        format.html { PrivatePub.publish_to("/messages/#{@group_id}", "alert('test')") }
        format.js #-> calls create.js.erb
    end
end 

#app/views/your_controller/create.js.erb
<% publish_to "/messages/new" do %>
  $("#chat").append("<%= j render(@messages) %>");
<% end %>

Peramban

#app/assets/javascripts/application.js.coffee
PrivatePub.subscribe("/messages/new", (data, channel) ->
      alert data.message.content
person Richard Peck    schedule 14.01.2014
comment
Terima kasih atas tanggapannya, saya telah mengedit pertanyaan saya untuk informasi lebih lanjut - person Cristiano Sousa; 15.01.2014

Saya dapat melakukannya dengan langsung menambahkan skrip gritter dalam metode publish_to pub Privat.

Di pengontrol saya:

PrivatePub.publish_to 
  "/some/URI/#{entity.id}"
 ,"jQuery.gritter.add({
      image: '#{ActionController::Base.helpers.asset_path('notice.png')}'
    , sticky: true
    ,title:'#{t('some_title')}'
    , text: '#{t('some text'}' 
});"

render json: {"error"=>{"code"=>20,"msg"=>e.message},"success" => false}.to_json

Pada dasarnya, saya dapat memublikasikan ke PrivatePub tanpa menggunakan respons html, yang memungkinkan saya mengembalikan respons JSON sebagaimana dimaksud.

person Cristiano Sousa    schedule 11.03.2015

Saya rasa, Anda dapat mengatasi masalah Anda dengan bantuan permata gon seperti di bawah ini:

In view

<%= subscribe_to "/messages/#{@group_id}" %>

In controller

gon.group_id = @group_id
PrivatePub.publish_to("/messages/#{@group_id}", message: @message)

In messages.coffee

if gon.group_id
  PrivatePub.subscribe "/messages/#{gon.group_id}", (data, channel) ->
    jQuery.gritter.add
      image: '/assets/notice.png'
      title: 'Notification!'
      text: data.message.content

Tapi, gon.group_id terkadang bisa menimbulkan masalah jadi kamu harus menjaganya.

Jadi, saya sarankan untuk menggunakan js.erb yang mudah dan kita dapat mengakses variabel controller's dengan mudah di file js.erb.

Semoga itu menjawab masalah Anda.

person przbadu    schedule 10.03.2015