如何构建Rack中间件作为表单验证器

时间:2013-01-23 23:27:13

标签: ruby-on-rails ruby-on-rails-3 rack

在这里开始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

感谢您的帮助。

2 个答案:

答案 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]

完成后。