2015-07-29 5 views
1

Я использую жемчужину faye-rails для асинхронного обмена сообщениями между javascript в моем интерфейсе и моем сервере rails. Я могу отправлять сообщения с помощью curl и иметь javascript для печати, поэтому я знаю, что сервер faye запущен. Я могу также прослушивать сообщения на сервере, как это:Опубликовать ошибки с помощью фона Faye-Rails

# In application.rb 
config.middleware.use FayeRails::Middleware, mount: '/bayeux', :timeout => 25 do 
    map '/async/**' => FayeController 
    map :default => :block 
end 

# In faye_controller.rb 
class FayeController < FayeRails::Controller 
    channel '/async/test' do 
    subscribe do 
     puts "Received on channel #{channel}: #{message.inspect}" 
    end 
    end 
end 

Затем я получаю сообщение, отправленное через curl -X POST localhost:3000/bayeux -H 'Content-Type: application/json' -d '{"channel": "/async/test", "data": "test123"}' и получить ожидаемый результат. Однако я не могу отправлять сообщения с сервера. Я ожидал, что Somthing, как это работает, в подписываться блок (так он будет отправлен в ответ на любое сообщение):

FayeController.publish '/async/test', :response => 'something' 

но разбивает весь сервер с ошибкой:

in '+': no implicit conversion of nil into Array (TypeError) 

а затем трассировку стека. Является ли это своей ошибкой - не могу ли я правильно установить что-либо или неправильно прочитать документацию? Или это ошибка в драгоценном камне, и в этом случае у кого-нибудь есть обход?

На самом деле мне пришлось использовать одно обходное решение из-за ошибки в базовой библиотеке faye, см. here.

ответ

1

Вы можете опубликовать Фея сервера, используя запрос HTTP (например, ротор) с сервера

uri = URI.parse("http://localhost:3000/bayeux") 
    begin 
     Net::HTTP.post_form(uri, response: 'something') 
    rescue Errno::ECONNREFUSED 
     puts "Pushing to Faye Failed" 
    end 

--------- Обновление ------------ --------------

предыдущий код должен быть запущен в другом потоке, чтобы предотвратить затор (запустить его в заднем месте работы с использованием resque, например)

You могут использовать следующую публикацию в той же теме

client = Faye::Client.new('http://localhost:3000/bayeux') 
client.publish('/async/test', {response: "something"}) 
+0

Как я могу изменить это для работы на производстве? Мне не представляется возможным жестко задавать URL-адрес сервера в строке. – zrneely

+0

Кроме того, пытаясь использовать этот тупик на сервере - мне пришлось «убить -9» его – zrneely

+0

Для жесткого кодирования url вы можете использовать файлы конфигурации конфигурации «config/environment/development.rb», «config/environment/development.rb», 'config/environment/production. rb', чтобы добавить конфигурацию для faye-сервера 'config.faye_server = 'YOUR_SERVER_URL'', тогда обратитесь к этому с помощью' Rails.configuration.faye_server' – bigsolom