在Sinatra ruby框架中,我有一条这样的路线:
get '/portfolio/:item' do
haml params[:item].to_sym
end
Run Code Online (Sandbox Code Playgroud)
如果存在的模板(例如,如果我点击/portfolio/website,并且我有一个模板被调用/views/website.haml),这很有用,但是如果我尝试没有模板的URL example.com/portfolio/notemplate,我会收到此错误:
Errno :: ENOENT at/portfolio/notemplate
没有这样的文件或目录 - /.../views/notemplate.haml
如何测试并捕获模板是否存在?我在Sinatra文档中找不到"if template exists"方法.
我试图通过RestClient ruby API将JSON数据发送到Sinatra应用程序.
在客户端(client.rb)(使用RestClient API)
response = RestClient.post 'http://localhost:4567/solve', jdata, :content_type => :json, :accept => :json
Run Code Online (Sandbox Code Playgroud)
在服务器(Sinatra)
require "rubygems"
require "sinatra"
post '/solve/:data' do
jdata = params[:data]
for_json = JSON.parse(jdata)
end
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
/Library/Ruby/Gems/1.8/gems/rest-client-1.5.1/lib/restclient/abstract_response.rb:53:in `return!': Resource Not Found (RestClient::ResourceNotFound)
from /Library/Ruby/Gems/1.8/gems/rest-client-1.5.1/lib/restclient/request.rb:193:in `process_result'
from /Library/Ruby/Gems/1.8/gems/rest-client-1.5.1/lib/restclient/request.rb:142:in `transmit'
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/http.rb:543:in `start'
from /Library/Ruby/Gems/1.8/gems/rest-client-1.5.1/lib/restclient/request.rb:139:in `transmit'
from /Library/Ruby/Gems/1.8/gems/rest-client-1.5.1/lib/restclient/request.rb:56:in `execute'
from /Library/Ruby/Gems/1.8/gems/rest-client-1.5.1/lib/restclient/request.rb:31:in `execute'
from /Library/Ruby/Gems/1.8/gems/rest-client-1.5.1/lib/restclient.rb:72:in `post'
from client.rb:52
Run Code Online (Sandbox Code Playgroud)
我想要的是发送JSON数据并使用RestClient和Sinatra接收JSON数据.但是无论我尝试什么,我都会收到上述错误.我坚持了3个小时.请帮忙
我想将Nesta CMS应用程序“安装”到Rails3应用程序上。这可能是因为Nesta是Sinatra应用程序,应该是可在机架上安装的图层,但是……您将如何做呢?您将从哪里开始?有人对此主题有经验吗?建议的文档?
blogs rack sinatra content-management-system ruby-on-rails-3
就像是:
get '/1.0/users/:id'
puts current_route_matcher.to_s # '/1.0/users/:id'
end
Run Code Online (Sandbox Code Playgroud)
需要让它为每种资源类型构建统计信息.
我有一个sinatra应用程序执行黄瓜测试并发送电子邮件通知与他们的结果.电子邮件gem是Pony,这个通知有一个haml模板.
此逻辑在路径中起作用:
require 'sinatra'
require 'haml'
require 'pony'
get "/execute_all/?" do
execute_all_tests()
Pony.mail :to => "recipients@email.com",
:from => "do-not-reply@email.com",
:subject => "Test results,
:html_body => haml(:email_layout)
redirect "/"
end
Run Code Online (Sandbox Code Playgroud)
但是,当我使用rufus调度程序执行这些操作的预定作业时,我得到以下异常:
scheduler caught exception:
undefined method `haml' for main:Object
Run Code Online (Sandbox Code Playgroud)
代码是来自路线的copypasta:
scheduler = Rufus::Scheduler.start_new
scheduler.every '2h' do
execute_all_tests()
Pony.mail :to => "recipients@email.com",
:from => "do-not-reply@email.com",
:subject => "Test results,
:html_body => haml(:email_layout)
end
Run Code Online (Sandbox Code Playgroud)
所有两个方法都在同一个文件中,执行以运行Sinatra app.
如何摆脱这个异常,并发送带有haml模板的电子邮件作为预定的工作?
我有旧服务和新服务,上面有图片.我想将图像从旧迁移到新的.为此我需要从我的旧服务中获取图像,然后将其发布到新的sinatra服务.我能够以我想要使用NET :: HTTP的格式发布图像
url = URI.parse('http://0.0.0.0:9292/')
File.open("./Belgium.png") do |jpg|
req = Net::HTTP::Post::Multipart.new url.path, {"image" => UploadIO.new(jpg, "image/jpeg", "Belgium.jpg"), id:4234}
res = Net::HTTP.start(url.host, url.port) do |http|
http.request(req)
end
end
Run Code Online (Sandbox Code Playgroud)
我在Sinatra服务上用post post方法得到的参数是
params = {"image"=>
{:filename=>"Belgium.jpg", :type=>"image/jpeg",:name=>"image",:tempfile=> #<File:/var/folders/h7/f9cvygqs3lg78kwh24v8yzp80000gn/T/RackMultipart20120827-76057-1f3inkn>,
:head=> "Content-Disposition: form-data; name=\"image\";filename=\"Belgium.jpg\"\r\nContent-Length: 28228\r\nContent-Type: image/jpeg\r\nContent-Transfer-Encoding: binary\r\n"},
"id"=>"4234"}
Run Code Online (Sandbox Code Playgroud)
但我无法用法拉第获得相同的结果.我尝试过使用类似的东西:
payload = { :profile_pic => Faraday::UploadIO.new('avatar.jpg', 'image/jpeg') }
Faraday.post 'http://0.0.0.0:9292/', payload
Run Code Online (Sandbox Code Playgroud)
在我的服务中我得到这样的东西:
"#<'UploadIO:0x007fb950373de8>"一个对象.这不是我期望的服务.
我怎样才能获得与Net :: HTTP相同的行为.我认为它已经用中间件做了一些事情,我试过调整,但我仍然是一个新手.
我正试图让你的世界在sinatra远程工作:
require 'sinatra'
get '/' do
"hello world"
end
Run Code Online (Sandbox Code Playgroud)
在本地它工作正常:
curl localhost:4567
hello world
Run Code Online (Sandbox Code Playgroud)
但是当我尝试远程访问它时,我收到404错误.服务器可见; 我有其他Web应用程序运行正常(但不是非标准端口).这是一个近乎库存的ubuntu安装,所以没有任何iptables规则可以阻止访问端口4567.有什么我缺少的吗?谷歌搜索我有困难.
所以,我意识到已经就这个问题提出了两个 问题,但(不幸的是)我的情况似乎有所不同.
该西纳特拉自述说,做了POST数据如下:
post "/api" do
request.body.rewind # in case someone already read it
data = JSON.parse request.body.read
"Hello #{data['name']}!"
end
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,我得到:
JSON::ParserError: A JSON text must at least contain two octets!
Run Code Online (Sandbox Code Playgroud)
其他问题涉及数据为零或格式不正确(\"而不是")的情况,但我的数据似乎很好.如果我打开irb和JSON.parse完全相同的字符串,我正在POST,它工作得很好.
这是我用来测试的命令:
curl -XPOST http://localhost:5000/endpoint --data '{"foo":"bar","blah":"wat","abcdefghijklmnop":"qrstuvwxyz"}'
Run Code Online (Sandbox Code Playgroud)
我觉得这应该是非常明显的,因为解析POST数据对于Web服务器来说是一件非常基本的事情.显然不是.
编辑:如果我打电话logger.info Hash[params],我得到:
{"{\"foo\":\"bar\",\"blah\":\"wat\",\"abcdefghijklmnop\":\"qrstuvwxyz\"}"=>nil, "splat"=>[], "captures"=>["endpoint"], "resource"=>"endpoint"}
Run Code Online (Sandbox Code Playgroud)
......但我不确定是否/如何帮助.
部署小型Sinatra应用程序时遇到问题,该应用程序在本地可以正常运行,并且看起来像在数字海洋中运行,但是不能通过域名来攻击。以下是我收到的消息:
此网页无法使用
错误代码:ERR_CONNECTION_REFUSED
以下是使用rackup -p 80在我的小滴上显示的内容,对我来说,这表明它应该能够被击中:
瘦Web服务器(v1.6.3代号Protein Powder)
最大连接数设置为1024
在localhost:80上监听,按CTRL + C停止
如果有什么不同,我也不能直接点击IP地址。任何人遇到类似的问题或可能的解决方案?该应用程序在ubuntu上,使用psql作为数据库。这将不胜感激。谢谢!
我希望在我的一个视图中获取当前路径/路径以用于if statmenent.
例如,我想要实现这样的事情:
example.erb:
<h4>Foobar<h4>
<p>foo bar foo bar foo bar</p>
<% if current_route == /hello %>
<%= erb :_hello %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
app.rb:
get '/foobar' do
erb :example
end
get '/hello' do
erb :example
end
Run Code Online (Sandbox Code Playgroud)
这样,两条路线转到同一视图,但如果通过途径访问/hello,它将_hello.erb在视图上呈现额外的部分.
这在Sinatra有可能吗?实现它的最佳方法是什么?