如何在rails中以JSON格式解析POST请求

时间:2016-02-16 15:55:28

标签: ruby-on-rails json ruby-on-rails-4

我试图通过curl在rails上的ruby中发送一个JSON的POST请求。我想知道如何在控制器中解析此请求并将其保存在数据库中。我为玩家创建了控制器和模型。

以下是curl命令 -

curl -i -X POST -H "Content-Type: application/json" "localhost:3000/app/v2/player" -d '{
"url": "app/v2/players.json",
"para": {
    "player": {
        "player_id": 51275,
        "email": "test@gmail.com",
        "total_won": "1890000.00",
        "pr_costs": "29.00",
        "payment_method": "VISA",
        "games": [
            {
                "name": "AvsB",
                "matches": 1,
                "value": 1100,
                "category": "Cricket",
                "subcategory": "Test",
                "tags": [
                    "Aus",
                    "Melbourne"
                ],
                "game_id": 12                   
            },
            {
                "name": "CvsD",
                "matches": 1,
                "value": 790,
                "category": "Cricket",
                "subcategory": "T20",
                "tags": [
                    "T20",
                    "20over",
                    "worldcup"
                ],
                "game_id": 7
            }
        ]
    }
}
}'  

以下是我的播放器控制器 -

module App
module V2
    class PlayersController < ApplicationController

  def create

    @player = Player.new(params[[:para][:player][:player_id]].first)
    if @player.save
        render json: @player, status: 201, location: @player

    else
        render json: @player.errors, status: 422
    end
  end


private  

def player_params
  #params.require(:player).permit(:url, :player_id, :email, :total_won, :pr_costs, :payment_method)
  params.fetch(:url,:para, {}).permit(:player_id, :email, :total_won, :pr_costs, :payment_method)

end
    end
end
end

以下是我的播放器型号 -

class Player < ActiveRecord::Base
has_many :games, dependent: :destroy
validates :player_id, presence: true
attr_accessor :url,:para


end

目前我在启动curl命令时遇到错误 -

 TypeError (no implicit conversion of Symbol into Integer):
 app/controllers/app/v2/players_controller.rb:21:in `[]'
 app/controllers/app/v2/players_controller.rb:21:in `create'

任何有关如何在创建函数和相关游戏中读取JSON数据和为玩家创建记录的指示都将受到赞赏。我没有为游戏创建模型,但它在结构上与JSON数据相似。另外一个玩家有很多游戏,一个游戏属于玩家。

提前致谢!

2 个答案:

答案 0 :(得分:0)

结构糟糕。

[[:para][:player][:player_id]]

它基本上意味着(部分)包含播放器符号

的数组
[:player]

你希望获得&#39;:player_id(th)&#39;输入该数组或字符串...这是您获取错误的位置(&#34;如何将符号转换为数组的整数?&#34;)

[:player][:player_id]
你可能想要......

params[:para][:player][:player_id]

没有&#39;第一个&#39;因为:player_id条目中没有数组。

答案 1 :(得分:0)

一如既往,我自己想出来了。以下是我用于player_params功能的内容。可能还有其他方式,但这对我来说当然有用。

params.require(:player).permit(:url,:para =>[:player =>[:player_id, :email, :total_won, :pr_costs, :payment_method,:games =>[:name, :matches, :value, :category, :subcategory, :game_id ]]])

@SteveTurczyn感谢我指出了正确的方向