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
仅支持GET
和POST
请求。 如果在HTTPService对象上使用set useProxy
属性为true,则可以使用HEAD
, OPTIONS
, TRACE
和DELETE
但TRACE
是您还使用基于服务器的代理服务。 如果这不起作用,那么您可能需要尝试URLLoader
或URLRequest
或者实现自己的自定义解决方案。