1

在这里开始机架开发。

我在http://guides.rubyonrails.org/getting_started.html上构建了基本的博客应用程序

我可以创建一个帖子,进行更改....很好。

现在...

我正在学习如何使用 Rack,我正在尝试创建一些中间件......

我已经关注了 railscast #150 和 #151 ......你可以在 github 上看到我的代码......

https://github.com/thefonso/form_challenge

当我在 chrome 的 url 行执行此操作时.....http://localhost:3000/?name=foo

我在命令行上得到了想要的结果。

aleph@mage:~/Projects/form_challenge git:master$ rails s
=> Booting WEBrick
=> Rails 3.2.11 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2013-01-23 17:01:30] INFO  WEBrick 1.3.1
[2013-01-23 17:01:30] INFO  ruby 1.9.2 (2012-04-20) [x86_64-darwin12.2.0]
[2013-01-23 17:01:30] INFO  WEBrick::HTTPServer#start: pid=32068 port=3000
{"name"=>"foo"}

太棒了,我可以看到我发送的数据......所以我希望当我从我的博客“创建帖子”页面发送数据时......我应该能够捕获该数据。

但是如何让应用程序的其余部分正常工作?

当我去......http://localhost:3000/

我得到 Rack 应用程序...我想要 Rails 应用程序

现在我运行了这个 Rack 中间件……它“接管”了应用程序的其余部分。我无法到达 Rails 应用程序的“开始”,也无法到达我希望从中接收数据的表单。

整个应用程序再次位于此处....

https://github.com/thefonso/form_challenge

谢谢你的帮助。

4

2 回答 2

1

在编写中间件时,您有责任调用下一个中间件或应用程序。您的中间件现在所做的只是简单地对每个请求做出空响应,您永远不会调用,因此 rails 甚至会看到该请求。您可以使用以下行修复它:

@app.call(env)

这是贯穿所有中间件的调用链的关键线。

所以在你的中间件中,做@app.call(env)而不是return response.

如果要操纵来自 rails 的响应,请执行

@status, @headers, @response = @app.call(env)

并且一定要

return [@status, @headers, @response]

当你完成时。

于 2013-01-24T00:04:26.370 回答
1

您的中间件在其构造函数中传递了另一个中间件/应用程序。该应用程序响应#call,因此如果您想将 [可能更改的] 请求和环境传递给下一个应用程序,您需要做的就是调用#call该内部应用程序。

将中间件想象成管道:

A -> B -> C

您的请求进入最外层的中间件 A,它可以立即返回响应,或者调用中间件 B(它有一个引用)并根据 B 的返回值和 B 所做的任何修改决定要做什么。B 也一样,取决于 C。

说得通?

于 2013-01-23T23:55:09.787 回答