Tag: 机架

让Rails测试意识到Rails内部链外的Rack中间件

上下文 :应用程序使用必须在config.ru中设置的Rack中间件,而不是Rails的内部中间件链。 这是出于与此问题无关的原因。 问题 :如何让我的测试(function和集成)了解这个中间件? 我将以一个例子说明。 让我们创建一个原始的Rails 3应用程序,使用机架重写进行说明。 # /config/initializers/example.rb Rails.application.middleware.insert 0, ‘Rack::Rewrite’ do r301 ‘/so’, ‘http://stackoverflow.com’ end # /test/integration/the_test.rb require ‘test_helper’ class TheTest < ActionDispatch::IntegrationTest test "redirect from /so to http://stackoverflow.com" do get '/so' assert_redirected_to 'http://stackoverflow.com' end end 如果你运行上面的测试,一切都很好,并且使用浏览器你可以确认访问路径/so会将你重定向到StackOverflow。 很酷,让我们现在在Rails之外设置它。 删除上述文件/config/initializers/example.rb ,并将config.ru更改为以下内容: # /config.ru require ::File.expand_path(‘../config/environment’, __FILE__) map ‘/so’ do run Rack::Rewrite do r301 […]

如何确定Rails是从CLI,控制台还是作为服务器运行?

我有一个中间件,用于使用Bonjour在本地网络应用程序上宣布我的应用程序 ,但是当从rake或通过控制台调用Rails时,它也会宣布该服务。 我想排除这些情况,并且只在Rails作为服务器运行时使用Bonjour中间件。 中间件配置接受proc以使用proc在某些条件下排除中间件: config.middleware.insert_before ActionDispatch::Static, Rack::SSL, :exclude => proc { |env| env[‘HTTPS’] != ‘on’ } 但是,如何确定是从CLI,控制台还是作为服务器调用Rails?

如何在Heroku上阻止或过滤IP地址?

有没有办法实现IP过滤或IP访问规则,就像我使用nginx / apache来限制或阻止Heroku上的某些IP一样? 注意:我知道这可以在我的应用程序(Rails 3.2)中轻松完成,但我不认为这是Heroku上最有效的资源使用。 此外,基于Rack的解决方案比在Rails中实现过滤更好。

有没有办法从heroku提供gzip资产?

我想知道是否有办法让Rails网络服务器(瘦)服务于资产管道创建的* .gz文件。 据我所知,那些压缩级别比Rack::Deflater ,后者只适用于rackup文件中的config.middleware ,而不适用于config.middleware 。 一个不太理想的解决方案可能是更改Zlib的默认压缩级别,这是Rack::Deflater引用的。 它应该只需要gzip一次,然后它去Rack::Cache ,然后希望是CDN。 第二个不太理想的解决方案可能是Rack::Rewrite 。

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

是否可以仅在特定的Rails路由上触发Rack中间件? 例如,假设我想仅在api命名空间上运行速率限制器中间件。 namespace :api do resources :users end

Rails 3.1强制常规HTTP

以前,我一直在使用ssl_requirement来对我们在ssl上提供服务的页面进行细粒度控制,并通过普通的http提供服务。 根据ssl_requirement自己的wiki,它已被rails 3.1的Force SSL 取代 。 然而,情况似乎并非如此。 强制SSL似乎没有暴露出相反方向的选项,没有办法强制页面通过常规http发送。 什么是正确的Rails 3.1方式强制页面以纯http显示? Force SSL真的取代了ssl_requirement吗?

使用rSpec测试机架路由

我的routes.rb中有一个规则: constraints AssetRestrictor do match ‘*seopath’ => SeoDispatcher end 然后在lib / seo_dispatcher.rb中,我有这个: class SeoDispatcher AD_KEY = “action_dispatch.request.path_parameters” def self.call(env) seopath = env[AD_KEY][:seopath] if seopath params = seopath.split(‘/’) # get array of path components env[AD_KEY][:id] = params.last # the real page name is the last element env[AD_KEY][:category] = params.first if params.length > 1 end Rails.logger.debug “routing […]

对于机架应用程序,如何使乘客独立服务于.erb文件的输出而不是发送.erb文件本身?

我有一个简单的config.ru机架应用程序 ,我只需要并运行机架服务器页面,以快速方便的方式提供动态页面。 这个config.ru应用程序由phusion passenger-standalone (内部使用nginx)提供服务。 正确处理和提供.erb文件,除非我明确地将.erb扩展名添加到URL(对于.erb文件)。 在这种情况下,服务器将向我发送.erb文件以供下载,而不是其输出。 显然我想避免这种情况。 为了更清楚: 服务器上的文件名为somefile.erb 这工作: www.domain.com/somefile 这会发送.erb文件供下载 ☹: www.domain.com/somefile.erb 我怎样才能解决这个问题? 这是我应该在应用程序级别 (机架式服务器页面) 或Web服务器级别 (nginx配置)管理的问题吗? 在这两种情况下我都需要一些帮助…… 更新2:我认为这个机架式服务器页面文件可能是相关的 …但它只是一个疯狂的猜测,我不知道该改变什么.. 更新1:粘贴乘客独立的Nginx配置文件。 Passenger-standalone内部使用Nginx,但设置与/etc/nginx/nginx.conf的系统范围Nginx /etc/nginx/nginx.conf 。 根据/usr/share/passenger/templates/standalone/config.erb的文件,在每个乘客独立运行时重新生成乘客独立Nginx的默认设置。 以下是该文件: ############################################################## # Phusion Passenger Standalone uses a template file to # generate an Nginx configuration file. The original template # file can be found by running […]

如果不是模式,rack-rewrite会删除斜杠

我在我的应用程序中使用机架重写来删除尾部斜线(如果找到),但我只想要,如果不在某个路线上。 我使用过类似的东西: use Rack::Rewrite do r301 %r{^(?!testroute)(.+)/$}, ‘$1’ end 为了达到我的需要(例如所有路线,但/testroute/应该删除任何尾部斜杠)。 问题是,即使它遇到特定路线,它也不会忽略它,它会删除尾部斜杠。 我的正则表达式是错的,还是有什么我不考虑的?

Ruby on Rails中Rack和Rails Metal之间的确切区别是什么?

我是Rack and Rails金属的新手,谁能告诉我哪种情况必须使用哪个? 根据我的理解,Rack和Metal都可以过滤/绕过http请求和响应。 需要更好的澄清,何时使用什么? 提前致谢!!!