2

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

<%= 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,上面的一切都没有例外。但是任何人都知道这个请求是怎么变成 POST 的?

4

2 回答 2

3

Rails 使用 POST 类型模拟“高级”请求类型(PUT、DELETE 等)。这是因为浏览器通常只支持 GET 和 POST。

所以 rails 接受一个 POST 请求并寻找一个:method参数。如果找到这样的参数,它会相应地更新请求类型(例如,以便您的路由可以工作)。

于 2013-01-18T10:37:59.543 回答
0

事实是 request.method 总是返回 POST,无论是 PUT 还是 POST 请求,也无论控制器方法是默认的“更新”还是自定义方法。塞尔吉奥,你是对的。它来自 Rails 的请求类文档:

method : 返回环境的 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
于 2013-01-18T14:28:59.943 回答