如何在rails上使用POST(无表单)获取发送的参数

时间:2017-04-20 16:46:16

标签: ruby-on-rails ruby-on-rails-4 curl post

我只是想做一个测试并尝试了解轨道上的路线。这就是我在控制器上的内容:

class ItemsController < ApplicationController    
    def index
      @data = params[:number]
    end
end

index.html.erb

The number: <%= params[:number] %>

好吧,如果我发了curl http://localhost:3000/?number=100,我可以在视图中看到:

数字:100

所以,这里一切都是正确的。但是,我想做同样的事情,但是用 POST 动词。因此,当我curl -d "number=100" http://localhost:3000时,我收到以下错误:

没有路线匹配[POST]&#34; /&#34;

我做了:

def create
  render plain: params[:number].inspect
end

查看参数,但正如我之前所说,仅适用于 GET 动词。

所以我的问题:如何通过curl看到POST发送给控制器的数据,并在我的视图 index.html.erb 上查看结果?

注意:在 routes.rb 上我有:

Rails.application.routes.draw do
  #get 'items/index'
  resources :items
  root 'items#index'
end

备注:根据收到的答案,我还有两个问题:

  • 为什么动词 GET 适用于http://localhost:3000/?number=100,与http://localhost:3000/items/?number=100相同?为什么 POST 不会发生同样的情况?

  • 如果用户直接指向{{1>,如何删除消息 无路由匹配[POST]&#34; /&#34; 使用 POST动词

1 个答案:

答案 0 :(得分:1)

您要发布到root_url。而是将您的请求发布到items_url:

curl -d "number=100" http://localhost:3000/items

更新:

  

为什么动词GET适用于http://localhost:3000/?number=100和。{   与http://localhost:3000/items/?number=100相同?为什么一样   POST不会发生?

/?number=100的GET请求有效,因为您在路由文件中指定了root 'items#index'。这专门创建了GET路由,该路由映射到index控制器的items操作。

  

如果用户,如何删除消息无路由匹配[POST]“/”   使用POST动词直接指向http://localhost:3000

您可以使用post关键字创建单个POST路由:

# routes.rb
root 'items#index'
post '/', to: 'items#create'

会产生路线:

        root GET  /                                         items#index
             POST /                                         items#create

(从您的项目目录运行命令rails routes

或者您可以使用resource方法创建所有CRUD路径:

resources :items, path: '/'

...将创建以下路线:

       items GET    /                                         items#index
             POST   /                                         items#create
    new_item GET    /new(.:format)                            items#new
   edit_item GET    /:id/edit(.:format)                       items#edit
        item GET    /:id(.:format)                            items#show
             PATCH  /:id(.:format)                            items#update
             PUT    /:id(.:format)                            items#update
             DELETE /:id(.:format)                            items#destroy

请注意,如果您尝试向应用添加其他资源,则可能会导致路由冲突。如果需要添加其他资源,请在routes.rb文件中的这些路由之前添加它们。 Rails从上到下评估路由文件,因此只有在没有其他路径匹配时才会加载这些资源。

有关详细信息,请参阅http://edgeguides.rubyonrails.org/routing.html