Tag: 机架 中间件

在完成重新加载之前,Rails 5重新加载器转移到下一个中​​间件

在rails 5开发模式中,在代码更改和刷新之后,它会触发重新加载器中间件来卸载/重新加载类。 但在重新加载重新加载之前,请求将移至下一个中间件。 重新加载器包含执行程序并查看executor.rb 。 似乎下一个中间件在run!后被调用run! 在complete!之前complete! 这与以下日志消息一致。 我想知道我是否可以确保下一个中间件仅在重新加载后调用。 我试图用Rails.application.executor.wrap , Rails.application.reloader.wrap和ActiveSupport::Dependencies.interlock.permit_concurrent_loads包装cusstomMiddle调用,但结果不是那些工作。 Rails版本:5.1 Ruby版本:2.4.1 我添加了以下日志消息,请参阅事件序列。 application.rb中 ActiveSupport::Reloader.before_class_unload do puts “Before class unload, Thread Id: #{Thread.current.object_id}” end ActiveSupport::Reloader.after_class_unload do puts “After class unload, Thread Id: #{Thread.current.object_id}” end ActiveSupport::Reloader.to_run do puts “Reloading, Thread Id: #{Thread.current.object_id}” end ActiveSupport::Reloader.to_complete do puts “DONE Reloading, Thread Id: #{Thread.current.object_id}” end custom_middleware.rb def […]

改变Rack Middleware中的response.body

我正在尝试为Rails 4.2应用程序编写一些Rack Middleware,它使用gsub方法改变响应体。 我发现使用这样的模式的旧示例: class MyMiddleware def initialize(app) @app = app end def call(env) status, headers, response = @app.call(env) # do some stuff [status, headers, response] end end 我发现的是没有response.body setter方法response.body 。 还有另一种模式我可以开始修改身体吗?

重新加载rails中间件,而无需在开发中重新启动服务器

我有一个rails 4应用程序,中间件位于lib / some / middleware.rb,它当前通过初始化器注入堆栈,如下所示: MyApp::Application.configure.do |config| config.middleware.use ‘Some::Middleware’ end 不幸的是,每当我改变一些东西,我需要重新启动服务器。 如何在开发模式下的每个请求上重新加载它? 我已经看到类似的问题,关于在to_prepare块中使用自动加载或包装代码重新加载lib代码,但我不确定如何在这种情况下应用它。 谢谢, – FJM 更新#1 如果我尝试删除中间件然后在to_prepare块中重新添加它,我会收到错误“无法修改冻结的数组”。

Sinatra机架中间件劫持’/’根url

我正在尝试在我的Rails应用程序中使用Sinatra应用程序作为中间件。 我在Rails应用程序的/lib文件夹中测试了一个基本的Sinatra应用程序, use d中间件并设置路由。 这工作得很好。 我想要做的是提取Sinatra应用程序并将其作为gem包含在内。 这样我就可以独立运行Sinatra应用程序,或者在多个Rails应用程序中使用它。 Sinatra App # myrackapp/lib/myrackapp.rb module Myrackapp class Application < Sinatra::Base set :root, File.dirname(__FILE__) get "/" do "Rack Home" end get '/rackroute' do "Hello, Rack Page" end end end Myrackapp也有一个gemspec – 没有什么有趣的,但我可以发布,如果有必要的话。 Rails App # Gemfile gem ‘myrackapp’, path: “/Users/gareth/Code/myrackapp” – # config/application.rb module Myrailsapp class Application < Rails::Application […]

设计current_tenant在设计登录失败后重置为’public’

我在SAAS应用程序上使用Devise进行身份validation和Apartment for multi-tenancy支持。 登录失败后,将“重定向”设计到登录页面(Users :: SessionsController Apartment::Tenant.current ,之前在TenantElevator中间件中设置的Apartment::Tenant.current的值将恢复为其默认值“public”。 这种情况正在发生,因为Devise并未实际重定向到登录页面,而是使用新的机架环境调用FailureApp(呈现登录页面)并返回其响应。 新的机架应用程序没有TenantElevator中间件,因此租户未设置在机架应用程序中。 有谁知道如何解决这个问题? 也许我可以将TenantElevator中间件添加到Failure应用程序中?

如何确定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?