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 は、「高度な」リクエスト タイプ (PUT、DELETE など) を POST タイプでエミュレートします。これは、ブラウザーが通常 GET と POST のみをサポートするためです。

したがって、rails は POST リクエストを受け取り、:methodパラメーターを探します。そのようなパラメーターが見つかった場合、それに応じてリクエスト タイプを更新します (たとえば、ルートが機能するように)。

于 2013-01-18T10:37:59.543 に答える
0

真実は、request.method は、PUT または POST 要求に関係なく、またコントローラー メソッドがデフォルトの「更新」またはカスタム メソッドであっても、常に 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 に答える