我正在尝试向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]
我的表单通过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,但不能使用它来设置值?
我正在制作一个小型的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()进程无阻塞,那会起作用吗?似乎喜欢黑客攻击它.
谢谢!
试图用一种更简洁的方式在HAML和Ruby中表达这个条件,也许用三元运算符:
- if @page.nil?
%br (nothing yet)
- else
%br #{@page.name}
Run Code Online (Sandbox Code Playgroud)
(根据Neat方式寻找类似的方法来有条件地测试是否在HAML模板中添加类)
你的帮助将不胜感激:)
我有一个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.
我正在尝试为自己创建一个直接连接到我的日历的应用程序......但我从不想参与重新验证.我只想编写一次身份验证代码并完成它.
验证码如下:
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) 我有一个nokigiri web scraper,它发布到我试图发布到heroku的数据库.我有一个sinatra应用程序前端,我想从数据库中提取.我是Heroku和Web开发的新手,并不知道处理这类事情的最佳方法.
我是否必须将上传到Web数据库的Web scraper脚本放在sinatra路径下(例如mywebsite.com/scraper)并且只是让它变得模糊不清以至于没有人访问它?最后,我想让sinatra部分成为从数据库中提取的休息api.
感谢所有输入
我正在使用Sinatra构建API(为客户端使用Angular并希望其他人可以访问API)并使其成为OAuth提供者.我想知道最好的路线是什么(解决现有的宝石或从Warden或其他东西推出自己的解决方案).
在使用Rails之前,已经使用了设计和门卫进行身份验证和oauth,想知道什么是Sinatra的最佳解决方案.
理想情况下,我不希望视图或能够扩展/修改现有解决方案的操作,因为我只是作为API与它进行交互.
所以,我想为我的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)
任何人都有任何想法,如果有可能禁用这个没有重新处理这些问题?
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 ×10
sinatra ×10
rack ×2
activerecord ×1
api ×1
google-api ×1
haml ×1
heroku ×1
oauth ×1
performance ×1
puma ×1
rake ×1
redis ×1
rubygems ×1
task ×1
warden ×1
web-services ×1