Rails控制器动作导致Faye

时间:2014-08-19 13:33:00

标签: ruby-on-rails ruby json ruby-on-rails-4 faye

我有一个使用Faye gem的rails应用程序。我的rails应用程序分为两个引擎。其中一个引擎有一个控制器。该控制器包含一个名为Index的方法,可以从数据库中获取数据。此方法在jbuilder gem的帮助下使用JSON视图。

所以问题是每当用户订阅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 个答案:

答案 0 :(得分:2)

我建议你使用gem private_pub与faye合作(只需看this就可以了)。使用private_pub,您可以在js代码中的连接回调中触摸您的操作。简单示例(如何连接和配置private_pub - 查看castgem's github page):

在任何控制器中为订阅创建操作(例如)

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
  });
});