我们可以为rails应用程序应用dashing

时间:2013-06-19 04:06:00

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 sinatra

现在我正在处理从这里开始的http://shopify.github.io/dashing/我使用Sinatra创建了一个精简的应用程序,我添加了一些更多的第三方API,一切运行良好。现在我想用rails运行应用程序我试过每一件事都运行正常但是“event”方法不能被服务器调用。实际上它在我的lib目录中的dashing.rb文件中就是这样。

require 'sinatra'
   ``require 'sprockets'
   require 'sinatra/content_for'
   require 'rufus/scheduler'
   require 'coffee-script'
   require 'sass'
   require 'json'
   require 'pry'

 module Dashing
  SCHEDULER = Rufus::Scheduler.start_new

  class App < Sinatra::Base
    if Rails && Rails.root
      set :root, Rails.root
      set :root_path, '/dashing/'



      Rails.application.config.assets.precompile += %w( dashing/application.js dashing/application.css )
      set :views, Rails.root.join('app', 'dashing', 'dashboards')
      set :widget_path, "#{settings.root}/app/dashing/widgets/"

      set :lock, true
      set :threaded, true
    else
      set :root, Dir.pwd
      set :root_path, '/'

      set :sprockets,     Sprockets::Environment.new(settings.root)
      set :assets_prefix, '/assets'
      set :digest_assets, false
      ['assets/javascripts', 'assets/stylesheets', 'assets/fonts', 'assets/images', 'widgets', File.expand_path('../../javascripts', __FILE__)]. each do |path|
        settings.sprockets.append_path path
      end

      set server: 'thin'
      set :public_folder, File.join(settings.root, 'public')
      set :views, File.join(settings.root, 'dashboards')
      set :widget_path, File.join(settings.root, 'widgets')
    end

    set connections: [], history: {}
    set :default_dashboard, nil
    set :auth_token, nil

    helpers Sinatra::ContentFor
    helpers do
      def protected!
        # override with auth logic
      end
    end

    get '/events', provides: 'text/event-stream' do
      protected!
      stream :keep_open do |out|
        settings.connections << out
        out << self.latest_events
        out.callback { settings.connections.delete(out) }
      end
    end

    get '/' do
      begin
      redirect settings.root_path + (settings.default_dashboard || self.first_dashboard).to_s
      rescue NoMethodError => e
        raise Exception.new("There are no dashboards in your dashboard directory.")
      end
    end

    get '/:dashboard' do
      protected!
      erb params[:dashboard].to_sym
    end

    get '/views/:widget?.html' do
      protected!
      widget = params[:widget]
      send_file File.join(settings.widget_path, widget, "#{widget}.html")
    end

    post '/widgets/:id' do
      request.body.rewind
      body =  JSON.parse(request.body.read)
      auth_token = body.delete("auth_token")
      if !settings.auth_token || settings.auth_token == auth_token
        Dashing::Application.send_event(params['id'], body)
        204 # response without entity body
      else
        status 401
        "Invalid API key\n"
      end
    end

    class << self
      def development?
        ENV['RACK_ENV'] == 'development'
      end

      def production?
        ENV['RACK_ENV'] == 'production'
      end

      def send_event(id, body)
        body["id"] = id
        body["updatedAt"] = Time.now.to_i
        event = format_event(body.to_json)
        settings.history[id] = event
        settings.connections.each { |out| out << event }
      end

      def format_event(body)
        "data: #{body}\n\n"
      end
    end

      def latest_events
        settings.history.inject("") do |str, (id, body)|
          str << body
        end
      end


    def first_dashboard
      files = Dir[File.join(settings.views, '*.erb')].collect { |f| f.match(/(\w*).erb/)[1] }
      files -= ['layout']
      files.first
    end

    Dir[File.join(settings.root, 'lib', '**', '*.rb')].each {|file| require file }
    {}.to_json # Forces your json codec to initialize (in the event that it is lazily loaded). Does this before job threads start.

    job_path = ENV["JOB_PATH"] || 'jobs'
    files = Dir[File.join(settings.root, job_path, '/*.rb')]
    files.each { |job| require(job) }
  end
end 

Rails无法执行/ event root。

任何人都可以建议我。如何在rails中调用this / events root。我正在使用batman.js来调用事件。

2 个答案:

答案 0 :(得分:1)

您可能需要查看Dashing-Rails gem

答案 1 :(得分:0)

它仅适用于轨道4 要求

Ruby&gt; = 1.9.3 Rails 4 Redis的 多线程服务器(美洲狮,彩虹)