在这里开始机架开发。
我有基本的博客应用程序,可以在 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/
我得到机架应用程序...我想要 Rails 应用程序
现在我已经运行了这个机架中间件....它"接管"应用程序的其余部分。我无法到达Rails应用程序的"开头",或者就此而言,我希望从中接收数据的形式。
同样,整个应用程序都位于此处。
https://github.com/thefonso/form_challenge
感谢您的任何帮助。
编写中间件时,您有责任调用下一个中间件或应用程序。您的中间件现在所做的只是对每个请求进行空响应,您永远不会调用,因此 rails 甚至会看到该请求。您可以使用以下行修复它:
@app.call(env)
这是通过所有中间件继续调用链的关键线路。
所以在你的中间件中,做@app.call(env)
而不是return response
。
如果要操作来自 rails 的响应,请执行
@status, @headers, @response = @app.call(env)
并且一定要
return [@status, @headers, @response]
当你完成时。
您的中间件在其构造函数中传递了另一个中间件/应用程序。该应用程序响应#call
,因此,如果要将[可能更改的]请求和环境传递给下一个应用程序,则只需在该内部应用程序上调用#call
即可。
将中间件视为管道:
A ->B -> C
您的请求进入最外层的中间件 A,它可以立即返回响应,也可以调用中间件 B(它有引用),并根据 B 的返回值和 B 所做的任何修改来决定要做什么。B也是如此,取决于C。
有意义?