繁体   English   中英

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

[英]How do I specify a custom POST action when using `match` in my `routes.rb` file?

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

这是在我的控制器操作create_a post的正确URL模式吗?

添加: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。

通常,当您要将某种逻辑名映射到RESTful路由和/或为RESTful路由创建别名时,可以使用match 您在进行match所做的一切都很好(从某种意义上说,它将起作用),但是您只是缺少了一件小东西(以后我会告诉您)。

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

match "profile" => "users#show"

此路由使您可以使用/profile的应用程序路径来show user而不是/users/:id路径。

由于您的代码没有将一个名称映射到另一个名称,因此您不需要match规则。 使用match会不必要地在代码match添加重复项,并且在显示的情况下使用match比需要的更为冗长。 这是一个示例,说明如何编写不带 match的API路由,指定它们只能通过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]"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM