Ruby 使用和磨合机架之间的差异

Ruby 使用和磨合机架之间的差异,ruby,rack,Ruby,Rack,货架文件中的use和run方法有什么区别?似乎run始终位于config.ru的末尾,但似乎您应该能够使用use。非常感谢您提供启发性的资源。使用是用于中间件的 class MyCustomMiddleware def initialize(app) @app = app end def call(env) if condition env['set-header'] = 'Middleware Can modify the response &

货架文件中的
use
run
方法有什么区别?似乎
run
始终位于
config.ru
的末尾,但似乎您应该能够使用
use
。非常感谢您提供启发性的资源。

使用
是用于中间件的

class MyCustomMiddleware
  def initialize(app)
    @app = app
  end

  def call(env)
    if condition
     env['set-header'] = 'Middleware Can modify the response & pass it into next middleware'
    end
    @app.call(env)
end
run
接受一个参数,该参数响应调用并返回最终的机架响应,HTTP响应代码为200

class MyApp
  def self.call(env)
   [200, { "Content-Type" => "text/html" }, ["OK"]]
 end
end
要了解
之间的区别,请使用
运行
。让我们看看典型的rack应用程序的结构

典型机架应用程序 机架应用程序包括多个中间件,它们响应
调用
,但不返回最终机架响应&一个响应
调用
的对象,该调用返回最终机架响应,其中包括HTTP响应代码(200404、500等)。因此,通常会有多个对象充当中间件&然后一个对象返回带有响应代码的最终机架响应

使用
和运行
之间的区别

现在有了这个,, 似乎我们可以多次调用
use
,每个中间件调用一次&
在单个机架应用程序中只运行一次。因此
use
将只调用中间件,而
run
将运行机架对象,该对象将返回带有HTTP状态代码的最终机架响应

示例
config.ru

use MyCustomMiddleware
use MyCustomMiddleware2
use MyCustomMiddleware3
run MyApp

如果上面有任何错误,请告诉我。所以我可以纠正它

是否可能由于(比如)身份验证错误而停止中间件管道的某个位置?^^^^^是的。事实上,沃登也使用了类似的身份验证方法——一种所有流行的宝石(如Desive)都使用的基于机架的身份验证。你可以看到它的形状。其核心是#call方法只是检查一个条件&做一些事情。和我上面的例子一样。