Внедряване на Pusher chat в Rails

Тъй като няма много актуална информация за най-новите версии на Rails и Pusher, как мога да внедря Pusher в моето Rails приложение, за да получа чат в реално време между потребителите? Документацията на Pusher показва как да направите това със Sinatra, но няма нищо конкретно за Rails...


person Tom Goldenberg    schedule 15.03.2015    source източник
comment
Разгледайте официалния скъпоценен камък https://github.com/pusher/pusher-http-ruby за комуникация с тласкач. Той е актуализиран и много добре документиран.   -  person kobaltz    schedule 15.03.2015


Отговори (1)


Създайте файл за инициализиране

app/config/initializers/pusher.rb

require 'pusher'

Pusher.url    = 'your-pusher-url'
Pusher.logger = Rails.logger

Във вашия контролер да приемем, че това е за съобщения в чат:

app/controllers/messages_controller.rb

MessagesController < ApplicationController
  def create
    model = Message.create params_model
    json  = model.to_json
    channel = "private-conversation.#{params[:user_id]}"
    Pusher[channel].trigger 'messages/create', json
  end

  private
    def params_model
      params.require(:message).permit(:id,:body,:user_id)
    end
end

Упълномощаване

app/controllers/pusher_controller.rb

class PusherController < ApplicationController
  protect_from_forgery except: :auth_notify
  skip_before_filter :login_required, only: [:auth_notify]
  def auth
    channel    = params[:channel_name]
    socket_id  = params[:socket_id]

    valid = false
    valid = true if channel =~ /private-conversation\.(\d+)/

    if valid
      response = Pusher[channel].authenticate socket_id
      render json: response
    else
      render text: 'Not authorized', status: '403'
    end
  end
end

Маршрути:

routes.rb

YourApp::Application.routes.draw do
  resources :messages
  post '/pusher/auth'    => 'pusher#auth'
end

Някъде във вашия coffescript, най-вероятно в application.coffee, това предполага, че имате натискащия cdn js файл във вашия application.html.haml и инсталиран jquery.

$->
    user_id = $('meta[name=user-id]').attr('user_id')
    key     = $('meta[name=pusher-key]').attr('content')
    csrf    = $('meta[name=csrf-token]').attr('content')
    @pusher = new Pusher key,
      auth:
        headers:
          'X-CSRF-Token': csrf
        params:
          user_id: user_id

забележете, че трябва да добавите мета тагове към главата си, така че лесно да вземете csrf token, user_id и pusher key. Разбира се, имате нужда от csrf токен, за да спрете фалшифицирането.

Във вашето приложение.html.haml

!!! XML
!!! 5
%html
  %head
    = csrf_meta_tag
    = tag :meta, name: 'pusher-key', content: "#{current_user.id}"
    = tag :meta, name: 'pusher-key', content: 'pusher_public_key'
  %body
    = javascript_include_tag '//js.pusher.com/2.2/pusher.min.js'
    = javascript_include_tag :application

current_user предполага, че използвате някакъв вид удостоверяване. csrf_meta_tag е вграден помощник за релси. Забележете, че поставих своя js на последния ред от тялото. не поставяйте своя js в главата.

person Andrew WC Brown    schedule 15.03.2015
comment
Андрю възможно ли е да се изпрати частично (create.js.erb: ‹%= j render @message %› вместо json? Бих искал да използвам частичното си _message, тъй като в него има някои условни изрази. - person Sean Magyar; 25.01.2016
comment
Можете просто да го предадете като json, напр. изобразете json: {html: ‹yourhtml› } - person Andrew WC Brown; 12.02.2016