我正在使用乘客部署Sinatra应用程序.已部署的应用程序正在运行,但并非完全有效:某些路径工作正常,其他路径只是呈现空白页面.我似乎无法找到工作路线和没有工作的路线之间的任何重大差异,我似乎无法追查任何错误..
处理程序
我已经定义了not_found和错误处理程序,如下所示:
not_found do
'404. Bummer!'
end
error do
'Nasty error: ' + env['sinatra.error'].name
end
Run Code Online (Sandbox Code Playgroud)
这些在我的本地机器上工作正常,无论是在开发还是生产中,但我从未在服务器上看到这些.
Apache日志
当我拖拽Apache的access.log并点击其中一条破碎的路径时,我看到500:
helpers [27/Oct/2009:15:54:59 -0400] "GET /admin/member_photos/photos HTTP/1.1" 500 20 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3"
Run Code Online (Sandbox Code Playgroud)
rack_hoptoad
我还在我的config.ru中安装并配置了rack_hoptoad中间件,但没有例外,它正在跳转到hoptoad.
# Send exceptions to hoptoad
require 'rack_hoptoad'
use Rack::HoptoadNotifier, 'MY_API_KEY'
Run Code Online (Sandbox Code Playgroud)
记录
我已经设置了这样的日志..
set :raise_errors => true
set :logging, true
log = File.new("log/sinatra.log", "a+")
STDOUT.reopen(log)
STDERR.reopen(log)
require 'logger'
configure do
LOGGER = Logger.new("log/sinatra.log")
end
helpers do
def …Run Code Online (Sandbox Code Playgroud) 在提出这个问题后,我开始使用Sinatra作为服务网页的方式.
今天晚上,我和我的一个朋友开始测试服务器的速度.
要登录的文件如下所示:
require 'rubygems'
require 'sinatra'
require 'haml'
enable :sessions #for cookies!
get '/' do
haml :index
end
Run Code Online (Sandbox Code Playgroud)
而index.haml看起来像:
%title
First Page
%header
%h2 First Page
Run Code Online (Sandbox Code Playgroud)
他和我一样坐在最近的笔记本电脑上,我们两人之间有一台Apple 802.11n路由器.我们都在运行Windows 7.我还在运行Ubuntu 9.10 x64的笔记本电脑上尝试了这些相同的文件,其中包含Sinatra和从apt-get安装的所有相关文件.
无论是服务器操作系统,Windows还是Linux,Sinatra都需要7秒钟来提供单页请求.我看到作者设法在这里处理了400多个请求/秒.是什么赋予了?(或者应该在SuperUser等上?)
我想在Sinatra写一个快速的服务器应用程序.它必须是自包含的(即不使用apache/nginx/passenger),但也必须支持SSL.
有没有简单的方法为Sinatra启用SSL支持(例如使用WEBRick)?
我正在尝试打开一个图像文件,并在变量/数组中按颜色存储像素列表,这样我就可以逐个输出它们.
图像类型:可以是BMP,JPG,GIF或PNG.其中任何一个都很好,只需要支持一个.颜色输出:RGB或Hex.
我看过几个库(RMagick,Quick_Magick,Mini_Magick等),它们看起来都有些过分.Heroku在ImageMagick上也遇到了一些困难,我的测试也没有运行.我的申请是在Sinatra.
有什么建议?
我想在Sinatra Web服务器的线程中执行"长时间运行" - (执行大约0.5秒)任务.
Web响应大约需要20毫秒,所以如果我忙,那么线程就会堆积起来......
所以我觉得如果我忙的话我会同步.
if (running_thread_count > 10)
stuff_that_takes_a_second()
else
Thread.new do
stuff_that_takes_a_second()
end
end
Run Code Online (Sandbox Code Playgroud)
你如何获得正在运行的线程数(我想要启动的线程数,还没有运行) - 你如何编码running_thread_count?
def running_thread_count
return Thread.list.count
end
Run Code Online (Sandbox Code Playgroud)
或者我是否需要检查正在运行的线程?即当一个线程完成运行时,它是否会停止回到Thread.list中?
我不想调用join,因为这会破坏目的 - 除非我们备份大量的线程工作,否则快速返回.
我似乎无法让这个工作.所以我有很多类型的电影,如果那些是用户数据库中的类型,我希望它们被检查.这是我的代码
%section(ng-controller="UserCtrl" ng-init="user_genres=#{preferred_genres}")
%ul
%li(ng:repeat="genre in preferred_genres")
%input(type = "checkbox" ng:model="preferred_genres[genre]" id="genre-{{$index + 1}}" ng-checked="user_genres['{{genre}}']")
%label{:for => "genre-{{$index + 1}}"} {{genre}}
这是#{preferred_genres}来自haml
{"Action & Adventure":true,"Animation":true,"Art House & International":true,"Classics":true,"Comedy":true,"Documentary":true,"Drama":true,"Horror":true,"Kids & Family":true,"Musical & Performing Arts":true,"Mystery & Suspense":true,"Romance":true,"Science Fiction & Fantasy":true,"Special Interest":true,"Sports & Fitness":true,"Television":true,"Western":true}
这意味着应该检查每个复选框.但是,当我加载页面时,没有选中复选框.但是,如果我硬编码ng-checked成这样的东西就可以了.
ng-checked="user_genres['Western']"
这真的很奇怪.请帮忙.
我刚刚将我的操作系统从Ubuntu 14.04 LTS更新到16.04,我在那里运行我的Ruby Sinatra项目.事情是更新后我试图运行服务器,然后在浏览器中的localhost我得到此错误启动错误
Something went wrong while loading app.rb
Gem::ConflictError: Unable to activate sinatra-1.4.7, because rack-2.0.1 conflicts with rack (~> 1.5)
/usr/lib/ruby/2.3.0/rubygems/specification.rb:2286:in `raise_if_conflicts'
/usr/lib/ruby/2.3.0/rubygems/specification.rb:1407:in `activate'
/usr/lib/ruby/2.3.0/rubygems.rb:196:in `rescue in try_activate'
/usr/lib/ruby/2.3.0/rubygems.rb:193:in `try_activate'
/usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:125:in `rescue in require'
/usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:40:in `require'
/home/leandro/Downloads/git-master/ruby sinatra/app.rb:1:in `<top (required)>'
/usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
/usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
/var/lib/gems/2.3.0/gems/shotgun-0.9.1/lib/shotgun/loader.rb:115:in `inner_app'
/var/lib/gems/2.3.0/gems/shotgun-0.9.1/lib/shotgun/loader.rb:103:in `assemble_app'
/var/lib/gems/2.3.0/gems/shotgun-0.9.1/lib/shotgun/loader.rb:86:in `proceed_as_child'
/var/lib/gems/2.3.0/gems/shotgun-0.9.1/lib/shotgun/loader.rb:31:in `call!'
/var/lib/gems/2.3.0/gems/shotgun-0.9.1/lib/shotgun/loader.rb:18:in `call'
/var/lib/gems/2.3.0/gems/shotgun-0.9.1/lib/shotgun/favicon.rb:12:in `call'
/var/lib/gems/2.3.0/gems/shotgun-0.9.1/lib/shotgun/static.rb:14:in `call'
/var/lib/gems/2.3.0/gems/rack-2.0.1/lib/rack/urlmap.rb:68:in `block in call'
/var/lib/gems/2.3.0/gems/rack-2.0.1/lib/rack/urlmap.rb:53:in `each'
/var/lib/gems/2.3.0/gems/rack-2.0.1/lib/rack/urlmap.rb:53:in `call'
/var/lib/gems/2.3.0/gems/rack-2.0.1/lib/rack/builder.rb:153:in `call'
/var/lib/gems/2.3.0/gems/rack-2.0.1/lib/rack/handler/webrick.rb:86:in `service'
/usr/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service'
/usr/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run'
/usr/lib/ruby/2.3.0/webrick/server.rb:296:in `block in start_thread' …Run Code Online (Sandbox Code Playgroud) 我正在使用Sinatra,我想设置一些Rails具有的便利rake任务,特别是rake db:seed.
我的第一关是这个:
namespace :db do
desc 'Load the seed data from db/seeds.rb'
task :seed do
seed_file = File.join(File.dirname(__FILE__), 'db', 'seeds.rb')
system("racksh < #{seed_file}")
end
end
Run Code Online (Sandbox Code Playgroud)
racksh是一个模仿Rails控制台的宝石.所以我只是将种子文件中的代码直接输入它.它有效,但显然不理想.我想做的是创建一个环境任务,允许命令在Sinanta应用程序/环境下运行,如下所示:
task :environment do
# what goes here?
end
task :seed => :environment do
seed_file = File.join(File.dirname(__FILE__), 'db', 'seeds.rb')
load(seed_file) if File.exist?(seed_file)
end
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何设置环境,以便rake任务可以在其下运行.任何帮助将非常感激.
我有400状态代码的自定义错误消息:
get '/do' do
raise ParamXMissingError unless params['x']
end
error ParamXMissingError do
haml :custom_error_page
end
Run Code Online (Sandbox Code Playgroud)
我希望ParamXMissingError为400,但是当我运行上面的代码,并通过Firefox网络工具检查时,似乎Sinatra实际上返回500而不是400.如何让它显示custom_error_page.haml并返回400?
最好是从错误块中处理状态代码和页面是很好的,而不是我在提升时会撒上的东西ParamXMissingError.例如,这将是重复的,并不是一个好的解决方案:halt 400, haml(:custom_error_page)
我正在尝试使用本教程将我的Sinatra应用程序连接到PostgreSQL数据库:http://samuelstern.wordpress.com/2012/11/28/making-a-simple-database-driven-website-with-sinatra-and-heroku /.一切顺利,直到我尝试执行:
rake:db migrate
Run Code Online (Sandbox Code Playgroud)
然后我收到这个错误:
rake aborted!
PG::ConnectionBad: fe_sendauth: no password supplied
Run Code Online (Sandbox Code Playgroud)
好像我应该在pg_hba.conf文件中更改我的权限,但是,打开它,我什么也看不见.并且,如果我尝试在其中写入内容,它会说它是" 只读 ".
我是否正确摆脱错误以及下一步该走向何方?
编辑:实际上,如果我尝试从另一个文本编辑器打开它,它说我没有权限.
sinatra ×10
ruby ×7
rack ×3
angularjs ×1
debugging ×1
haml ×1
heroku ×1
imagemagick ×1
javascript ×1
passenger ×1
performance ×1
postgresql ×1
rake ×1
rubygems ×1
ssl ×1
webrick ×1