所以我有一个我用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的设置变量.任何想法如何在保持简洁的同时实现这一目标?
提前致谢!
嗨,我正在为技术人员编写一个多平台任务应用程序.我想尽可能多地处理平台(web,shell,桌面),因此我决定从服务器/ API开始.
我想用Ruby编写它,但是我认为Rails对于它来说有点过于沉重,即使它可以完成这项工作.Sinatra似乎也不适合这项任务.
所有服务器/ API都可以将简单的请求转换为数据库查询,并在稍后阶段进行一些身份验证和授权.
基本上我想知道:
1)我应该使用REST api还是SOAP api?
2)有这个框架吗?或者最接近的框架是什么?
在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应用程序,通过来自其他服务的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:当我问这个问题时,我显然没有想到.使用请求发送标头并不意味着我会在响应中收到它们.
所以现在的问题是:如何测试请求标头而不将其与响应一起发回?
我有一个响应api调用的Sinatra应用程序,以及一个处理报告和所有漂亮的东西(如图形和网站)的Rails应用程序.两者都需要访问一组通用模型(例如,帐户,站点等)
我的问题是:如何在两个应用程序之间有效地共享代码?例如,如果我在Sinatra中编辑Accounts模型,我不想记得在Rails应用程序中复制相同的更改.我宁愿不使用Rails Rack安装,因为这两个应用程序将在不同的集群上.
我在StackOverflow上看到过关于以下内容的建议:
这两个应用程序位于不同的存储库中.基本上,我首先开发API,然后在Rails应用程序中加入特定于帐户的逻辑(主要是因为Rails有更多的库,可以更容易地开发这些东西).
你会如何解决这个问题?
我试图使用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) 我有一个接受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的任何最佳实践指南也将非常受欢迎.
我在所有课程中使用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类
想法?
我正在建立一个混合了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对象的时区.这是一个简单的问题,它似乎应该有一个简单的解决方案!有没有人找到一个?提前致谢!
非常第一行写sinatra的是用Ruby以最小的代价快速创建web应用的DSL.我可以理解它重量轻,非常灵活,可以快速创建Web应用程序并且只需很少的工作量但无法理解它是如何成为DSL的?