在这里开始Rack dev。
我在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
感谢您的帮助。
答案 0 :(得分:1)
您的中间件在其构造函数中传递了另一个中间件/应用程序。该应用程序响应#call
,因此如果您想将[可能更改的]请求和环境传递给下一个应用程序,您只需在该内部应用程序上调用#call
即可。
将中间件视为管道:
A - > B - > ç
您的请求进入最外层的中间件A,它可以立即返回响应,也可以调用中间件B(它有引用)并根据B的返回值和任何修改来决定做什么B做了。 B取决于C,也是如此。
有意义吗?
答案 1 :(得分:1)
编写中间件时,您有责任调用下一个中间件或应用程序。您的中间件现在所做的只是响应每个请求的空响应,您从不打电话,以便rails甚至可以看到请求。 您可以使用以下行修复它:
@app.call(env)
这是通过所有中间件继续调用链的关键路线。
因此,在your middleware中,请@app.call(env)
代替return response
。
如果您想操纵来自rails的响应,请执行
@status, @headers, @response = @app.call(env)
一定要
return [@status, @headers, @response]
完成后。