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

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

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

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

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

UPDATE

好吧,经过一些修修补补后,我认为这实际上是Flash Player 10的一个问题.Flash PLayer 9似乎与“_method =”黑客合作正常,10则没有。 看到我写的这篇新post( Flash Player 9与FLEX 3的Flash Player 10,?_ method = PUT / DELETE不起作用? )。

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

我写了一段Rack中间件来取代它来修复这个特殊问题。

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

 gem 'rack-methodoverride-with-params' 

config/environment.rb交换Rack :: MethodOverride out

 config.middleware.swap Rack::MethodOverride, Rack::MethodOverrideWithParams 

如果您可以在请求正文中添加_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 for get (如果您需要支持REST over JSONP,这可能很有用)。

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

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