【问题标题】:How to parse POST request in JSON format in rails如何在rails中解析JSON格式的POST请求
【发布时间】:2016-02-16 15:55:28
【问题描述】:

我正在尝试通过 ruby​​ on rails 中的 curl 以 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 数据。同样一个玩家有很多游戏,一个游戏将属于一个玩家。

提前致谢!

【问题讨论】:

  • 为什么params里多了一个[]试试params[:para][:player]

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


【解决方案1】:

这个结构很糟糕。

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

这基本上意味着(部分)有一个包含玩家符号的数组

[:player]

并且您想获取该数组或字符串的 ':player_id(th)' 条目...这是您收到错误的地方(“如何将符号转换为数组的整数?” )

[:player][:player_id]

你可能想要...

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

没有“第一”,因为:player_id 条目中没有数组。

【讨论】:

  • 如果我使用 @player = Player.new(params[:para][:player][:player_id]) ,我会收到一条错误消息,上面写着 ArgumentError (When assigning attributes, you must pass a hash as an argument.): app/controllers/app/v2/players_controller.rb:21:in create' `你能告诉我这里做错了什么吗?
  • 删除 [:player_id] 因为这只是一个元素。如果你放弃它,你现在正在传递一个哈希。您可能会收到另一个错误,因为您传递了无用的其他参数,但我们会取得进展
  • 或者做一个综合的player_params方法(恢复require)然后直接引用player_params而不是params。
  • 谢谢,但是我如何编写我的 player_params 方法来允许参数。我写的清楚不代表我的json结构。 params.require(:player).permit(:url, :player_id, :email, :total_won, :pr_costs, :payment_method),也不包括游戏。任何指针都会有所帮助!
  • “游戏”是 ActiveRecord 表吗? gamesplayers 之间存在多对一?
【解决方案2】:

因为它总是发生,我自己想通了。下面是我用于 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 感谢您为我指明正确的方向

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-13
    • 2015-12-23
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 2018-01-05
    相关资源
    最近更新 更多