У меня есть приложение rails с гемом Faye. Мое приложение rails разделено на два движка. У одного из двигателей есть контроллер. Этот контроллер содержит метод под названием Index, который может получать данные из базы данных. Этот метод использует представление JSON с помощью jbuilder gem.

Итак, вопрос в том, что всякий раз, когда пользователь подписывается на канал faye, я хотел бы передать результат этого метода контроллера через этот канал пользователю с форматом JSON. Как я могу это сделать?

Вот мой исходный код:

#/faye.ru

require 'faye'
Faye::WebSocket.load_adapter('thin')
app = Faye::RackAdapter.new(:mount => '/faye', :timeout => 25)
run app



#/engines/restaurant/app/controllers/restaurant/menu_controller.rb

class Restaurant::MenuController < RestaurantController

  def index
    @categories = Category.where("status" => true)
  end

end



#/engines/restaurant/app/views/restaurant/menu/index.json.jbuilder

json.categories @categories do |category|
  json.id category.id
  json.name category.name
  json.image category.image.url
end



#/config/routes.rb

Rails.application.routes.draw do

  root 'restaurant/home#index'

  mount Restaurant::Engine => '/', as: 'restaurant'
end
1
Rustery 19 Авг 2014 в 17:33
Где вопрос?
 – 
Nanego
19 Авг 2014 в 18:49
Как я могу передать результат действия контроллера пользователю через канал, используя FAYE в формате JSON
 – 
Rustery
19 Авг 2014 в 18:58

1 ответ

Лучший ответ

Я советую вам использовать gem private_pub для работы с faye (это очень просто, просто взгляните на this). С помощью private_pub вы можете коснуться своего действия в обратном вызове соединения в js-коде. Простой пример (как подключиться и настроить private_pub - см. cast или страница gem на github):

Создайте действие в любом вашем контроллере для подписки (например)

class YourController < ApplicationController
  def subscription
    @subscription = nil
    # channel_id is your identificator of channel
    @subscription = PrivatePub.subscription(channel: "/channel/#{channel_id}") 
    render json: @subscription.to_json(root: false)
  end
end

В вашем js (если вы используете jquery):

$.getJSON('/controller_path/subscription', function (data) {
  // you can call your action here to load any data you want
  $.getJSON('your action', function(data) { 
    //your code here 
  });
  PrivatePub.sign(data);
  PrivatePub.subscribe(data.channel, function(data, channel) {
    // your code here to process data from faye
  });
});
2
Alexander Kobelev 15 Сен 2015 в 14:33