2015-02-11 90 views
5

導軌在Heroku使用菲4.1.1
紅寶石2.1.1 接入點是https://pacific-savannah-8641.herokuapp.com在生產模式

的Gemfile

source 'https://rubygems.org' 

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' 
gem 'rails', '4.1.1' 
# Use mysql as the database for Active Record 
gem 'mysql2' 
# Use SCSS for stylesheets 
gem 'sass-rails', '~> 4.0.3' 
# Use Uglifier as compressor for JavaScript assets 
gem 'uglifier', '>= 1.3.0' 
# Use CoffeeScript for .js.coffee assets and views 
gem 'coffee-rails', '~> 4.0.0' 
# See https://github.com/sstephenson/execjs#readme for more supported runtimes 
# gem 'therubyracer', platforms: :ruby 

# Use jquery as the JavaScript library 
gem 'jquery-rails' 
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks 
gem 'turbolinks' 
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder 
gem 'jbuilder', '~> 2.0' 
# bundle exec rake doc:rails generates the API under doc/api. 
gem 'sdoc', '~> 0.4.0',   group: :doc 

# Use ActiveModel has_secure_password 
# gem 'bcrypt', '~> 3.1.7' 

# Use unicorn as the app server 
# gem 'unicorn' 

# Use Capistrano for deployment 
# gem 'capistrano-rails', group: :development 

# Use debugger 
# gem 'debugger', group: [:development, :test] 

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem 
gem 'tzinfo-data', platforms: [:mingw, :mswin] 

gem 'slim-rails' 
gem 'devise' 
gem 'cancan' 
gem 'rakismet' 

gem 'carrierwave' 
gem 'rmagick', :require => false 
gem 'faker', '1.0.1' 
gem 'jdbc-mysql', '5.1.28', :platform => :jruby 
gem 'thinking-sphinx', '~> 3.1.0' 
gem 'remotipart', '~> 1.2' 
gem 'kaminari' 
gem 'thin' 
gem 'carrierwave-aws' 

group :production do 
    gem 'rails_12factor', '0.0.2' 
end 

gem 'foreman' 
gem 'faye' 

faye.ru

require 'faye' 
Faye::WebSocket.load_adapter('thin') 
faye_server = Faye::RackAdapter.new(:mount => '/faye', :timeout => 45) 
run faye_server 

application.html.slim

doctype html 
html 
    head 
    title Help Desk App 

    = stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true 
    = javascript_include_tag "application", "data-turbolinks-track" => true 
    = javascript_include_tag "http://localhost:9292/faye.js" 

    = csrf_meta_tags 
    .... 

Procfile

worker: bundle exec foreman start -f Procfile.workers 

Procfile.workers

faye_worker: rackup faye.ru -s thin -E production 

應用程序/資產/ Javascript角/ main.js

$(function() { 
    var faye = new Faye.Client('http://localhost:9292/faye'); 
    faye.subscribe('/posts/new', function (data) { 
     eval(data); 
    }); 
} 

應用程序/傭工/ application_helper.rb

module ApplicationHelper 
    def broadcast(channel, &block) 
    message = {:channel => channel, :data => capture(&block)} 
    uri = URI.parse("http://localhost:9292/faye") 
    Net::HTTP.post_form(uri, :message => message.to_json) 
    end 
end 

Heroku的PS

[email protected]:~/www/help_desk$ heroku ps 
=== run: one-off processes 
run.2182 (1X): up 2015/02/11 08:07:57 (~ 27m ago): `foreman start` 

=== web (1X): `bin/rails server -p $PORT -e $RAILS_ENV` 
web.1: up 2015/02/11 08:35:44 (~ -40s ago) 

=== worker (1X): `bundle exec foreman start -f Procfile.workers` 
worker.1: up 2015/02/11 08:35:42 (~ -38s ago) 
worker.2: up 2015/02/11 08:35:39 (~ -35s ago) 
worker.3: up 2015/02/11 08:35:40 (~ -37s ago) 
worker.4: up 2015/02/11 08:35:39 (~ -36s ago) 

我找不到faye.js: 顯然,參考http://localhost:9292/faye.js無法訪問。

我試圖找到faye.js沒有成功:

https://pacific-savannah-8641.herokuapp.com/faye.js
https://pacific-savannah-8641.herokuapp.com/faye
http://pacific-savannah-8641.herokuapp.com/faye
http://pacific-savannah-8641.herokuapp.com/faye.js
... http://pacific-savannah-8641.herokuapp.com:9292 ...

問題:

我應該如何替換Heroku上的參考文獻http://localhost:9292/faye以便它可以正常工作?

回答

6

我找到了解決方案。
要將Faye與Heroku一起使用,無需添加額外的dynos(即免費),您應該將Faye作爲中間件安裝到您的應用程序中。
關鍵是要在應用程序中添加特定行。RB

require File.expand_path('../boot', __FILE__) 

require 'rails/all' 
require 'net/http' 

Bundler.require(*Rails.groups) 

module Helpdesk 
    class Application < Rails::Application 
    config.middleware.delete Rack::Lock 
    config.middleware.use FayeRails::Middleware, mount: '/faye', :timeout => 25 
    end 
end 

此外,你應該添加faye-rails寶石:

gem 'faye-rails', '~> 2.0' 

的application.js應看:

//= require jquery 
//= require jquery.turbolinks 
//= require jquery_ujs 
//= require jquery.remotipart 
//= require turbolinks 
//= require faye 
//= require_tree . 

然後,我創建應用程序/資產/javascripts/realtime.js.coffee來定義我將如何處理實時消息M服務器:

window.client = new Faye.Client('/faye') 

jQuery -> 
    client.subscribe '/comments', (payload) -> 
    $('.ticket-' + payload.token + ' .no-posts').remove() 

    $('<div></div>') 
     .css({'backgroundColor' : '#ff9f5f'}) 
     .prependTo('.ticket-' + payload.token + ' .posts') 
     .hide() 
     .append(payload.message) 
     .fadeIn('slow') 
     .css({transition: 'background-color 3s ease-in-out', "background-color": "white"}) 

最後,這裏是我發佈一條消息給所有用戶應用程序/視圖/職位/ create.js.coffee

publisher = client.publish('/comments', { 
    message: '<%= j render @post %>', 
    token: '<%= @ticket.token %>' 
}); 

Procfile應與內容:

web: bundle exec rails server thin -p $PORT -e $RACK_ENV 

您可以檢查出所有的代碼上help_desk

+0

非常感謝這一點,似乎在免費的1代動力Heroku計劃中延遲了30秒,但仍比沒有好,直到我查看Pusher等付費選項。 – Amir 2015-03-02 23:19:37

+0

你將如何向控制器的所有用戶發佈消息? – Roko 2017-10-17 07:37:49