在我的`routes.rb`文件中使用`match`时,如何指定自定义POST操作?

时间:2012-09-13 13:35:41

标签: ruby-on-rails api controller action

我正在尝试在控制器中定义自定义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

我可以通过ge t请求达到这两种方法,但我想基于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执行create_a的正确网址格式吗?

2 个答案:

答案 0 :(得分:2)

添加:via =&gt; :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

答案 1 :(得分:2)

通常,当您要将某种逻辑名称映射到RESTful路由和/或为RESTful路由创建别名时,请使用match。你使用match做的事情很好(从某种意义上来说它会起作用),但你只是错过了一件小事(以后我会这么做)。

首先,让我们看一下match创建路径别名的典型用法:

match "profile" => "users#show"

此路线允许您使用/profileshowuser的应用路径,而不是路径/users/:id

由于您的代码未将一个名称映射到另一个名称,因此您不需要match规则。您对match的使用会在您的代码中添加不必要的重复项,并且在您提供的情况下使用match比必要的更详细。以下是一个示例,说明如何编写API路由,不用 match,指定只能通过post访问它们:

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

这是 match的示例,添加了:via参数(这是您在代码示例中缺少的参数)来指定HTTP谓词:

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

请注意这里的代码重复。由于您没有将一个路径名称映射到另一个路径名称,因此与 match版本相比,您已经键入了同名路径

您还会注意到,与原始示例代码相比,我删除了:controlleraction参数,因为当您使用表单时,Rails会自动推断出这一点:

"[controller]/[action]" => "[controller]#[action]"