Tag: 中间件

在Rails中更新中间件

有没有办法在rails中修改( 不替换)中间件? 所以代替: config.middleware.delete ::Rack::Cache config.middleware.use ::Rack::Cache, :metastore => “rails:/”, :entitystore => “rails:/”, :verbose => false 我想简单地写一些像config.middleware.find!(::Rack::Cache).verbose = false 。 更新:这样做的原因是因为capybara-webkit在从黄瓜运行时打印了大量的消息 。

Rack中间件中的“env”变量是什么?

我知道Rack中间件filter是一个带有初始化和调用方法的Ruby类。 我知道call方法采用“env”参数。 像这样的东西: class MyFilter def initialize(app) end def call(env) end end 我的问题是:发送给“呼叫”的“env”参数究竟是什么? 这与Rails ENV环境(即开发,测试,生产)相同。 谢谢!

从中间件中触发基本的HTTP身份validation

我已经为rails创建了一个自定义中间件,它将拦截所有请求并确保它来自授权的IP,否则它应该提示基本的http auth用户/名称密码。 这是目前的样子: require ‘net/http’ class AuthorizeEnvironment def initialize(app) @app = app end def call(env) if AppConstants.approved_doximity_ips.include?(env[“REMOTE_ADDR”]) @app.call(env) elsif authorized?(env) @app.call(env) else [403, {“Content-Type” => “text/html”}, [“Not Authorized on this environment.”]] end end def authorized?(env) @auth ||= Rack::Auth::Basic::Request.new(env) @auth.provided? && @auth.basic? && @auth.credentials && @auth.credentials == [‘username’, ‘password’] end end 这段代码的问题是我似乎找不到在浏览器上触发http auth窗口的方法 。 我对此进行了审核,并没有看到任何明显的迹象表明这是如何完成的。 你能指点我正确的方向吗?

如何使用中间件中的域对象关闭cache_classes?

在rails开发环境中, cache_classes已关闭,因此您可以修改app/下的代码,并在不重新启动服务器的情况下查看更改。 但是,在所有环境中,中间件只创建一次。 所以,如果我有这样的中间件: class MyMiddleware def initialize(app) @app = app end def call(env) env[‘model’] = MyModel.first end end 我在config/environments/development.rb执行此操作: config.cache_classes = false # the default for development config.middleware.use MyMiddleware 然后我总会得到以下错误: A copy of MyMiddleware has been removed from the module tree but is still active! /Library/Ruby/Gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:414:in `load_missing_constant’ /Library/Ruby/Gems/1.8/gems/activesupport-2.3.2/lib/active_support/dependencies.rb:96:in `const_missing’ /Users/me/projects/my_project/lib/my_middleware.rb:8:in `call’ /Library/Ruby/Gems/1.8/gems/actionpack-2.3.2/lib/action_controller/middleware_stack.rb:72:in `new’ … […]

机架rack.input变量被截断?

我写了一段Rack Middleware来自动解压缩压缩的请求体。 代码似乎工作得很好,但是当我将它插入我的rails应用程序时,我从ActionController :: ParamsParser获得了“Invalid JSON”失败。 作为一种调试机制,我正在将压缩内容和解压缩的内容写入文件(以确保代码正常工作),并且我确实收到了原始的JSON文档(在客户端将其拉出之前)。 我发布的数据是 JSON数据,解压缩的内容被检测为来自http://jsonlint.com的有效JSON。 我有什么想法我做错了吗? class CompressedRequests def initialize(app) @app = app end def call(env) input = env[‘rack.input’].read #output the zipped data we received File.open(‘/Users/ben/Desktop/data.gz’, ‘w+’) do |f| f.write input end if env[‘REQUEST_METHOD’] =~ /(POST|PUT)/ if env.keys.include? ‘HTTP_CONTENT_ENCODING’ new_input = decode(input, env[‘HTTP_CONTENT_ENCODING’]) env[‘rack.input’] = StringIO.new(new_input) #output our decoded data (for […]

如何在中间件中设置一个可在我的所有应用程序中访问的变量?

我正在使用Ruby on Rails 3,我正在尝试使用中间件来设置变量@variable_name以后可以在控制器中访问。 例如,我的中间件是 class Auth def initialize(app) @app = app end def call(env) @account ||= Account.find(1) @app.call(env) end end 上面的代码正确设置了@account变量,但在我的应用程序中没有(在控制器,模型,视图……中)。 那么, 我该怎么做呢? 我看到这个答案是一种方法来做我需要的,但我希望@account变量“可以直接访问”。 也就是说,不使用这种方式,但在可见的情况下,例如在我的视图中,如下所示:

如何使用(ruby)机架中间件组件设置cookie?

我正在为一个需要有条件地设置cookie的rails应用程序编写机架中间件组件。 我目前正试图设法设置cookie。 从谷歌搜索它似乎应该工作: class RackApp def initialize(app) @app = app end def call(env) @status, @headers, @response = @app.call(env) @response.set_cookie(“foo”, {:value => “bar”, :path => “/”, :expires => Time.now+24*60*60}) [@status, @headers, @response] end end 它不会给出错误,但也不会设置cookie。 我究竟做错了什么?

Ruby on rails – 机架中间件排除 – 是否可能?

我正在尝试机架中间件,在单独的层中进行身份validation。 问题是,所有请求都通过这一层。 我不希望像css,javascript这样的资产请求通过身份validation中间件。我也不希望注销流程通过这个。 在application.rb中 config.middleware.use AuthClient::MyFilterClass 我期待着类似的东西 config.middleware.use AuthClient::MyFilterClass, :exclude => [:logout,’*/assets/*’] 有没有办法从中间件中排除自定义路径/操作?

如何仅针对特定路径使用Rack中间件?

我想在我的Rack应用程序中运行MyMiddleware ,但仅限于某些路径。 我希望使用Rack::Builder或至少使用Rack::URLMap ,但我无法弄清楚如何使用。 这是我认为可行的,但不是: # in my rackup file or Rails environment.rb: map ‘/foo’ do use MyMiddleware, { :some => ‘options’ } end 或者,更好的是,使用Regexp: map /^foo/ do use MyMiddleware, { :some => ‘options’ } end 但是map似乎最终需要一个应用程序; 它不会仅仅将控制权传回给它的父母。 (实际错误是“ undefined method ‘each’ for nil:NilClass ”从Rack试图将那个结束时do…end块变成app 。) 是否有一个中间件需要一系列中间件和一个路径,并且只在路径匹配时运行它们?