标签: sinatra

如何检查Sinatra中是否存在模板

在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"方法.

ruby templates sinatra

4
推荐指数
2
解决办法
1776
查看次数

使用RestClient和Sinatra发送和接收JSON

我试图通过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个小时.请帮忙

ruby sinatra rest-client

4
推荐指数
1
解决办法
4万
查看次数

是否可以将Nesta CMS包含在Rails3应用程序中?

我想将Nesta CMS应用程序“安装”到Rails3应用程序上。这可能是因为Nesta是Sinatra应用程序,应该是可在机架上安装的图层,但是……您将如何做呢?您将从哪里开始?有人对此主题有经验吗?建议的文档?

blogs rack sinatra content-management-system ruby-on-rails-3

4
推荐指数
1
解决办法
1407
查看次数

获取控制器范围内的当前路径匹配器

就像是:

get '/1.0/users/:id'
  puts current_route_matcher.to_s # '/1.0/users/:id'
end
Run Code Online (Sandbox Code Playgroud)

需要让它为每种资源类型构建统计信息.

ruby sinatra

4
推荐指数
1
解决办法
767
查看次数

从预定作业在Pony邮件中呈现haml时未定义的方法`haml'

我有一个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模板的电子邮件作为预定的工作?

haml sinatra pony rufus-scheduler

4
推荐指数
1
解决办法
1127
查看次数

用法拉第作为参数发布图像

我有旧服务和新服务,上面有图片.我想将图像从旧迁移到新的.为此我需要从我的旧服务中获取图像,然后将其发布到新的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相同的行为.我认为它已经用中间件做了一些事情,我试过调整,但我仍然是一个新手.

ruby-on-rails sinatra net-http faraday

4
推荐指数
1
解决办法
2566
查看次数

ruby sinatra远程连接

我正试图让你的世界在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.有什么我缺少的吗?谷歌搜索我有困难.

ruby apache sinatra

4
推荐指数
1
解决办法
1106
查看次数

JSON :: ParserError:JSON文本必须至少包含两个八位字节!(对于非零输入)

所以,我意识到已经就这个问题提出了两个 问题,但(不幸的是)我的情况似乎有所不同.

西纳特拉自述说,做了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)

......但我不确定是否/如何帮助.

ruby post json sinatra

4
推荐指数
1
解决办法
1万
查看次数

在Digital Ocean上部署Sinatra后接收ERR_CONNECTION_REFUSED

部署小型Sinatra应用程序时遇到问题,该应用程序在本地可以正常运行,并且看起来像在数字海洋中运行,但是不能通过域名来攻击。以下是我收到的消息:

此网页无法使用

错误代码:ERR_CONNECTION_REFUSED

以下是使用rackup -p 80在我的小滴上显示的内容,对我来说,这表明它应该能够被击中:

瘦Web服务器(v1.6.3代号Protein Powder)

最大连接数设置为1024

在localhost:80上监听,按CTRL + C停止

如果有什么不同,我也不能直接点击IP地址。任何人遇到类似的问题或可能的解决方案?该应用程序在ubuntu上,使用psql作为数据库。这将不胜感激。谢谢!

postgresql sinatra web-deployment digital-ocean

4
推荐指数
1
解决办法
573
查看次数

如何获得Sinatra的当前路线/路线?

我希望在我的一个视图中获取当前路径/路径以用于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有可能吗?实现它的最佳方法是什么?

ruby render path sinatra

4
推荐指数
1
解决办法
5139
查看次数