2016-08-23 3 views
0

私のRailsアプリは、私がjbuilderは(私は私のmodels/index.json.jbuilderファイルにカスタムフィールドを追加している)が呼び出されたことを確認するためにApplicationController.renderを呼んでいる、アクションケーブルを経由してJbuilderを呼び出して、レンダリングされた文字列の代わりにネイティブRailsオブジェクトを作成できますか?

ActionCable.server.broadcast 'model_channel', models: (ApplicationController.render 'models/index.json', assigns: { models: Model.all })

をレコードのセットを放送します。

broadcast引数が文字列に変換されない限り、すべて正常に動作するため、JavaScriptハンドラでデータを使用するにはJSON.parse(data['models'])を呼び出す必要があります。

私のペイロードを文字列にするのを避けるためにRuby側でできることはありますか?クライアント側で解析しますか?

答えて

1

私はクライアント側でJSONデータを返すために、次のヘルパーを使用し

module ChannelHelper 
    def render_view(params) 
    ApplicationController.render(params) 
    end 

    def render_json(params) 
    JSON.parse render_view(params) 
    end 

    def broadcast channel, message 
    ActionCable.server.broadcast channel, message 
    end 
end 

# Be sure to restart your server when you modify this file. Action Cable runs in a loop that does not support auto reloading. 
class NotesChannel < ApplicationCable::Channel 
    include ChannelHelper 

    def subscribed 
    stream_from "notes_channel" 
    end 

    def unsubscribed 
    # Any cleanup needed when channel is unsubscribed 
    end 

    def random 
    broadcast 'notes_channel', render_json(
     template: 'notes/ws_random', 
     locals: { note: Note.random.first } 
    ) 
    end 
end 

Aは、それがどのように動作するかを実証私のペットプロジェクトを形成コミット

チャネルでその後

https://github.com/DeployRB/Rails5App/commit/14485b2c3311e6bd25e6ce841f2f7ee3f83954ff

0

Jbuilderを直接使用することができます。例えば、このコードのように、レンダラに外部ビルダーインスタンスに渡すことによって、その解析するステップ)なし:あなたは典型的なRailsの足場を使用している場合

class ReservationChannel < ApplicationCable::Channel 
    def subscribed 
    reservation = Reservation.find(params[:reservation_id]) 
    stream_for reservation 
    end 

    def self.reservation_update(reservation) 
    broadcast_to reservation, reservation_data_for_json(reservation) 
    end 

    private 

    def self.reservation_data_for_json(reservation) 
    Jbuilder.new do |json| 
     ApplicationController.render(
     template: 'reservation/index.jbuilder', 
     locals: { reservation: reservation, json: json } 
    ) 
    end.attributes! 
    end 
end 
0

、あなたはこのような何かを行うことができます(この例では@modelを前提としていコントローラのように、あなたが望むモデルに設定されています):

json = ApplicationController.render(partial: 'model/model.json', locals {model: @model}) JSON.parse(json)

関連する問題