标签: sinatra

使用Sinatra时如何从gem导入rake任务?

我正在尝试向orientdb gem添加一些基本的rake任务,这将允许我创建数据库,创建数据库迁移和迁移数据库 - 类似于rails迁移.

当我在本地执行rake任务时,我得到db:settings,db:create和db:create_migration工作,但是在我将它们放入gem之后我无法弄清楚如何在使用时从Sinatra应用程序访问它们"耙".

我有一种感觉,我要么a)没有正确组织宝石中的文件和/或b)没有从Sinatra应用程序正确调用的东西.

我的分叉存储库的当前状态位于https://github.com/ricaurte/orientdb-jruby

我把文件放在lib/orientdb/tasks/database.rake => https://github.com/ricaurte/orientdb-jruby/blob/master/lib/orientdb/tasks/database.rake中.

Sinatra App Rakefile

APPLICATION_ROOT = File.expand_path('..', __FILE__)

require 'rake'
require 'orientdb'
#import "orientdb/tasks/database.rake"

task :environment do
  require File.expand_path(File.join(*%w[ config environment ]), File.dirname(__FILE__))
end
Run Code Online (Sandbox Code Playgroud)

配置/环境

require "rubygems"
require "bundler"
Bundler.setup

require 'sinatra'
require "orientdb"
Run Code Online (Sandbox Code Playgroud)

ruby:jruby 1.6.0(ruby 1.9.2 patchlevel 136)(2011-03-24 5f5278c)(OpenJDK 64位服务器VM 1.6.0_20)[linux-amd64-java]

ruby rake rubygems task sinatra

6
推荐指数
1
解决办法
1567
查看次数

使用符号读取和编写Sinatra params,例如params [:id]

我的表单通过POST接收数据.当我这样做时,puts params我可以看到:

{"id" => "123", "id2" => "456"}
Run Code Online (Sandbox Code Playgroud)

现在的命令:

puts params['id']    # =>  123
puts params[:id]     # =>  123

params['id'] = '999'
puts params          # => {"id" => "999", "id2" => "456"}
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时:

params[:id] = '888'
puts params
Run Code Online (Sandbox Code Playgroud)

我明白了

{"id" => "999", "id2" => "456", :id => "888"}
Run Code Online (Sandbox Code Playgroud)

在IRB中它工作正常:

params
# => {"id2"=>"2", "id"=>"1"}

params[:id]
# => nil

params['id']
# => "1"
Run Code Online (Sandbox Code Playgroud)

为什么我可以使用读取值:id,但不能使用它来设置值?

ruby sinatra

6
推荐指数
1
解决办法
1515
查看次数

如何发送响应但继续在Sinatra执行?

我正在制作一个小型的sinatra应用程序.它会进行一些Redis调用,返回数据,然后进行最后的Redis调用以保存"统计信息".

到目前为止,如果我想提前终止请求(基于输入),我发现我可以使用暂停:

# code code
halt send_blank if is_blocked? SETTINGS, host
# code code
Run Code Online (Sandbox Code Playgroud)

在最后,我希望有这样的事情:

response.body = JSON.generate(outgoing)
# update user
STATISTICS.hset('u:' + userID, 'data', JSON.generate({'ip' => request.ip, 'time' => Time.now.to_f.to_s}))
Run Code Online (Sandbox Code Playgroud)

是否可以发送响应然后执行5~ms redis写入,以便客户端不必等待?无论我在何处或如何进行最终统计redis调用,它都会将响应的发送延迟几毫秒 - 无法欺骗sinatra.

这可以很容易地在Node中完成,但只是写下我想做的事情,它会在响应发送后触发; 据我所知,这里的代码会在拍摄回复之前阻止执行大约5ms.

我尝试使用after ... do过滤器,它们会正常工作,除了你不能传递给除了response.body中的数据之外的任何东西 - 意味着你不能将任何不会传递给过滤器的东西传递给它们输出!通过分配在帖子范围之外的变量("/")来避免这个问题是可能的,但是每秒有100多个请求,我希望你能看到通过"全局"类型交换数据如何成为一个巨大的问题.

看起来真的很简单,但我找不到比...更好的东西..在文档中做过滤器.

我可以创建一个线程或其他东西来使redis.hset()进程无阻塞,那会起作用吗?似乎喜欢黑客攻击它.

谢谢!

ruby performance rack sinatra redis

6
推荐指数
1
解决办法
1348
查看次数

用三元运算符表示条件HAML

试图用一种更简洁的方式在HAML和Ruby中表达这个条件,也许用三元运算符:

- if @page.nil?
  %br (nothing yet)
- else
  %br #{@page.name}
Run Code Online (Sandbox Code Playgroud)

(根据Neat方式寻找类似的方法来有条件地测试是否在HAML模板中添加类)

你的帮助将不胜感激:)

ruby haml sinatra

6
推荐指数
1
解决办法
6202
查看次数

当多个应用程序在Ruby中共享同一个数据库时,如何管理迁移?

我有一个Rails应用程序和一个Sinatra应用程序,共享相同的数据库.Sinatra应用程序使用ActiveRecord.

我可以在每个应用中运行迁移,就好像它们位于同一个应用中一样吗?这会导致任何问题吗?

Rails应用程序中的schema.rb文件跟踪当前的迁移

ActiveRecord::Schema.define(:version => 20121108154656) do
Run Code Online (Sandbox Code Playgroud)

但是,Sinatra应用程序如何知道数据库的当前版本?

Rails 3.2.2,Ruby 1.9.3.

ruby activerecord ruby-on-rails database-migration sinatra

6
推荐指数
1
解决办法
2187
查看次数

尝试在ruby中将服务器授权为服务器类型应用程序以访问Google日历时无效授权

我正在尝试为自己创建一个直接连接到我的日历的应用程序......但我从不想参与重新验证.我只想编写一次身份验证代码并完成它.

验证码如下:

key = Google::APIClient::PKCS12.load_key(SERVICE_ACCOUNT_PKCS12_FILE_PATH, PASSWORD)
asserter = Google::APIClient::JWTAsserter.new(
    SERVICE_ACCOUNT_EMAIL,
    'https://www.googleapis.com/auth/calendar', 
    key)
@client = Google::APIClient.new
@client.authorization = asserter.authorize#(SERVICE_ACCOUNT_EMAIL)
@client
Run Code Online (Sandbox Code Playgroud)

我的SERVICE_ACCOUNT_...PKCS .文件和我的Sinatra应用程序一起位于目录的根目录中.
我已在我的Gmail帐户上启用了Google Calendar API.

我一直在寻找一种身份验证方法:https: //code.google.com/p/google-api-ruby-client/(在授权下,它谈到服务器到服务器的通信)

$ ruby server.rb 
Faraday: you may want to install system_timer for reliable timeouts
/home/me/.rvm/gems/ruby-1.8.7-p371/gems/faraday-0.8.4/lib/faraday/utils.rb:16: warning: already initialized constant KeyMap
/home/me/.rvm/gems/ruby-1.8.7-p371/gems/faraday-0.8.4/lib/faraday/utils.rb:177: warning: already initialized constant DEFAULT_SEP
W, [2013-01-15T09:52:11.371122 #28607]  WARN -- : Google::APIClient - Please provide :application_name and :application_version when initializing the client
/home/me/.rvm/gems/ruby-1.8.7-p371/gems/signet-0.4.4/lib/signet/oauth_2/client.rb:869:in `fetch_access_token': Authorization failed.  Server message: (Signet::AuthorizationError) …
Run Code Online (Sandbox Code Playgroud)

ruby google-calendar-api google-api sinatra

6
推荐指数
1
解决办法
1427
查看次数

Heroku和Web抓取

我有一个nokigiri web scraper,它发布到我试图发布到heroku的数据库.我有一个sinatra应用程序前端,我想从数据库中提取.我是Heroku和Web开发的新手,并不知道处理这类事情的最佳方法.

我是否必须将上传到Web数据库的Web scraper脚本放在sinatra路径下(例如mywebsite.com/scraper)并且只是让它变得模糊不清以至于没有人访问它?最后,我想让sinatra部分成为从数据库中提取的休息api.

感谢所有输入

ruby api web-services heroku sinatra

6
推荐指数
1
解决办法
2735
查看次数

Sinatra REST API应用程序的身份验证

我正在使用Sinatra构建API(为客户端使用Angular并希望其他人可以访问API)并使其成为OAuth提供者.我想知道最好的路线是什么(解决现有的宝石或从Warden或其他东西推出自己的解决方案).

在使用Rails之前,已经使用了设计和门卫进行身份验证和oauth,想知道什么是Sinatra的最佳解决方案.

理想情况下,我不希望视图或能够扩展/修改现有解决方案的操作,因为我只是作为API与它进行交互.

ruby authentication oauth sinatra warden

6
推荐指数
1
解决办法
5339
查看次数

禁用Rack :: CommonLogger,无需修补猴子

所以,我想为我的sinatra应用程序完全自定义日志记录,但我似乎无法禁用Rack::CommonLogger.

根据sinatra文档,我应该做的是添加以下行(尝试将其设置false为):

set :logging, nil
Run Code Online (Sandbox Code Playgroud)

到我的配置.但这不起作用,我仍然在终端中收到类似Apache的日志消息.所以我到目前为止找到的唯一解决方案是修补该死的东西.

module Rack
  class CommonLogger
    def call(env)
      # do nothing
      @app.call(env)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

任何人都有任何想法,如果有可能禁用这个没有重新处理这些问题?

ruby rack sinatra puma

6
推荐指数
2
解决办法
1689
查看次数

Sinatra方法`开发?`undefined

Sinatra文档说development?当环境开发时会返回true,但是我收到一个错误,指出该方法development?未定义.

我尝试跳过速记并测试ENV['RAKE_ENV']变量本身,但它只是零.

这是我得到的错误:

undefined method `development?' for main:Object (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

这是触发错误的代码:

require 'dm-sqlite-adapter' if development?
Run Code Online (Sandbox Code Playgroud)

我正在使用模块化风格的应用程序.上面的行是一个单独的文件,只管理模型.这是怎么回事?

ruby sinatra

6
推荐指数
2
解决办法
731
查看次数