在视图文件中,我的代码类似于:
<%= link_to refresh_post_user_post_path(@user,@post), :method => :put%>
在routes.rb中:
resources :users do
resources :posts do
member do
put :refresh_post
end
end
end
有趣的是在控制器中检查请求对象时:
def refresh_post
... ...
p request.method # => POST
p request.request_method # => PUT
... ...
end
我知道方法和请求方法不同,但是来自哪里的POST请求?
此外:
$ rake routes
refresh_post_user_post_path PUT /users/:user_id/posts/:id/refresh_post, {:action => "refresh_post", :controller => "posts"}
我使用的是Rails 3.0.11和Ruby ree-1.8.7,上面的所有内容都没有异常。但任何机构都知道请求是如何发布的?
答案 0 :(得分:3)
Rails使用POST类型模拟“高级”请求类型(PUT,DELETE等)。这是因为浏览器通常只支持GET和POST。
因此rails接受POST请求并查找:method
参数。如果找到这样的参数,它会相应地更新请求类型(例如,您的路由可以正常工作)。
答案 1 :(得分:0)
事实是request.method总是返回POST,无论是PUT还是POST请求,无论控制器方法是默认的'update'还是自定义的'update'。塞尔吉奥,你是对的。 它来自Rails的doc for request class:
方式强>: 返回环境的REQUEST_METHOD的原始值,即使它被中间件覆盖
<强> REQUEST_METHOD 强>: 返回应用程序应该看到的HTTP方法。在中间件覆盖方法的情况下(例如,如果将HEAD请求转换为#GET,或者如果使用_method参数来确定应用程序应该使用的方法),则此方法返回被覆盖的值,不是原来的。
有趣的是,即使它是一个PUT请求,在日志文件中也是如此:
Started POST "/users/251/posts/1234" for 127.0.0.1 at Fri Jan 18 21:48:21 +0800 2012
这在Rails 3.0.11中发生,并且日志文件根本不告诉它是PUT请求。但是在以后的版本中,它已被修复:
https://github.com/rails/rails/commit/17a91a6ef93008170e50c073d1c3794f038a0a33
日志变得和以下一样友好:
Started PUT "/users/251/posts/1234" for 127.0.0.1 at Fri Jan 18 21:48:21 +0800 2012