使用Sinatra Streaming,有一种方法可以指定哪些连接获取发送的信息。例如,只有特定帐户上的用户。
我相信可以使用Eventmachine Channels完成此操作,但我不知道如何做。任何建议,甚至更好的示例代码将不胜感激。
以下是代码的相关部分。现在,您可以看到它只是发送到每个打开的连接。
configure do
set server: 'thin', connections: []
set :app_file, __FILE__
set :port, ENV['PORT']
set :public_folder, File.dirname(__FILE__) + '/public'
end
get '/stream', provides: 'text/event-stream' do
stream :keep_open do |out|
settings.connections << out
out.callback { settings.connections.delete(out) }
end
end
post '/update/contact/:id' do
@contact = Contact.get(params[:id])
@contact.update(params[:contact])
settings.connections.each { |out| out << "data: #{@contact.account_id} Contact #{@contact.id} #{@contact.first_name} #{@contact.last_name}\n\n" }
204
end
Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的Ruby Rack服务器,如:
app = Proc.new do |env|
req = Rack::Request.new(env).params
p req.inspect
[200, { 'Content-Type' => 'text/plain' }, ['Some body']]
end
Rack::Handler::Thin.run(app, :Port => 4001, :threaded => true)
Run Code Online (Sandbox Code Playgroud)
每当我使用JSON对象向服务器发送POST HTTP请求时:
{ "session": {
"accountId": String,
"callId": String,
"from": Object,
"headers": Object,
"id": String,
"initialText": String,
"parameters": Object,
"timestamp": String,
"to": Object,
"userType": String } }
Run Code Online (Sandbox Code Playgroud)
我一无所获.我可以检测到收到的请求但无法获取数据.在我的控制台上的结果puts req.inspect是这样的:
"{}"
Run Code Online (Sandbox Code Playgroud)
我该如何获取数据?
我试图通过以下方式改变它:
request = Rack::Request.new env
object = JSON.parse request.body
puts JSON.pretty_generate(object)
Run Code Online (Sandbox Code Playgroud)
但我收到以下警告:
!! Unexpected error while processing request: can't …Run Code Online (Sandbox Code Playgroud) 我有以下Sinatra应用程序,我正在测试error块,但它似乎没有工作.
这是我的sinatra应用程序:
require 'rubygems'
require 'sinatra'
error do
puts "----> Failed"
$stdout.print "----> Failed"
end
get "/*" do
raise "Error!!"
end
Run Code Online (Sandbox Code Playgroud)
我正在使用sinatra(1.3.3)
我正在尝试以一种类似于常规Ruby Gem结构的方式来构造Sinatra应用程序。我有以下文件树:
.
??? app.rb
??? config.ru
??? Gemfile
??? Gemfile.lock
??? helpers
? ??? dbconfig.rb
? ??? functions.rb
? ??? init.rb
??? hidden
? ??? Rakefile
??? lib
? ??? admin.rb
? ??? api.rb
? ??? indexer.rb
? ??? init.rb
? ??? magnet.rb
??? models
? ??? init.rb
? ??? invite.rb
? ??? tag.rb
? ??? torrent.rb
? ??? user.rb
??? public
? ??? css
? ? ??? reset.css
? ? ??? style.css
? ??? i
? ??? img …Run Code Online (Sandbox Code Playgroud) 我有一个sinatra应用程序并将其打包为宝石.它的文件布局看起来大致如下:
??? bin
? ??? tubemp
??? lib
? ??? tubemp.rb
??? Gemfile
??? tubemp.gemspec
Run Code Online (Sandbox Code Playgroud)
我可以安装并运行它就好了.呼叫ruby lib/tubemp.rb也会触发应用程序,因为Sinatra让它自行启动.tubemp.rb:
class Tubemp < Sinatra::Application
get '/' do
erb :index, :locals => { :title => "YouTube embeds without third party trackers." }
end
end
Run Code Online (Sandbox Code Playgroud)
二进制文件也很简单.bin/tubemp:
#!/usr/bin/env ruby
require "tubemp.rb"
Tubemp.run!
Run Code Online (Sandbox Code Playgroud)
但现在我想将其部署为Rack-app.或者将其部署在Rack-app中.至少它应该在生产机器上的Passenger下运行.
使用通用应用程序,就像config.ru在应用程序所在的目录中添加a一样简单.然后,该文件粗略地包括和调用run Tubemp.将nginx或apache的乘客指向此机架文件和应用程序所在的目录,启动它.这很有效,直到我把它变成了宝石; 因为现在我不再拥有"应用程序所在的目录",gem install tubemp除此之外决定放置文件.
我是否需要创建一个wrapper捆绑了tubemp-gem及其依赖项的应用程序?如果是这样,我如何从rackup文件中调用gem ?还是我完全错了?
我正在创建一个Sinatra应用程序,它采用上传的CSV文件并将其内容放入哈希值.当我在app.rb中引用此哈希时,如下所示:
hash = extract_values(path_to_filename)
我一直收到此错误消息:
用于Hash的未定义方法`bytesize':0x007fc5e28f2b90 #object_id
file:utils.rb位置:bytesize行:335
我在某处读到这是一个Webrick问题.我切换到Thin,错误是一样的.
我的哈希/ CSV文件的大小非常小,所以它不是问题.
我正在使用ruby 1.9.3p374.
谢谢!
当我尝试启动sinatra时,我遇到了以下错误
/var/lib/gems/1.9.1/gems/sinatra-1.4.4/lib/sinatra/base.rb:1488:in'for start_server': undefined methodHTTP:Module(NoMethodError)
require 'sinatra/base'
require_relative "twt.rb"
class SinatraApp < Sinatra::Base
set :static, true
set :public_folder, File.dirname(__FILE__) + '/static'
get '/getuserinfo' do
@user = twit.getuserinfo
erb :userInfo
end
end
SinatraApp.run!
Run Code Online (Sandbox Code Playgroud)
在"twt.rb"我需要推特(5.7.1)
require 'twitter'
class Twit
attr_accessor :client
def initialize(consumer_key,consumer_secret,access_token,access_token_secret)
@client = Twitter::REST::Client.new do |config|
config.consumer_key = consumer_key
config.consumer_secret = consumer_secret
config.access_token = access_token
config.access_token_secret = access_token_secret
end
end
def getUserInfo
return user = {
"name"=> client.current_user.name,
"id" => client.current_user.id
}
end
def showAllFriends
client.friends.each { |item| puts …Run Code Online (Sandbox Code Playgroud) 在我的Sinatra项目中,我希望能够同时停止错误代码和错误消息:
halt 403, "Message!"
Run Code Online (Sandbox Code Playgroud)
反过来,我想要在错误页面模板中呈现(使用ERB).例如:
error 403 do
erb :"errors/error", :locals => {:message => env['sinatra.error'].message}
end
Run Code Online (Sandbox Code Playgroud)
然而,显然env['sinatra.error'].message(也就是自述文件和每个网站都说我应该这样做)并没有暴露我提供的信息.(此代码在运行时返回undefined method `message' for nil:NilClass错误.)
我已经搜索了4-5个小时并尝试了所有内容,但我无法弄清楚消息通过ERB呈现给我的位置!有谁知道它在哪里?
(似乎我能想到的唯一选择是写这个而不是halt上面的代码,每次我想停止:
halt 403, erb(:"errors/error", :locals => {m: "Message!"})
Run Code Online (Sandbox Code Playgroud)
这段代码有效.但这是一个混乱的解决方案,因为它涉及硬编码错误ERB文件的位置.)
(如果你想知道,这个问题是不相关的show_exceptions,因为这两个配置标记set :show_exceptions, false,并set :show_exceptions, :after_handler没有什么区别.)
这是我的网络应用:
class Front < Sinatra::Base
configure do
set :server, :puma
end
get '/' do
'Hello, world!'
end
end
Run Code Online (Sandbox Code Playgroud)
我这样开始(不建议使用Rack):
Front.start!
Run Code Online (Sandbox Code Playgroud)
这是Puma的配置对象,我不知道如何传递给它:
require 'puma/configuration'
Puma::Configuration.new({ log_requests: true, debug: true })
Run Code Online (Sandbox Code Playgroud)
说真的,怎么样?