通过link_to的Rails的PUT请求变为POST

时间:2013-01-18 10:34:12

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

在视图文件中,我的代码类似于:

<%= 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,上面的所有内容都没有异常。但任何机构都知道请求是如何发布的?

2 个答案:

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