我将我的rails 2.3.8应用程序上传到DreamHost,并收到有关机架版本不兼容的错误.我发了一张支持票,服务人员建议我删除config.ru.
这解决了这个问题.但我想知道这会产生什么影响.
一个rails应用程序没有config.ru可以吗?
我正在编写一个调用一些外部服务的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)
我可以想到两种注入方法.我可以调用实例方法或通过构造函数传递依赖项.无论如何,因为机架似乎没有让我访问当前的应用程序实例,我发现这是不可能的. …
是否可以仅在特定的Rails路由上触发Rack中间件?
例如,假设我想仅在api命名空间上运行速率限制器中间件.
namespace :api do
resources :users
end
Run Code Online (Sandbox Code Playgroud) 机架指定
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 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) 我有一个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中间件对象的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散列中(在上面定义的中间件对象中).任何想法?非常感谢.
我最近将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:3000和127.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地址.我已经将端口转发配置为在公共地址中访问.
我刚刚将我的操作系统从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) 我构建了一个非常小的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是哈希,那就有意义了.但:
@env,它是一个简单的死链接app.call(env).完整的堆栈跟踪只包含机架中间件,可以在这里找到: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)
我目前的想法是: