我需要在控制器的类中渲染一个Sinatra erb模板.我有问题这个问题.我查看了Sinatra rdocs并提出了这个问题:
Sinatra::Templates.erb :template_to_render
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我收到以下错误:
undefined method `erb' for Sinatra::Templates:Module
Run Code Online (Sandbox Code Playgroud)
有没有办法从另一个类调用它?
我正在玩Sinatra,我想让我的一条路线不区分大小写.我尝试添加这样的路线:
get "(?i)/tileflood/?" do
end
Run Code Online (Sandbox Code Playgroud)
但它与预期的/ tileflood的任何排列都不匹配.我在rubular.com上测试了以下正则表达式,它匹配得很好.我错过了什么吗?
\/(?i)tileflood\/?
Run Code Online (Sandbox Code Playgroud) 我有一个相当简单的应用程序(只有一个index.html文件和一个css文件 - 它只是一个静态页面)在Heroku上托管.
我使用Sinatra在Heroku上托管它.'app'本身很简单:
require 'rubygems'
require 'sinatra'
get "/" do
File.read(File.join('public', 'index.html'))
end
Run Code Online (Sandbox Code Playgroud)
问题是,如何为静态资产设置HTTP响应头?特别是,我想设置Expires标头用于缓存目的.
编辑:我希望将所述标题添加到静态资产(即,位于其下的那个/public,如背景图像,图标等)
我对这件事的运作方式很好奇.
在要求'sinatra'之后
然后我可以在顶级范围内调用get().
在深入研究源代码后,我发现了这个get()结构
module Sinatra
class << self
def get
...
end
end
end
Run Code Online (Sandbox Code Playgroud)
知道类<< self是打开self对象的单例类定义并在里面添加get(),所以它开始有意义.
但唯一遗漏的是我无法理解的是它在模块Sinstra中,如何在不使用Sinatra :: resolution操作的情况下调用get()?
我正在编写一个简单的应用程序,它接受用户的标准输入.至于电子邮件条目,我让它验证它是否是标准的电子邮件格式,然后让它在要保存新实例时列出这样的问题:
u = User.new
u.email = params[:email]
u.save
if u.save
redirect '/'
else
u.errors.each do |e|
puts e
end
end
Run Code Online (Sandbox Code Playgroud)
我知道如果它是正确的,它应该返回主页.如果它是错的我也希望它返回主页,但我希望它返回一个错误值(所以我可以弹出窗口或只是屏幕上的东西让用户知道电子邮件的格式是错误的).最好的方法是什么?
保护使用许多不同形式和mongodb作为数据库的Sinatra应用程序的最佳实践是什么?
我在Sinatra有一个Haml部分处理我所有的'页面打开'项目,如元标记.
我希望在此部分中为page_title设置变量,然后在每个视图中设置该变量.
部分内容如下:
%title @page_title
Run Code Online (Sandbox Code Playgroud)
然后在视图中,允许执行以下操作:
@page_title = "This is the page title, BOOM!"
Run Code Online (Sandbox Code Playgroud)
我已经阅读了很多问题/帖子等等,但我不知道如何要求解决我想要做的事情.我来自Rails,我们的开发人员通常使用content_for,但他们设置了所有这些.我真的想知道它是如何工作的.似乎我必须定义它并使用:本地人以某种方式,但我还没弄明白.提前感谢您的任何提示!
我想在我的页面输出显示我的一个传感器(湿气)连接到Arduino.
下面的脚本,每隔一秒给我一些值(数字).
require 'dino'
board = Dino::Board.new(Dino::TxRx.new)
sensor = Dino::Components::Sensor.new(pin: 'A0', board: board)
on_data = Proc.new do |data|
puts data
sleep 1
end
sensor.when_data_received(on_data)
sleep
Run Code Online (Sandbox Code Playgroud)
我想我可以Sinatra用作API和Javascript脚本来显示异步输出.
所以这应该是这样的
%w(sinatra dino haml).each do |lib|
require lib
end
board = Dino::Board.new(Dino::TxRx.new)
sensor = Dino::Components::Sensor.new(pin: 'A0', board: board)
sleep 1
get '/' do
haml :index
end
get '/moisture' do
on_data = Proc.new do |data|
{ moisture_value: data }
sleep 1
end
sensor.when_data_received(on_data)
end
Run Code Online (Sandbox Code Playgroud)
你能给我一些提示或简单的好模式我应该如何处理?
我找到了样本sinatra app fo dino:https: …
我有一个简单的应用程序:
require "sinatra"
get "/" do
raise "Oops!"
end
Run Code Online (Sandbox Code Playgroud)
由于这是一个调试环境,我希望看到一个"RuntimeError:糟糕!" 显示在浏览器中.相反,似乎Sinatra崩溃了:
NoMethodError at / undefined method `join' for #<String:0x00000002b74bf0> Ruby /home/tomas/.rvm/.../gems/sinatra-1.4.5/lib/sinatra/show_exceptions.rb: in rescue in call, line 37 Web GET 127.0.0.1/
在控制台中的Backtrace:
RuntimeError - Oops!:
test.rb:5:in `block in '
/home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1603:in `call'
/home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1603:in `block in compile!'
/home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:966:in `[]'
/home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:966:in `block (3 levels) in route!'
/home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:985:in `route_eval'
/home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:966:in `block (2 levels) in route!'
/home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1006:in `block in process_route'
/home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1004:in `catch'
/home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1004:in `process_route'
/home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:964:in `block in route!'
/home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:963:in `each'
/home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:963:in `route!'
/home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1076:in `block in dispatch!' … 我向Sinatra应用程序发出了POST请求.我注意到参数作为StringIO到达服务器.它可以使用阅读request.body.read.但是,它只能读一次.要再读一遍,我需要跑request.body.rewind(哈哈,辛纳屈).
为什么这样设计?我可以看到这在流数据中很有用但是还有其他应用吗?
sinatra ×10
ruby ×6
arduino ×1
asynchronous ×1
caching ×1
database ×1
datamapper ×1
haml ×1
heroku ×1
http-headers ×1
javascript ×1
mongodb ×1
rack ×1
request ×1
scope ×1
security ×1