我正在尝试使用bamboo-mri-1.9.2堆栈运行我的Heroku应用程序.当然它在Ruby 1.9.2上运行良好.但是在生产时它会在执行启动时崩溃config.ru,如下所示:
require 'sinatratestapp'
run Sinatra::Application
Run Code Online (Sandbox Code Playgroud)
我的.gems档案:
sinatra --version '>= 1.0'
Run Code Online (Sandbox Code Playgroud)
而应用程序本身如下sinatratestapp.rb:
require 'rubygems'
require 'sinatra'
get '/' do
"Hello from Sinatra on Heroku!"
end
Run Code Online (Sandbox Code Playgroud)
这就是我在项目中的所有内容并尝试在Heroku上运行结果:
<internal:lib/rubygems/custom_require>:29:in `require': no such file to load -- sinatratestapp (LoadError)
from <internal:lib/rubygems/custom_require>:29:in `require'
from config.ru:1:in `block (3 levels) in <main>'
...
-----> Your application is requiring a file that it can't find.
Most often this is due to missing gems, or it could be that you …Run Code Online (Sandbox Code Playgroud) 我有一个Sinatra应用程序设置,其中大多数逻辑在各种类中执行,并且post/ getroutes实例化这些类并调用它们的方法.
我正在考虑将post/ getroute处理程序放在类本身内是否是一个更好的结构.
无论如何,我想知道是否有可能.例如:
class Example
def say_hello
"Hello"
end
get '/hello' do
@message = say_hello
end
end
Run Code Online (Sandbox Code Playgroud)
如果不修改上述内容,Sinatra会说对象say_hello上没有方法SinatraApplication.
这是我的 Gemfile
source :rubygems
gem 'rake', '0.9.2.2'
gem 'sinatra'
gem 'activerecord', '3.0.9'
gem 'pg', '~> 0.12.2'
gem 'logger'
gem 'nokogiri'
group :development, :test do
gem 'rack-test'
gem 'ruby-debug19'
gem 'sqlite3'
end
Run Code Online (Sandbox Code Playgroud)
我rake console在其他项目中运行,现在我收到此消息:
You have already activated activesupport 3.1.3, but your Gemfile requires activesupport 3.0.9. Using bundle exec may solve this.
我如何使用`bundle exec来解决这个问题?这是什么意思?
对于小型开发人员文档应用程序,我想设置一个Sinatra应用程序来提供HAML文件.在CSS文件和图像的路由之后,我想要一条尝试为您请求的任何路径加载HAML文件的路由.
例如:
/index加载views/index.haml,如果存在的话/this/page/might/exist加载views/this/page/might/exist.haml,如果存在的话我该如何指定这条路线?
Sinatra自述文件说:
request["SOME_HEADER"] # value of SOME_HEADER header
Run Code Online (Sandbox Code Playgroud)
鉴于此应用程序:
require 'sinatra'
post '/env' do
env['HTTP_X_FOO']
end
post '/request' do
request['X-Foo']
end
post '/request_rack_http_format' do
request['HTTP_X_FOO']
end
Run Code Online (Sandbox Code Playgroud)
第一个规范通过; 接下来的两个失败:
describe "Sinatra should place the header in" do
before(:all) do
header 'X-Foo', 'Bar'
end
example "env" do
post '/env'
last_response.body.should == 'Bar' #pass
end
example "request[]" do
post '/request'
last_response.body.should == 'Bar' #fail; got ""
end
example "request[] (rack format)" do
post '/request_rack_http_format'
last_response.body.should == 'Bar' #fail; got ""
end
end …Run Code Online (Sandbox Code Playgroud) 在创建给定的ActiveRecord模型对象的实例时,我需要生成一个短的(6-8个字符)唯一字符串,用作URL中的标识符,采用Instagram的照片URL样式(如http://instagram.com/ p/P541i4ErdL /,我刚刚加入404)或Youtube的视频网址(如http://www.youtube.com/watch?v=oHg5SJYRHA0).
这样做的最佳方法是什么?最简单的方法是重复创建一个随机字符串,直到它是唯一的?有没有办法散列/随机播放整数id,以便用户不能通过更改一个字符来破解URL(就像我上面的404'd Instagram链接那样)并最终获得新记录?
我正在尝试在Cedar堆栈上部署Sinatra流式SSE响应应用程序.不幸的是,虽然它在开发中完美运行,但是一旦部署到Heroku,callback或者errback在调用连接时永远不会被调用,导致连接池被填满过时的连接(永远不会超时,因为数据仍在服务器上发送给他们侧.)
来自Heroku文档的Relvant信息:
长轮询和流媒体响应
Cedar支持HTTP 1.1功能,例如长轮询和流式响应.应用程序有一个初始的30秒窗口,以单个字节响应客户端.但是,此后发送的每个字节(从客户端接收或由您的应用程序发送)重置滚动55秒窗口.如果在55秒窗口期间没有发送数据,则终止连接.
如果您要发送流响应,例如服务器发送的事件,则需要检测客户端何时挂断,并确保您的应用服务器立即关闭连接.如果服务器保持连接打开55秒而不发送任何数据,您将看到请求超时.
这正是我想要做的 - 检测客户端何时挂断,并立即关闭连接.然而,关于Heroku路由层的一些东西似乎阻止Sinatra像通常那样检测流关闭事件.
一些示例代码可用于复制此代码:
require 'sinatra/base'
class MyApp < Sinatra::Base
set :path, '/tmp'
set :environment, 'production'
def initialize
@connections = []
EM::next_tick do
EM::add_periodic_timer(1) do
@connections.each do |out|
out << "connections: " << @connections.count << "\n"
end
puts "*** connections: #{@connections.count}"
end
end
end
get '/' do
stream(:keep_open) do |out|
@connections << out
puts "Stream opened from #{request.ip} (now #{@connections.size} open)"
out.callback do
@connections.delete(out)
puts "Stream closed from #{request.ip} (now …Run Code Online (Sandbox Code Playgroud) 这是我运行任何rake命令时得到的错误:undefined method 'desc' for Sinatra::Application:Class
# app.rb
require 'sinatra'
require 'sinatra/activerecord'
require 'sinatra/contrib'
get '/' do
puts "Hello World"
end
# config.ru
require "./app"
run Sinatra::Application
# Rakefile
require './app'
require 'sinatra/activerecord/rake'
# Gemfile
source 'https://rubygems.org'
ruby '2.0.0'
gem 'activerecord', '~> 4.0.2'
gem 'sinatra', '~> 1.4.4'
gem 'sinatra-activerecord', '~> 1.2.3'
gem 'sinatra-contrib', '~> 1.4.2'
Run Code Online (Sandbox Code Playgroud)
完整跟踪:
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-contrib-1.4.2/lib/sinatra/namespace.rb:269:in `method_missing'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-activerecord-1.2.3/lib/sinatra/activerecord/tasks.rake:4:in `block in <top (required)>'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-contrib-1.4.2/lib/sinatra/namespace.rb:126:in `class_eval'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-contrib-1.4.2/lib/sinatra/namespace.rb:126:in `block in new'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-contrib-1.4.2/lib/sinatra/namespace.rb:118:in `initialize'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-contrib-1.4.2/lib/sinatra/namespace.rb:118:in `new'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-contrib-1.4.2/lib/sinatra/namespace.rb:118:in `new'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-contrib-1.4.2/lib/sinatra/namespace.rb:142:in `namespace'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-1.4.4/lib/sinatra/base.rb:1972:in …Run Code Online (Sandbox Code Playgroud) 当我在Sinatra/ruby应用程序中使用ALLIANCE FEED时,我得到了一个
/opt/rh/ruby200/root/usr/share/ruby/net/http/response.rb:368:[BUG]分段错误ruby 2.0.0p645(2015-04-13)[x86_64-linux]
错误.所以我想知道这是一个ruby的错误或代码的错误,我可以做什么步骤来修复它.
以下是PARSING ALLIANCE FEED的代码
feeds.each { |name, hash|
puts "=== PARSING #{name.upcase} FEED ==="
start = Time.now
open(hash[:url]) { |feed|
send(hash[:action], feed)
}
duration = Time.now - start
puts "Feed syndication completed in #{duration.to_s} seconds."
puts
}
# Close DB connection
puts "Disconnecting"
@db.disconnect
end
def parseAllianceData(xml)
start = Time.now
allianceData = XMLObject.new xml
duration = Time.now - start
puts "XML parsed in #{duration.to_s} seconds."
puts "Alliances found: #{allianceData.alliances.count}"
@db[:feeds].insert(
:generated_at => allianceData.server.datagenerationdatetime,
:type => …Run Code Online (Sandbox Code Playgroud) 我们正在将一个Sinatra应用程序从ActiveRecord 4升级到ActiveRecord 5.之前我们有这一行:
use ActiveRecord::ConnectionAdapters::ConnectionManagement
这是因为在请求完成后没有清理连接.以下是关于此主题的SO讨论:
从ActiveRecord 5开始,此行不再有效.rails项目中的这个对话说明:
删除它有利于Executor和Reloader API.被删除的中间件不是公共API的一部分.如果你想在Rails之外使用它,你需要制作一个.
这是否意味着,如果有人要将ActiveRecord 5与Sinatra一起使用,除非开发人员重新创建现已删除的中间件,否则连接将在请求后再次"泄露"或未返回到池中?
在Sinatra示例中,现在是否需要在ActiveRecord 5中包含此行?
after do
ActiveRecord::Base.clear_active_connections!
end
Run Code Online (Sandbox Code Playgroud)
这就是链接线程的含义,但我希望得到一个明确的答案,我可以回到我的开发团队.
ruby activerecord ruby-on-rails sinatra sinatra-activerecord