Rails 3是“_method = PUT”仍然应该工作?

时间:2010-09-17 01:55:22

标签: ruby-on-rails flex

我正在使用FLEX 3向Rails 3发出XML请求。由于FLEX 3仅提供POST和GET,我必须使用“?_method = PUT”黑客来维护正确的RESTful:

http://127.0.0.1:3000/locator/locator_users/1.xml?_method=PUT

在服务器端,它显示为POST,我得到一个ActionController :: RoutingError(无路由匹配)。

我做了一个rake路线,路线在那里,正确命名空间和所有。 这与Rails 2一起运行良好,所以我有理由相信它必须是Rails 3改变了。在做了一些搜索之后,人们似乎已经表明应该仍然有效。但是,这不适合我。任何人都可以确认或否认Rails 3的兼容性吗?

更新

好吧,经过一些修补之后,我认为这实际上是Flash Player 10的一个问题.Flash PLayer 9似乎与“_method =”hack一起工作正常,10则没有。看到我写的这篇新帖子(Flash Player 9 vs Flash Player 10 with FLEX 3, ?_method=PUT/DELETE not working?)。

3 个答案:

答案 0 :(得分:4)

部分原因是Rack::MethodOverride的行为。它不会检查_method的查询参数,因此对此http://127.0.0.1:3000/locator/locator_users/1.xml?_method=PUT 的调用不会被正确覆盖。

我写了一个piece of Rack middleware替换它来解决这个问题。

你所要做的就是 将其添加到Gemfile

gem 'rack-methodoverride-with-params'

config/environment.rb

中交换Rack :: MethodOverride
config.middleware.swap Rack::MethodOverride, Rack::MethodOverrideWithParams

答案 1 :(得分:1)

如果您可以在请求正文中添加_method=PUT,则无需更换机架中间件。

如果你不能这样做,那么我会遇到另一个(影响力较小)的解决方案,即简单地定义一个自定义路线来完成你正在寻找的东西,例如:

# config/routes.rb
post '/locator/locator_users/:id', to: 'locator_users#update', constraints: {_method: 'POST'} # allow http method override

当然,您必须为您需要HTTP方法覆盖的每个资源添加此路由,但如果您希望限制您对潜在怪异的暴露,这可能是一件好事,因为这会破坏HTTP语义。

编辑:如果需要,您可以使用GET请求执行相同的操作,只需将post替换为get(如果您需要支持REST over JSONP,这可能很有用)。

答案 2 :(得分:0)

您可能需要重写向服务器发出请求的方式。我一起使用Rails 3,Flex 4和Flash 10(但使用在Flex 3中开发的应用程序)并使用_method作为我的HTTPService对象中的参数(将内容类型保留为默认application/x-www-form-url)。

HTTPService仅支持GETPOST次请求。如果在HTTPService对象上使用set useProxy属性为true,则可以使用HEADOPTIONSTRACEDELETE,但前提是使用基于服务器的代理服务。如果这不起作用,那么您可能需要尝试URLLoaderURLRequest或实施自己的自定义解决方案。