标签: sinatra

Erb与Sinatra在红宝石中

所以我有一个我用sinatra构建的网络服务器,其内容如下:

set :variable,"value"
get '/' do
  erb :index
end
Run Code Online (Sandbox Code Playgroud)

当然,模板views/index.erb看起来像这样:

<html>
<!-- etc -->
  <ul>
  <% my_array.each do |thing| %>
  <%="Something: #{thing}, variable from sinatra: #{settings.variable}"%>
  <% end %>
  </ul>
</html>
Run Code Online (Sandbox Code Playgroud)

如果您尝试运行这样的代码,您会注意到您无法从erb模板内部访问sinatra的设置变量.任何想法如何在保持简洁的同时实现这一目标?

提前致谢!

ruby erb sinatra

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

在Ruby框架中编写API?

嗨,我正在为技术人员编写一个多平台任务应用程序.我想尽可能多地处理平台(web,shell,桌面),因此我决定从服务器/ API开始.

我想用Ruby编写它,但是我认为Rails对于它来说有点过于沉重,即使它可以完成这项工作.Sinatra似乎也不适合这项任务.

所有服务器/ API都可以将简单的请求转换为数据库查询,并在稍后阶段进行一些身份验证和授权.

基本上我想知道:

1)我应该使用REST api还是SOAP api?

2)有这个框架吗?或者最接近的框架是什么?

ruby api rest ruby-on-rails sinatra

8
推荐指数
2
解决办法
5655
查看次数

如何使用符号访问Sinatra params?

在Sinatra中,我使用params来获取通过URL查询字符串传递的键/值.我注意到我可以使用字符串或符号作为获取值的键.因此,如果URL是:

http://localhost:4567/x?a=1&b=2
Run Code Online (Sandbox Code Playgroud)

然后:

params[:a] # => "1"
params["a"] # => "1"
params.to_s # => '{"name"=>"x", "a"=>"1", "b"=>"2"}'
params.class # => Hash
Run Code Online (Sandbox Code Playgroud)

我可以告诉params是一个哈希.但这似乎不是Hash的常见行为.

h = {"a" => "1", "b" => "2"}
h["a"] # => "1"
h[:a] # => nil
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下如何通过Sinatra实现这一目标吗?

sinatra

8
推荐指数
1
解决办法
5335
查看次数

如何在Sinatra中使用rspec和rack-test测试头文件

所以我有一个Sinatra应用程序,通过来自其他服务的HTTP POST接收XML.我想在本地测试它.我有一个测试XML文件,我发送到端点.这很顺利.我还设置了一些像这样的标题:

post '/', xml, 'HTTP_X_MY_AWESOME_HEADER' => "It's value"
Run Code Online (Sandbox Code Playgroud)

其中xml是发送到我的端点的普通XML的确切副本.但我作为参数传递的标题永远不会显示在输出中.

我在这里做错了吗?这里有很多关于它的帖子,但都过时了.

我正在使用Rspec 2.8,Sinatra 1.3.2,Ruby 1.9.3-p0,Rack :: Test 0.6.1.

更新2012-01-28 11:37:当我问这个问题时,我显然没有想到.使用请求发送标头并不意味着我会在响应中收到它们.

所以现在的问题是:如何测试请求标头而不将其与响应一起发回?

rack rspec sinatra

8
推荐指数
1
解决办法
5523
查看次数

在Sinatra和Rails之间共享模型代码

我有一个响应api调用的Sinatra应用程序,以及一个处理报告和所有漂亮的东西(如图形和网站)的Rails应用程序.两者都需要访问一组通用模型(例如,帐户,站点等)

我的问题是:如何在两个应用程序之间有效地共享代码?例如,如果我在Sinatra中编辑Accounts模型,我不想记得在Rails应用程序中复制相同的更改.我宁愿不使用Rails Rack安装,因为这两个应用程序将在不同的集群上.

我在StackOverflow上看到过关于以下内容的建议:

  • Git模块
  • 符号链接(不适用于我的同事使用的Windows)
  • Rails插件(我怀疑这适用于Sinatra)
  • Ruby Gems(我觉得这对于模型数据来说太过分了,但那只是我)

这两个应用程序位于不同的存储库中.基本上,我首先开发API,然后在Rails应用程序中加入特定于帐户的逻辑(主要是因为Rails有更多的库,可以更容易地开发这些东西).

你会如何解决这个问题?

ruby-on-rails sharing sinatra

8
推荐指数
1
解决办法
789
查看次数

未定义的方法failure_app for nil:NilClass

我试图使用Rails应用程序的设计来授予对Rack中间件中的Sinatra应用程序的访问权限.

我的config/routes.rb有:

authenticate "admin" do
  mount Admins::Dashboard, :at => "/admins"                                                                                                        
end
Run Code Online (Sandbox Code Playgroud)

在我的Sinatra应用程序中,我使用:

before do
  env["warden"].authenticate!(:scope => "admin")                                                                                                 
end

get "/dashboard" do
  erb :dashboard
end
Run Code Online (Sandbox Code Playgroud)

现在,我得到以下stacktrace的错误:

Started GET "/admins/dashboard" for 127.0.0.1 at 2012-10-11 08:45:13 +0200

NoMethodError (undefined method `failure_app' for nil:NilClass):
  devise (2.1.2) lib/devise/delegator.rb:11:in `failure_app'
  devise (2.1.2) lib/devise/delegator.rb:5:in `call'
  warden (1.2.1) lib/warden/manager.rb:130:in `call_failure_app'
  warden (1.2.1) lib/warden/manager.rb:116:in `process_unauthenticated'
  warden (1.2.1) lib/warden/manager.rb:47:in `call'
  actionpack (3.2.8) lib/action_dispatch/middleware/best_standards_support.rb:17:in `call'
  rack (1.4.1) lib/rack/etag.rb:23:in `call'
  rack (1.4.1) lib/rack/conditionalget.rb:25:in `call'
Run Code Online (Sandbox Code Playgroud)

rack sinatra devise warden

8
推荐指数
1
解决办法
6977
查看次数

如何使用Sinatra + rspec测试我的JSON API

我有一个接受JSON的post方法:

post '/channel/create' do
  content_type :json

  @data = JSON.parse(env['rack.input'].gets)

  if @data.nil? or !@data.has_key?('api_key')
    status 400
    body({ :error => "JSON corrupt" }.to_json)
  else
    status 200
    body({ :error => "Channel created" }.to_json)
  end
Run Code Online (Sandbox Code Playgroud)

作为rspec的新手,我很困惑,试图找出如何使用可接受的JSON有效负载编写针对该POST的测试.我最接近的是这是非常不准确但我似乎没有问谷歌上帝正确的问题,以帮助我在这里.

  it "accepts create channel" do
    h = {'Content-Type' => 'application/json'}
    body = { :key => "abcdef" }.to_json
    post '/channel/create', body, h
    last_response.should be_ok
  end
Run Code Online (Sandbox Code Playgroud)

在Sinatra中测试API的任何最佳实践指南也将非常受欢迎.

api rspec sinatra

8
推荐指数
1
解决办法
6496
查看次数

在没有rails的ruby中实现rails before_filter

我在所有课程中使用ga logger.我希望每个msg都以类名和方法名开头,如下所示:

Class_name::Method_name
Run Code Online (Sandbox Code Playgroud)

这就是我现在正在做的事情:

class FOO

 def initialize
 end

 def bar
   msg_prefix = "#{self.class}::#{__method__}"
   ... some code ...
   @logeer = "#{msg_prefix} msg ..."
 end

 def bar2
   msg_prefix = "#{self.class}::#{__method__}"
   ... some code 2 ...
   @logeer = "#{msg_prefix} msg2 ..."
 end

end
Run Code Online (Sandbox Code Playgroud)

我想使用像rails中的before_filter来防止重复,我正在使用,sinatra但这些类是普通的旧ruby 1.9.3

想法?

ruby before-filter sinatra ruby-1.9.3

8
推荐指数
1
解决办法
2537
查看次数

更改纯红宝石的时区(不是铁轨)

我正在建立一个混合了UTC/PST数据源的Sinatra站点,但将在PST中查看.所以我需要一种方法来轻松地将时间对象从UTC转换为PST.如果没有Rails的,我没有访问Time.zone,in_time_zone等等.

我只需要更改Time对象的时区,例如 2014-08-14 21:44:17 +0000 => 2014-08-14 14:44:17 -0700.

首先我尝试了这个:

class Time
  def to_pst
    self.utc + Time.zone_offset('PDT')
  end
end
Run Code Online (Sandbox Code Playgroud)

但这会改变实际的时间戳而不是区域.我需要两个time.to_i并且time.strftime工作; 所以我不能改变时间戳的绝对值.

> t = Time.now
=> 2014-08-14 21:46:20 +0000
> t.to_pst
=> 2014-08-14 14:46:20 UTC
> t.to_i
=> 1408052780
> t.to_pst.to_i
=> 1408027580
Run Code Online (Sandbox Code Playgroud)

gem'timezone'提出了类似的问题.

解决方案有效,但会改变全局变量,并且不是线程安全的.

操作系统时区需要保持UTC.

我只需要一种方法来改变单个Time对象的时区.这是一个简单的问题,它似乎应该有一个简单的解决方案!有没有人找到一个?提前致谢!

ruby time timezone sinatra

8
推荐指数
2
解决办法
8746
查看次数

为什么sinatra是DSL?

非常第一行sinatra是用Ruby以最小的代价快速创建web应用的DSL.我可以理解它重量轻,非常灵活,可以快速创建Web应用程序并且只需很少的工作量但无法理解它是如何成为DSL的?

ruby sinatra

8
推荐指数
1
解决办法
1293
查看次数

标签 统计

sinatra ×10

ruby ×5

api ×2

rack ×2

rspec ×2

ruby-on-rails ×2

before-filter ×1

devise ×1

erb ×1

rest ×1

ruby-1.9.3 ×1

sharing ×1

time ×1

timezone ×1

warden ×1