标签: sinatra

使用Sinatra和MongoDB - 什么是"保持活跃"http请求之间的mongodb连接的推荐方法?

我使用过ASP.NET,现在我正在使用Sinatra/MongoDB应用程序.使用ASP.NET体系结构,给定请求使用的数据库连接来自ADO.NET管理的连接池.在请求之间,池中的连接保持活动状态,因此不会为每个http请求支付构建和拆除连接的成本.

Sinatra MongoDB应用程序中是否有类似的机制,或者我是否需要连接/断开每个请求?如果有机制,代码是什么样的?

编辑1:以下不起作用.浏览器发送的每个HTTP请求都会命中new.db行,包括对css,js,jpeg文件的请求.

require 'mongo'
include Mongo

db = Mongo::Connection.new.db("MyDb")

class MyApp < Sinatra::Base
    get '/' do
       etc
Run Code Online (Sandbox Code Playgroud)

ruby sinatra mongodb

11
推荐指数
2
解决办法
8697
查看次数

在Ruby中逐个像素地读取图像

我正在尝试打开一个图像文件,并在变量/数组中按颜色存储像素列表,这样我就可以逐个输出它们.

图像类型:可以是BMP,JPG,GIF或PNG.其中任何一个都很好,只需要支持一个.颜色输出:RGB或Hex.

我看过几个库(RMagick,Quick_Magick,Mini_Magick等),它们看起来都有些过分.Heroku在ImageMagick上也遇到了一些困难,我的测试也没有运行.我的申请是在Sinatra.

有什么建议?

ruby imagemagick heroku sinatra

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

在Ruby/Sinatra中解码Facebook签名的请求

由于Facebook弃用了新的FBML,我正在寻找一种新的方式来创建一个"揭示"标签(一个页面选项卡,向粉丝显示一个版本,向非粉丝显示另一个版本).Facebook已将数据添加到signed_request:

当用户在左侧菜单中选择您的应用程序时,该应用程序将收到signed_request参数,其中包含一个附加参数page,一个JSON数组,其中包含您的Tab所在的Facebook页面的"id",一个布尔值(' likes')表示用户是否喜欢Page,还有一个布尔值('admin')表示用户是否是Page的'admin'以及用户信息数组.

我能够读取signed_request,但是我需要使用base64url解码来处理它以获得正确的JSON.另外,我在研究中发现JSON格式不正确,因此需要在解码之前进行修改.这是当前的代码(我现在只是在index.erb中打印已签名的请求):

helpers do
  def base64_url_decode str
    encoded_str = str.gsub('-','+').gsub('_','/')
    encoded_str += '=' while !(encoded_str.size % 4).zero?
    Base64.decode64(encoded_str)
  end

  def decode_data str
    encoded_sig, payload = str.split('.')
    data = ActiveSupport::JSON.decode base64_url_decode(payload)
  end
end

get '/' do
  signed_request = params[:signed_request]
  @signed_request = decode_data(signed_request)
  erb :index
end
Run Code Online (Sandbox Code Playgroud)

我试图保持应用程序尽可能轻,避免使用完整的Facebook库,因为这不是一个完整的应用程序(只是一个选项卡),不需要用户的任何额外权限.我也欢迎任何关于我的风扇探测方法的建议.

ruby base64 json facebook sinatra

11
推荐指数
2
解决办法
5445
查看次数

在Sinatra之上构建MVC结构

我正在学习Sinatra,我想知道是否有人知道为Sinatra的项目制作MVC结构的好方法.我有一些想法,但对我来说似乎太麻烦了.

ruby model-view-controller sinatra

11
推荐指数
2
解决办法
7911
查看次数

Sinatra和未设置的会话变量

由于某种原因,我的应用程序中没有设置会话变量.我正在使用Sinatra 1.2.1.

这是一段代码:

module GitWiki
  class App < Sinatra::Base

    configure do
      enable :sessions

      set :app_file, __FILE__
      set :root, File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))

      set :auth do |bool|
        condition do
          redirect '/login' unless logged_in?
        end
      end
    end

    helpers do
      def logged_in?
        not @user.nil?
      end
    end

    error PageNotFound do
      page = request.env["sinatra.error"].name
      redirect "/#{page}/edit"
    end

    before do
      content_type "text/html", :charset => "utf-8"
      @user = session[:user]
    end

    get "/login/?" do
      erb :login
    end

    post "/login" do
      user = User.get
      if user.authenticate(params[:username], params[:password])
        session[:user] = params[:username] …
Run Code Online (Sandbox Code Playgroud)

ruby session sinatra shotgun

11
推荐指数
1
解决办法
5748
查看次数

在Sinatra应用程序中注入依赖项

我正在编写一个调用一些外部服务的Sinatra应用程序.我希望我的测试显然可以避免调用真正的服务,所以在我拥有它的那一刻

class MyApp < Sinatra::Base
  get '/my_method' do
    @result = ExternalServiceHandler.new.do_request
    haml :my_view
  end
end
Run Code Online (Sandbox Code Playgroud)

在我的测试中

describe "my app" do
  include Rack::Test::Methods
  def app() MyApp end

  it "should show OK if call to external service returned OK" do
    @external_service_handler = MiniTest::Mock.new
    @external_service_handler.expect :do_request, "OK"

    #Do the injection

    get '/my_method'
    response.html.must_include "OK"
  end

  it "should show KO if call to external service returned KO" do
    @external_service_handler = MiniTest::Mock.new
    @external_service_handler.expect :do_request, "KO"

    #Do the injection

    get '/my_method'
    response.html.must_include "KO"
  end

end
Run Code Online (Sandbox Code Playgroud)

我可以想到两种注入方法.我可以调用实例方法或通过构造函数传递依赖项.无论如何,因为机架似乎没有让我访问当前的应用程序实例,我发现这是不可能的. …

ruby rack sinatra

11
推荐指数
2
解决办法
1569
查看次数

使用Sinatra时,如何控制静态资产的缓存?

我正在使用最新的Sinatra,我正在Heroku上主持.有没有办法可以为/public目录中提供的静态资产设置缓存标头?

/public在检查已定义的任何路由之前,Sinatra提供目录中的文件,因此我不能只是cache_control路由中的方法.

/public目录包含我的应用程序的CSS和JavaScript.我不希望浏览器每次都下载这些文件,因为它们不会经常更改.

ruby heroku sinatra

11
推荐指数
1
解决办法
4137
查看次数

如何使用ng-checked预先选择angularJs中的复选框

我似乎无法让这个工作.所以我有很多类型的电影,如果那些是用户数据库中的类型,我希望它们被检查.这是我的代码


%section(ng-controller="UserCtrl" ng-init="user_genres=#{preferred_genres}")
    %ul
         %li(ng:repeat="genre in preferred_genres")
            %input(type = "checkbox" ng:model="preferred_genres[genre]" id="genre-{{$index + 1}}" ng-checked="user_genres['{{genre}}']")
            %label{:for => "genre-{{$index + 1}}"} {{genre}}

这是#{preferred_genres}来自haml


{"Action & Adventure":true,"Animation":true,"Art House & International":true,"Classics":true,"Comedy":true,"Documentary":true,"Drama":true,"Horror":true,"Kids & Family":true,"Musical & Performing Arts":true,"Mystery & Suspense":true,"Romance":true,"Science Fiction & Fantasy":true,"Special Interest":true,"Sports & Fitness":true,"Television":true,"Western":true}

这意味着应该检查每个复选框.但是,当我加载页面时,没有选中复选框.但是,如果我硬编码ng-checked成这样的东西就可以了.


ng-checked="user_genres['Western']"

这真的很奇怪.请帮忙.

javascript ruby haml sinatra angularjs

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

无法使用rackup和jRuby启动简单的Sinatra应用程序(Web服务器无响应)

我有一个Sinatra"hello world"应用程序,我试图使用jRuby运行.它在我运行应用程序时有效,但在我运行机架时则无效.谁能告诉我这里发生了什么?

这是应用程序,在'app.rb'文件中:

require 'rubygems'
require 'bundler/setup'
require 'sinatra'

configure do
  set :bind, '0.0.0.0'
end

get '/' do
  'Boo!'
end
Run Code Online (Sandbox Code Playgroud)

我可以运行它bundle exec ruby app.rb,它工作正常:

jonea@centos7andy[~/andy/sinatra_sand_jruby]%: bundle exec ruby app.rb
[2015-01-12 10:36:06] INFO  WEBrick 1.3.1
[2015-01-12 10:36:06] INFO  ruby 1.9.3 (2014-12-09) [java]
== Sinatra/1.4.5 has taken the stage on 4567 for development with backup from WEBrick
[2015-01-12 10:36:06] INFO  WEBrick::HTTPServer#start: pid=31654 port=4567
Run Code Online (Sandbox Code Playgroud)

这是我的config.ru来调用上面的程序:

require 'rubygems'
require 'bundler/setup'
require 'sinatra'
require './app'

run Sinatra::Application
Run Code Online (Sandbox Code Playgroud)

如果我运行它,它似乎工作,但我无法使用Web浏览器访问服务器:

jonea@centos7andy[~/andy/sinatra_sand_jruby]%: bundle exec rackup -p4567 …
Run Code Online (Sandbox Code Playgroud)

ruby jruby sinatra rackup

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

无法激活sinatra-1.4.7,因为rack-2.0.1与rack冲突(〜> 1.5)

我刚刚将我的操作系统从Ubuntu 14.04 LTS更新到16.04,我在那里运行我的Ruby Sinatra项目.事情是更新后我试图运行服务器,然后在浏览器中的localhost我得到此错误启动错误

Something went wrong while loading app.rb
Gem::ConflictError: Unable to activate sinatra-1.4.7, because rack-2.0.1 conflicts with rack (~> 1.5)

/usr/lib/ruby/2.3.0/rubygems/specification.rb:2286:in `raise_if_conflicts'
/usr/lib/ruby/2.3.0/rubygems/specification.rb:1407:in `activate'
/usr/lib/ruby/2.3.0/rubygems.rb:196:in `rescue in try_activate'
/usr/lib/ruby/2.3.0/rubygems.rb:193:in `try_activate'
/usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:125:in `rescue in require'
/usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:40:in `require'
/home/leandro/Downloads/git-master/ruby sinatra/app.rb:1:in `<top (required)>'
/usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
/usr/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
/var/lib/gems/2.3.0/gems/shotgun-0.9.1/lib/shotgun/loader.rb:115:in `inner_app'
/var/lib/gems/2.3.0/gems/shotgun-0.9.1/lib/shotgun/loader.rb:103:in `assemble_app'
/var/lib/gems/2.3.0/gems/shotgun-0.9.1/lib/shotgun/loader.rb:86:in `proceed_as_child'
/var/lib/gems/2.3.0/gems/shotgun-0.9.1/lib/shotgun/loader.rb:31:in `call!'
/var/lib/gems/2.3.0/gems/shotgun-0.9.1/lib/shotgun/loader.rb:18:in `call'
/var/lib/gems/2.3.0/gems/shotgun-0.9.1/lib/shotgun/favicon.rb:12:in `call'
/var/lib/gems/2.3.0/gems/shotgun-0.9.1/lib/shotgun/static.rb:14:in `call'
/var/lib/gems/2.3.0/gems/rack-2.0.1/lib/rack/urlmap.rb:68:in `block in call'
/var/lib/gems/2.3.0/gems/rack-2.0.1/lib/rack/urlmap.rb:53:in `each'
/var/lib/gems/2.3.0/gems/rack-2.0.1/lib/rack/urlmap.rb:53:in `call'
/var/lib/gems/2.3.0/gems/rack-2.0.1/lib/rack/builder.rb:153:in `call'
/var/lib/gems/2.3.0/gems/rack-2.0.1/lib/rack/handler/webrick.rb:86:in `service'
/usr/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service'
/usr/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run'
/usr/lib/ruby/2.3.0/webrick/server.rb:296:in `block in start_thread' …
Run Code Online (Sandbox Code Playgroud)

rack rubygems sinatra

11
推荐指数
2
解决办法
4005
查看次数