/ / Railsコントローラの動作により、Faye-ruby-on-rails、ruby、json、ruby-on-rails-4、faye

Faye-ruby-on-rails、ruby、json、ruby-on-rails-4、fayeのRailsコントローラアクションの結果

私はフェイの宝石とレールのアプリケーションを持っています。 私のレールアプリケーションは2つのエンジンに分かれています。エンジンの1つにコントローラーがあります。このコントローラーには、データベースからデータを取得できる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は2

私はあなたに宝石を使うよう助言する private_pub フェイと一緒に働くことはとても簡単です この)。 private_pubを使用すると、jsコードの接続コールバックでアクションに触れることができます。簡単な例(private_pubを接続して設定する方法 - 見る キャスト または 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
});
});