Простой способ интегрировать Фэй с Синатрой в один файл?

Есть ли простой способ интегрировать Фэй с Синатрой в один файл, например:

# myapp.rb
require 'sinatra'
require 'faye'

get '/' do 
  'Hello world!' 
end

get '/faye_form' do
  erb :form_and_message_list
end

post '/faye_form' do
  erb :form_and_message_list
  # will send messages to faye's channel here.
end

ruby myapp.rb

так что, когда я запускаю "ruby myapp.rb", я запускаю серверы Faye и Sinatra в одном процессе (я думаю, они будут на одном порту?)?

или: что ближе всего к этому, с целью интегрировать Фэй в Синатру самым «минималистичным» способом?

обновление: исправлен код примера, чтобы не было похоже, что я заинтересован в том, чтобы Фэй и Синатра находились по одному и тому же пути;)


person jj_    schedule 16.12.2012    source источник


Ответы (2)


Адаптировано с http://faye.jcoglan.com/ruby.html

# config.ru
require 'sinatra'
require 'faye'
require File.expand_path('../app', __FILE__)

use Faye::RackAdapter, :mount => '/faye', :timeout => 25

run Sinatra::Application

И Sinatra, и Faye являются стоечными приложениями, и вы, вероятно, захотите, чтобы они работали по разным путям, как с Faye в /faye. Вы также можете смонтировать faye в / и свое приложение Sinatra в другом месте, хотя я думаю, что вам нужно будет создать «модульное» приложение Sinatra для этого, а затем что-то вроде:

run Rack::URLMap.new("/app" => MyApp.new)

В вашем примере вы как бы пытаетесь использовать их обоих по одному и тому же пути, что, я думаю, не сработает.

person Community    schedule 17.12.2012
comment
Упс, простите за неточность моего примера. Я хотел сделать именно то, что вы описали в своем примере кода (кстати, я с самого начала проверил веб-сайт Faye, но когда я это сделал, я почти ничего не знал о Rack, поэтому я не мог понять, что этот код идеально подходит мой вариант использования..). Спасибо, исправлю свой пример. - person jj_; 19.12.2012

Я создал пример того, как Синатра и Фэй могут просто работать вместе. Вы можете просмотреть его здесь: https://github.com/eterry1388/sinatra-faye-example

Ваш config.ru может выглядеть так:

require 'faye'
require 'sinatra'

set :port, 9292
set :faye_client, Faye::Client.new( 'http://localhost:9292/faye' )
set :saved_data, Hash.new( [] )

get '/' do
  # This loads the saved data so if the web page is refreshed
  # or a new client connects, the data persists.
  @saved_data = settings.saved_data
  erb :index
end

post '/' do
  channel = params['channel']
  message = params['message']

  # Send data out to connected clients
  settings.faye_client.publish( channel, message )

  # Save data for future clients
  settings.saved_data[channel] += [message]

  redirect to( '/' )
end

Faye::WebSocket.load_adapter 'thin'
use Faye::RackAdapter, mount: '/faye', timeout: 45, extensions: []
run Sinatra::Application

И ваш index.erb может выглядеть так:

<script type="text/javascript" src="http://localhost:9292/faye/client.js"></script>

<script type="text/javascript">
  var faye_client = new Faye.Client( 'http://localhost:9292/faye' );

  faye_client.subscribe( '/blue', function( data ) {
    var div = $( 'ul#blue-messages' ).append( '<li>' + data + '</li>' );
  });

  faye_client.subscribe( '/green', function( data ) {
    var div = $( 'ul#green-messages' ).append( '<li>' + data + '</li>' );
  });

  $( document ).ready( function() {
    $( 'button#submit' ).click( function() {
      $.post('/',
      $( 'form#send-message' ).serialize(),
      function() {
        $( 'textarea#message' ).val( '' );
      });
    });
  });
</script>

<h2>Send message</h2>

<form id="send-message">
  <label for="channel">Channel</label>
  <select name="channel" id="channel" class="form-control">
    <option>/blue</option>
    <option>/green</option>
  </select>
  <label for="message">Message</label>
  <textarea name="message" id="message" class="form-control"></textarea>
</form>
<button id="submit" class="btn btn-success">Send</button>

<h2>Blue messages</h2>
<ul id="blue-messages">
  <%
    # The below block is only used for loading historical
    # saved data, not the Faye data!
  %>
  <% @saved_data['/blue'].each do |message| %>
    <li><%= message %></li>
  <% end %>
</ul>

<h2>Green messages</h2>
<ul id="green-messages">
  <%
    # The below block is only used for loading historical
    # saved data, not the Faye data!
  %>
  <% @saved_data['/green'].each do |message| %>
    <li><%= message %></li>
  <% end %>
</ul>
person Eric Terry    schedule 19.01.2016
comment
+1 ... но я задал вопрос слишком давно. Я больше не могу сказать, какой из них является лучшим ответом. Я написал об этой распространенной ситуации в meta stackoverflow, предложив, чтобы спрашивающие могли передать право собственности на вопрос тому, кто в нем заинтересован, чтобы позволить более эффективно администрировать такие забытые вопросы. Но модераторы не согласились. Итак, сообщество - пожалуйста, прокомментируйте и дайте мне знать, какой, по вашему мнению, является лучшим ответом на тот момент, когда вы читаете, и я постараюсь соответствующим образом изменить комментарий, получивший наибольшее количество голосов, на этот. - person jj_; 21.01.2016