У меня есть приложение 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 ответ
Я советую вам использовать 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
});
});
Похожие вопросы
Новые вопросы
ruby-on-rails
Ruby on Rails - это полнофункциональная платформа веб-приложений с открытым исходным кодом, написанная на Ruby. Он следует популярной модели фреймворка MVC и известен своим подходом «соглашение поверх конфигурации» при разработке приложений.