Tag: 西纳特拉

如何使用Sinatra呈现纯HTML文件?

我有一个简单的sinatra应用程序。 我想要做的就是使用它作为包装器来在特定路由上提供静态HTML文件。 我的目录结构如下所示: /directory myhtmlfile.html app.rb 我的app.rb文件如下所示: require ‘sinatra’ get ‘/myspecialroute’ do html :myhtmlfile # i know html is not a method, but this is what I would like to do end 我怎么写这个,以便我可以保持我的html文件是一个简单的html文件,但在特殊的路线上提供它? 解: 多亏了这一点 ,我学到了几种不同的方法: get ‘/myspecialroute’ do File.read(‘myhtmlfile.html’) end 这将打开,读取,关闭,然后将文件作为字符串返回。 或者有一个辅助函数来使这个更干净: get ‘/myspecialroute’ do send_file ‘myhtmlfile.html’ end

Sinatra中与动词无关的匹配

我们可以写 get ‘/foo’ do … end 和 post ‘/foo’ do … end 这很好。 但是我可以在一个路由中组合多个HTTP动词吗?

如何在我的Sinantra应用程序/环境下运行Rake任务?

我正在使用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 racksh是一个模仿Rails控制台的gem。 所以我只是将种子文件中的代码直接输入其中。 它有效,但显然不理想。 我想做的是创建一个环境任务,允许命令在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 但我无法弄清楚如何设置环境以便rake任务可以在其下运行。 任何帮助将非常感激。

如何让Sinatra使用HTTPClient?

我正在尝试创建一个Facade API,通过Sinatra接收请求,然后在后端的Github API上启动HTTP请求。 在我的“你好世界”剧本中我有: #!/usr/bin/ruby require ‘httpclient’ require ‘sinatra’ get ‘/foo’ do “hello world” end 但是,它会遇到如下错误: $ ./api.rb /usr/local/share/gems/gems/sinatra-1.4.3/lib/sinatra/base.rb:1408:in `run!’: undefined method `run’ for HTTP:Module (NoMethodError) from /usr/local/share/gems/gems/sinatra-1.4.3/lib/sinatra/main.rb:25:in `block in ‘ 我不明白为什么会这样。 如果我注释掉require ‘httpclient’行,它就可以了: #!/usr/bin/ruby #require ‘httpclient’ require ‘sinatra’ get ‘/foo’ do “hello world” end $ ./api.rb [2013-06-26 21:43:12] INFO WEBrick 1.3.1 [2013-06-26 21:43:12] INFO […]

Sinatra在post上清除会话

enable :sessions set :session_secret, ‘secret’ post ‘/login’ do session[:loggedInUser] = jsondata[‘username’].to_s puts session[:loggedInUser] + ” is the session” end 在这一点上,一切都很好。 当我像这样阅读会话时: get ‘/debug’ do session.inspect end 它就在那里。 但问题来了。 当我稍后再次发送邮件请求时: post ‘/foo’ do # do nothing end 会话已清除。 为什么? 这是一个错误吗? 编辑 我已经缩小了问题范围:我通过nginx代理通过Sinatra,到http://app.local/backend – 这是问题发生的时候。 如果我通过http://localhost:4567运行Sinatra,它将按预期工作。 解 使用Rack::Session::Cookie而不是默认的enable :sessions : use Rack::Session::Cookie, :key => “rack.session”, :path => […]

Ruby / Sinatra – 提供css,javascript或图像文件

通过Sinatra路由您的请求以便在没有处理的情况下提供文件的正确方法是什么? 我正在寻找人们在Sinatra框架中最常见的方式吗? 我通常将所有静态内容放在“内容”路径中。 例子: /内容/ CSS /内容/ IMG /内容/ JS 如何使用通配符提供内容下的所有内容? 我很惊讶这里没有真正的例子: http://sinatra-book.gittr.com/

强制浏览器下载文件而不是打开它

我想将http://foobar.com/song.mp3下载为song.mp3 ,而不是让Chrome在浏览器的原生播放器中打开它。 我怎么能这样做呢?

使用机架安装的多个Sinatra应用程序

我有一个关于在Sinatra上使用机架安装的问题。 我有两个经典风格的Sinatra应用程序。 让我们调用app.rb中定义的一个App和api.rb中定义的另一个API。 我希望它能让api.rb处理所有以’/ api’开头的路由,而app.rb会处理所有其他请求,包括root(’/’)。 如何使用机架安装进行设置? 或者有更好的解决方案吗?

从Sinatra内部召唤Sinatra

我有一个基于Sinatra的REST服务应用程序,我想从其中一个路由中调用其中一个资源,从而有效地组合一个资源。 例如 get ‘/someresource’ do otherresource = get ‘/otherresource’ # do something with otherresource, return a new resource end get ‘/otherresource’ do # etc. end 重定向不起作用,因为我需要对第二个资源进行一些处理并从中创建一个新的。 显然我可以a)使用RestClient或其他一些客户端框架或者b)构造我的代码所以其他资源的所有逻辑都在一个方法中然后调用它,但是,感觉如果我可以重新使用它会更清洁使用他们的DSL从Sinatra内部使用我的资源。

如何在Sinatra的路线中找到更好的结构

我没有发现如何从其他模块混合路由,如下所示: module otherRoutes get “/route1” do end end class Server < Sinatra::Base include otherRoutes get "/" do #do something end end 那可能吗?