我试图通过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数据相似。另外一个玩家有很多游戏,一个游戏属于玩家。
提前致谢!
答案 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感谢我指出了正确的方向