为什么添加这样的 Rails 中间件会导致无休止的重定向?
Why is adding a Rails middleware like this causing endless redirects?
我正在尝试将一些中间件添加到我正在处理的 Rails 项目中,当我尝试这样做时,它似乎会导致无限循环。
具体来说,我有以下中间件 shell 文件:
# app/middleware/log_data.rb
class LogData
def initialize(app)
@app = app
end
def call(env)
# To-do: Write code here.
end
end
然后我在app
目录下新建了一个middleware
目录,并将文件放在那个目录下。
之后,我在 config/application.rb
的底部添加了以下内容:
config.middleware.use("LogData")
在使用 sudo service puma restart
在 Vagrant 上重新启动 Puma 服务器 运行ning 后,如果我 运行 rake middleware
,我可以看到中间件正确显示在列表中底部。
但是,当我尝试刷新网站时,它因无限循环而失败,在 Chrome 中显示以下内容:
如果我在 config/application.rb
中注释掉 config.middleware.use("LogData")
行,那么中间件将从 rake middleware
命令列表中消失,网站将停止崩溃并正常加载。
我做错了什么?我错过了什么?我想这很简单,但我不确定为什么一个简单(且为空)的 shell 中间件文件会导致整个站点崩溃。谢谢。
我应该注意,我使用的是 Rails 4.2.11,我知道它很旧,但现在升级不是一个选择。
你的中间件什么都不做,returns nil(转化为不完整的服务器响应),基本上请求到此结束。它需要 return 一些东西([status, headers, response]
的数组,或调用 env)以允许请求通过中间件链。
# app/middleware/log_data.rb
class LogData
def initialize(app)
@app = app
end
def call(env)
# To-do: Write code here.
# this should be at the very end of the method
@app.call(env)
end
end
Here 是关于中间件的更多信息。
我正在尝试将一些中间件添加到我正在处理的 Rails 项目中,当我尝试这样做时,它似乎会导致无限循环。
具体来说,我有以下中间件 shell 文件:
# app/middleware/log_data.rb
class LogData
def initialize(app)
@app = app
end
def call(env)
# To-do: Write code here.
end
end
然后我在app
目录下新建了一个middleware
目录,并将文件放在那个目录下。
之后,我在 config/application.rb
的底部添加了以下内容:
config.middleware.use("LogData")
在使用 sudo service puma restart
在 Vagrant 上重新启动 Puma 服务器 运行ning 后,如果我 运行 rake middleware
,我可以看到中间件正确显示在列表中底部。
但是,当我尝试刷新网站时,它因无限循环而失败,在 Chrome 中显示以下内容:
如果我在 config/application.rb
中注释掉 config.middleware.use("LogData")
行,那么中间件将从 rake middleware
命令列表中消失,网站将停止崩溃并正常加载。
我做错了什么?我错过了什么?我想这很简单,但我不确定为什么一个简单(且为空)的 shell 中间件文件会导致整个站点崩溃。谢谢。
我应该注意,我使用的是 Rails 4.2.11,我知道它很旧,但现在升级不是一个选择。
你的中间件什么都不做,returns nil(转化为不完整的服务器响应),基本上请求到此结束。它需要 return 一些东西([status, headers, response]
的数组,或调用 env)以允许请求通过中间件链。
# app/middleware/log_data.rb
class LogData
def initialize(app)
@app = app
end
def call(env)
# To-do: Write code here.
# this should be at the very end of the method
@app.call(env)
end
end
Here 是关于中间件的更多信息。