我正在尝试使用sinatra在块之间传递数据.例如:
@data = Hash.new
post "/" do
@data[:test] = params.fetch("test").to_s
redirect "/tmp"
end
get "/tmp" do
puts @data[:test]
end
Run Code Online (Sandbox Code Playgroud)
但是每当我到达tmp块时@data都是nil并抛出一个错误.这是为什么?
我正在开发一个包含上传表单的Sinatra应用程序,其中包含一个进度条,指示已完成上载的内容.如ryan dahl所述,该过程如下:
HTTP上传进度条相当混淆 - 它们通常涉及在服务器上运行的进程,跟踪HTTP服务器正在写入的临时文件的大小,然后在客户端,每隔几秒就向服务器发出一次AJAX调用.上传以询问上传进度.
每个上传都有一个随机的session-id,并跟踪我class variable在我的应用程序中使用的关联(我知道,这太可怕了 - 如果你有更好的想法,请告诉我)
configure do
@@assoc = {}
end
Run Code Online (Sandbox Code Playgroud)
我有一个POST上传的路由,GET一个用于AJAX轮询的路由.内部POST路线我保存的关联session-id,Tempfile以及总规模.
post '/files' do
tmp = params[:file][:tempfile]
# from here on, @@assoc[@sid] should have a value, even in other routes
@@assoc[@sid] = { :file => tmp, :size => env['CONTENT_LENGTH'] }
File.open("#{options.filesdir}/#{filename}", 'w+') do |file|
file << tmp.read
end
end
Run Code Online (Sandbox Code Playgroud)
在GET路线中,我根据Tempfile当前的大小计算百分比:
get '/status/:sid' do
h = …Run Code Online (Sandbox Code Playgroud) 我正在尝试用Sinatra和ActiveRecord(3.2.3)创建一个小应用程序.
这是我的主文件的样子:
require "sinatra"
require "sinatra/reloader"
require "active_record"
...
ActiveRecord::Base.establish_connection(
adapter: 'sqlite3',
database: 'db.sqlite3',
host: 'localhost',
)
class Post < ActiveRecord::Base
...
end
get('/') { ... }
get('/posts') { ... }
...
Run Code Online (Sandbox Code Playgroud)
它有效,但有时我会在控制台中收到警告:
弃用警告:数据库连接不会自动关闭,请通过调用连接关闭线程末尾的数据库
close连接.例如:ActiveRecord :: Base.connection.close'
发生警告时,页面刷新需要很长时间.我不明白我应该在哪里关闭连接.我试图放在 ActiveRecord::Base.connection.close文件的底部,但它没有帮助.
更新:
我忘了提到我还使用来自sinatra-contrib gem的sinatra/reloader插件来查看效果,而无需重新启动服务器.
require "sinatra/reloader"
Run Code Online (Sandbox Code Playgroud)
如果我发表评论,那么问题就会消失.但无论如何,我想知道如何在不禁用重新加载器的情况下解决问题.
我正在编写一个带有通过Thor启动的嵌入式Sinatra应用程序的库.我想挂载Sprockets::Environmentat的实例,/css并将/js主应用程序映射到/.这Rack::URLMap在config.ru文件中很容易使用,但在这种情况下没有一个因为我以编程方式启动Sinatra应用程序Sinatra::Application.run!.我怎样才能做到这一点?
Sinatra没有通过重定向Chrome来坚持我的会话.它正在创建一个全新的会话,我将丢失以前的所有会话数据.
作为一个例子(类似于Sinatra文档),我正在做这样的事情:
enable :sessions
get '/foo' do
session[:user_id] = 123
session[:session_id] # "ABC", for example
redirect to('/bar')
end
get '/bar' do
# this is "DEF" when responding to Chrome (wrong),
# but "ABC" when responding to Firefox or Safari (right)
session[:session_id]
# this is nil when responding to Chrome (wrong),
# but 123 when responding to Firefox or Safari (right)
session[:user_id]
end
Run Code Online (Sandbox Code Playgroud)
我认为这与重定向响应后不同浏览器如何响应处理会话有关.有没有人看过类似这样的东西,或者对仍在使用会话时如何解决这个问题有任何想法?
提前致谢!
我正在使用Sinatra,我一直在尝试加载一些样式表.我link在我的erb中尝试过普通的html 标签,但是没有用.
我试过了
<head>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
Run Code Online (Sandbox Code Playgroud)
这不是我正在使用的网址的问题,是否有一些特殊的方法来实现这一目标?
我想在我的Sinatra应用程序中使用Angular.js.不幸的是,我找不到任何有用的提示.我确实找到了一些Rails示例,但与Sinatra的简约哲学相比,我总是发现Rails和Padrino相当难以处理.
我观看了很多视频(由Googling angular.js发现),但我仍然觉得很难申请Sinatra.
最全面的教程中,我发现到目前为止是一个从yearofmoo.com.
但是我仍然试图将它应用于Sinatra,而且我的出路也不是一种选择,因为一个简单的错误可能会让我走上正确的道路.我迷路了,我承认了!!
如果共享的话,根据您尝试做类似事情的经验,我们将非常感激.此时我需要的是将我的JSON从Sinatra应用程序路径到angular.js驱动的页面.
谢谢.
我有rails应用程序.如果我用rails s(端口3000)启动它,它可以在我的机器和本地网络上的每个设备上通过ip地址(在我的情况下为192.168.0.3)完美地工作.
我有sinatra申请.如果我使用ruby app.rb(端口4567)启动它,它在我的机器上完美运行,但它无法从我本地网络上的其他设备访问.

两个应用程序都使用Thin作为应用服务器.
这与sinatra如何运作有关吗?
每当我尝试通过Pow打开本地应用程序时,我都会遇到以下错误(*=数字):
Error: timeout: waiting for /tmp/nack.*.*.sock
at null._onTimeout (/Users/pain/Library/Application Support/Pow/Versions/0.4.1/node_modules/nack/lib/process.js:416:29)
at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
Run Code Online (Sandbox Code Playgroud)
刷新几次后,应用程序启动并正常工作.但是,在离开一段时间之后,每次都做起来很烦人.
这是预期的行为吗?有没有办法增加超时?
更新:
$ time rails runner "puts 1"
4.72s user 1.32s system 28% cpu 21.198 total # first time after reboot
3.73s user 0.68s system 99% cpu 4.424 total # after that
Run Code Online (Sandbox Code Playgroud)
更新:
事实上同样的事情适用于Sinatra应用程序,它本身很快就开始了.并且几乎立即显示超时消息,看起来根本没有实际的超时.然后在第二页刷新它工作正常.
更新:
只需要启动一个半静态的Sinatra应用程序,比如它出现之前的5或6次.是什么赋予了?该应用程序几乎是即时的.
我试图访问sinatra过滤器中的标头.我的请求包括标题"HTTP_AUTH",但我无法访问它.我的过滤器是
before do
halt 403 unless request['HTTP_AUTH'] == 'test'
end
Run Code Online (Sandbox Code Playgroud)
它从我的机架测试中正常工作.
browser.get '/mypath', "CONTENT_TYPE" => "application/json", "HTTP_AUTH" => 'test'
Run Code Online (Sandbox Code Playgroud)
但是当我从其他来源尝试时,我无法访问它.如果我puts request.env可以看到令牌在请求中,但我无法访问它.
"HTTP_CONNECTION"=>"close",
"HTTP_AUTH"=>"test",
"HTTP_ACCEPT"=>"application/json",
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
sinatra ×10
ruby ×5
rack ×2
activerecord ×1
angularjs ×1
file-upload ×1
http-headers ×1
iframe ×1
javascript ×1
mongrel ×1
rack-pow ×1
session ×1
sprockets ×1