2

postコントローラでカスタムアクションを定義しようとしていますが、いくつか質問があります。

これは私のコントローラーです:

module Api
  module V1
    class ExamplesController < ApplicationController
      def create_a
        ...
      end

      def create_b
        ...
      end
    end
  end
end

アクション/メソッドの両方をアクションにしたいpost。これは私のルートファイルにあるものです:

namespace :api do
  namespace :v1 do
    match 'examples/create_a', :controller => 'examples', :action => 'create_a'
    match 'examples/create_b', :controller => 'examples', :action => 'create_b'
  end
end

これらの2つのメソッドには、getリクエストを介して到達できますが、httpに基づいてトリガーしたいと思いますpost。また、それを介してチェックしrake routesても、それがGET、PUT、POSTなどのメソッドであるかどうかはわかりません。空白です。それがメソッドであるはずであることをルートに伝えるにはどうすればよいpostですか?

そしてpost、ブラウザでのリクエストは私のメソッドにどのように見えますか?

url: http://localhost:3000/api/v1/examples/create_a.json/create_a
header: Content-Type: application/x-www-form-urlencoded
data: paramA=45&paramB&paramC

postこれは、コントローラーのアクションを実行するための適切なURLパターンcreate_aですか?

4

2 に答える 2

2

:via =>:postを追加するとうまくいくはずです。

namespace :api do
  namespace :v1 do
    match 'examples/create_a', :controller => 'examples', :action => 'create_a', :via => :post
    match 'examples/create_b', :controller => 'examples', :action => 'create_b', :via => :post
  end
end

詳細については、 http: //guides.rubyonrails.org/routing.htmlを参照してください。

于 2012-09-13T13:42:54.853 に答える
2

一般にmatch、ある種の論理名をRESTfulルートにマップする場合、および/またはRESTfulルートのエイリアスを作成する場合に使用します。あなたがしていることmatchは(それが機能するという意味で)問題ありませんが、あなたは小さなことを見逃しているだけです(これについては後で説明します)。

matchまず、ルートのエイリアスを作成するための一般的な使用法を見てみましょう。

match "profile" => "users#show"

このルートでは、パスの代わりに/profileへのアプリケーションパスを使用できます。showuser/users/:id

コードはある名前を別の名前にマッピングしていないため、matchルールは必要ありません。を使用matchすると、コードに不要な重複が追加されますmatch。提示した場合に使用すると、必要以上に冗長になります。を使用せず にAPIルートを記述し、次の方法でのみmatchアクセスできるように指定する方法の例を次に示します。post

namespace :api do
  namespace :v1 do
    post "examples/create_a"
    post "examples/create_b"
  end
end

そして、これは、HTTP動詞を指定するためのパラメーター(コード例に欠けているもの)を追加した例です。 match:via

namespace :api do
  namespace :v1 do
    match 'examples/create_a' => "examples#create_a", :via => :post
    match 'examples/create_b' => "examples#create_b", :via => :post
  end  #           ^ ---- DUPLICATION ---- ^
end

ここでコードの重複に注意してください。あるパス名を別のパス名にマッピングしていないためバージョン以外のパスと比較した場合、同じ名前のパスを2回入力しました。match

:controllerまた、元のサンプルコードと比較すると、とパラメータを削除したことにも注意してactionください。これは、フォームを使用するとRailsが自動的に推測するためです。

"[controller]/[action]" => "[controller]#[action]"
于 2012-09-13T13:48:06.590 に答える