标签: rack

Rack app与rails app有什么区别?

我将我的rails 2.3.8应用程序上传到DreamHost,并收到有关机架版本不兼容的错误.我发了一张支持票,服务人员建议我删除config.ru.

这解决了这个问题.但我想知道这会产生什么影响.

一个rails应用程序没有config.ru可以吗?

rack ruby-on-rails

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

在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
查看次数

在特定的Rails路由上触发Rack中间件

是否可以仅在特定的Rails路由上触发Rack中间件?

例如,假设我想仅在api命名空间上运行速率限制器中间件.

namespace :api do
  resources :users
end
Run Code Online (Sandbox Code Playgroud)

rack ruby-on-rails

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

为什么Rails生成一个运行类而不是对象的config.ru?

机架指定

Rack应用程序是响应调用的Ruby对象(不是类).

因此,一个简单的config.ru看起来像这样:

class MyApp
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello from Rack!\n"]]
  end
end

run MyApp.new
Run Code Online (Sandbox Code Playgroud)

而Rails生成这个:

# This file is used by Rack-based servers to start the application.

require ::File.expand_path('../config/environment',  __FILE__)
run RailsApp::Application
Run Code Online (Sandbox Code Playgroud)

所以,我想知道:为什么不在run RailsApp::Application.newRack指定它是一个对象而不是一个类?Rails::Application我缺少什么特别的东西?

ruby rack ruby-on-rails

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

Rails/Rack:POST数据的"ArgumentError:invalid%-encoding"

我们的ruby on rails站点有一个URI,我们的合作伙伴之一将XML数据发送到.

由于我们不想处理XML,因此我们只是将原始数据填充到数据库列中,并且不再进行处理.

但是,我们收到的其中一个帖子在airbrake中给了我们这个错误:

ArgumentError: invalid %-encoding ("http://ns.hr-xml.org/2004-08-02" 
userId="" password=""><BackgroundReportPackage type="report">
<ProviderReferenceId>....
Run Code Online (Sandbox Code Playgroud)

使用回溯:

vendor/ruby-1.9.3/lib/ruby/1.9.1/uri/common.rb:898:in `decode_www_form_component'
vendor/bundle/ruby/1.9.1/gems/rack-1.4.5/lib/rack/utils.rb:41:in `unescape'
vendor/bundle/ruby/1.9.1/gems/rack-1.4.5/lib/rack/utils.rb:94:in `block (2 levels) in parse_nested_query'
vendor/bundle/ruby/1.9.1/gems/rack-1.4.5/lib/rack/utils.rb:94:in `map'
vendor/bundle/ruby/1.9.1/gems/rack-1.4.5/lib/rack/utils.rb:94:in `block in parse_nested_query'
vendor/bundle/ruby/1.9.1/gems/rack-1.4.5/lib/rack/utils.rb:93:in `each'
vendor/bundle/ruby/1.9.1/gems/rack-1.4.5/lib/rack/utils.rb:93:in `parse_nested_query'
vendor/bundle/ruby/1.9.1/gems/rack-1.4.5/lib/rack/request.rb:332:in `parse_query'
vendor/bundle/ruby/1.9.1/gems/rack-1.4.5/lib/rack/request.rb:209:in `POST'
vendor/bundle/ruby/1.9.1/gems/rack-1.4.5/lib/rack/methodoverride.rb:26:in `method_override'
vendor/bundle/ruby/1.9.1/gems/rack-1.4.5/lib/rack/methodoverride.rb:14:in `call'
vendor/bundle/ruby/1.9.1/gems/rack-1.4.5/lib/rack/runtime.rb:17:in `call'
vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.13/lib/active_support/cache/strategy/local_cache.rb:72:in `call'
vendor/bundle/ruby/1.9.1/gems/rack-1.4.5/lib/rack/lock.rb:15:in `call'
vendor/bundle/ruby/1.9.1/gems/actionpack-3.2.13/lib/action_dispatch/middleware/static.rb:63:in `call'
vendor/bundle/ruby/1.9.1/gems/rack-cache-1.2/lib/rack/cache/context.rb:136:in `forward'
vendor/bundle/ruby/1.9.1/gems/rack-cache-1.2/lib/rack/cache/context.rb:143:in `pass'
vendor/bundle/ruby/1.9.1/gems/rack-cache-1.2/lib/rack/cache/context.rb:155:in `invalidate'
vendor/bundle/ruby/1.9.1/gems/rack-cache-1.2/lib/rack/cache/context.rb:71:in `call!'
vendor/bundle/ruby/1.9.1/gems/rack-cache-1.2/lib/rack/cache/context.rb:51:in `call'
vendor/bundle/ruby/1.9.1/gems/railties-3.2.13/lib/rails/engine.rb:479:in `call'
vendor/bundle/ruby/1.9.1/gems/railties-3.2.13/lib/rails/application.rb:223:in `call'
vendor/bundle/ruby/1.9.1/gems/railties-3.2.13/lib/rails/railtie/configurable.rb:30:in `method_missing'
vendor/bundle/ruby/1.9.1/gems/rack-1.4.5/lib/rack/deflater.rb:13:in `call'
vendor/bundle/ruby/1.9.1/gems/rack-1.4.5/lib/rack/content_length.rb:14:in `call'
vendor/bundle/ruby/1.9.1/gems/railties-3.2.13/lib/rails/rack/log_tailer.rb:17:in `call'
vendor/bundle/ruby/1.9.1/gems/thin-1.4.1/lib/thin/connection.rb:80:in `block in pre_process'
vendor/bundle/ruby/1.9.1/gems/thin-1.4.1/lib/thin/connection.rb:78:in `catch'
vendor/bundle/ruby/1.9.1/gems/thin-1.4.1/lib/thin/connection.rb:78:in `pre_process' …
Run Code Online (Sandbox Code Playgroud)

rack ruby-on-rails-3 ruby-1.9.3

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

将自定义中间件添加到Rails 4

我有一个Rails 4示例项目(博客),我创建了一个名为'request_timer'的简单中间件 config/initializers/request_timer.rb

  #config/initializers/request_timer.rb
  class RequestTimer                                                                                                                                         

    def initialize(app)                                                                                                                                      
     @app = app                                                                                                                                              
    end                                                                                                                                                      

    def call(env)                                                                                                                                            
      start_time = Time.now                                                                                                                                  
      status, headers, response = @app.call(env)                                                                                                             
      stop_time = Time.now                                                                                                                                   
      [status, headers, response.body]                                                                                                                       
    end                                                                                                                                                      

  end 
Run Code Online (Sandbox Code Playgroud)

config/application.rb以两种方式添加了我的中间件

1)添加为常量

#config/application.rb
module Blog                                                                                                                                                  
  class Application < Rails::Application                                                                                                                     
    config.middleware.use RequestTimer                                                                                                                       
  end                                                                                                                                                        
end
Run Code Online (Sandbox Code Playgroud)

这样当我尝试运行我的rails应用程序时,我收到了错误

/Users/sameera/workspace/ruby-rack/blog/config/application.rb:9:in `require': cannot load such file -- request_timer (LoadError)
    from /Users/sameera/workspace/ruby-rack/blog/config/application.rb:9:in `<top (required)>'
    from /Users/sameera/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.2/lib/rails/commands.rb:74:in `require'
    from /Users/sameera/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.2/lib/rails/commands.rb:74:in `block in <top (required)>'
    from /Users/sameera/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.2/lib/rails/commands.rb:71:in `tap'
    from /Users/sameera/.rvm/gems/ruby-2.0.0-p247/gems/railties-4.0.2/lib/rails/commands.rb:71:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in …
Run Code Online (Sandbox Code Playgroud)

rack rack-middleware ruby-on-rails-4

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

来自Rack中间件的Alter Rails params哈希

我试图从自定义Rack中间件对象的Rails参数哈希添加一个值.我目前的方法是使用

class PortalResolver

 def initialize(app)
   @app = app
 end

  def call(env)
    begin
      url = "#{env['rack.url_scheme']}://#{env['HTTP_HOST']}"
      request = Rack::Request.new(env)
      portal_id = DomainService.domain(url) # DomainService is returning the expected value
      request.params['portal_id'] = portal_id
      status, headers, response = @app.call(env)
      [status, headers, response]
    rescue PortalNotFoundError => e
      [403, {'Content-Type' => 'text/html'}, ['']]
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我目前正在ActionDispatch :: ParamsParser之后添加中间件.这些参数不会出现在来自控制器的Rails params散列中,但会显示在request.params散列中(在上面定义的中间件对象中).任何想法?非常感谢.

ruby rack ruby-on-rails

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

Rails 4.2服务器; 私人和公共IP无法正常工作

我最近将rails 4.1.8更新为4.2

我无法使用私有IP 192.168.1.x:3000和我的访问使用rails应用程序public-ip address.

Rails应用程序正在与lvh.me:3000,0.0.0.0:3000,localhost:3000127.0.0.1:3000.但它看起来所有的地址都指向127.0.0.1:3000我的服务器日志rails-issue.

它在4.1中运行良好

我尝试添加以下内容environments/development.rb,但没有任何改变.

TRUSTED_PROXIES = %r{
  ^127\.0\.0\.1$                | # localhost
  ^(10                          | # private IP 10.x.x.x
    172\.(1[6-9]|2[0-9]|3[0-1]) | # private IP in the range 172.16.0.0 .. 172.31.255.255
    192\.168                      # private IP 192.168.x.x
   )\.
}x

config.action_dispatch.trusted_proxies = /^127\.0\.0\.1$/ # localhost
Run Code Online (Sandbox Code Playgroud)

我试图将我的本地服务器指向公共IP地址.我已经将端口转发配置为在公共地址中访问.

rack actiondispatch ruby-on-rails-4

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

无法激活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
查看次数

RuntimeError:在Rack中迭代期间无法将新键添加到哈希中

我构建了一个非常小的Rails 5.1.4(Ruby 2.3.1)应用程序.一旦我将其部署到生产环境中,我就会不时收到此特定错误:

RuntimeError: can't add a new key into hash during iteration

指向这里:

# rack/request.rb, line 67
def set_header(name, v)
  @env[name] = v
end
Run Code Online (Sandbox Code Playgroud)

我理解,当您尝试在迭代该哈希时向哈希添加新密钥时,会发生此错误.既然@env是哈希,那就有意义了.但:

  1. 在堆栈跟踪中,我发现没有任何与迭代相关的内容@env,它是一个简单的死链接app.call(env).
  2. 这个错误并不总是发生,但每小时或两次只发生一次,所以这对我来说也是非常奇怪的
  3. 我无法在本地重现它:我尝试加载具有多个请求命中的服务器,假设这可能是线程安全问题,但在本地它就像一个魅力......

完整的堆栈跟踪只包含机架中间件,可以在这里找到:https: //gist.github.com/Nattfodd/e513122400b4115a653ea38d69917a9a

Gemfile.lock:https://gist.github.com/Nattfodd/a9015e9204544302bf3959cec466b715

服务器运行时使用puma,配置非常简单:只是线程和工作量:

threads 0, 5
workers 5
Run Code Online (Sandbox Code Playgroud)

我目前的想法是:

  • 监控宝石之一有一个bug(sentry-raven,new_relic)
  • concurrent-ruby有一个bug(我读过一个,但它在1.0.2中得到修复,而我用于Puma的实际版本是1.0.5)
  • 一些超级愚蠢的东西,我错过了,但我不知道在哪里看,因为控制器的动作包含3行代码,应用程序配置主要是默认的......
  • 这是配置相关的东西,因为回溯根本不包含控制器......

rack ruby-on-rails sinatra puma

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