【问题标题】:JSON parsing throws error for nil while payload has no null values当有效负载没有空值时,JSON 解析会抛出 nil 错误
【发布时间】:2023-03-17 08:04:01
【问题描述】:

我在构建我的第一个 rails 4 演示应用程序时看到了这个相当奇怪的问题,我的 POST 请求通过 Angular 工作,但是在控制器上解析它会引发错误

Started POST "/home/contact" for 127.0.0.1 at 2015-07-21 18:40:21 +0530
Processing by HomeController#contact as JSON
  Parameters: {"name"=>"Gabbar Singh", "email"=>"gabbar@rampur.in", "phone"=>"9820420420", "message"=>"kitne aadmi thein", "captcha"=>"03AHJ_VuvKsc5W9IrGKKnitvFp8niuxL2cnpIpJ2WgGXPkQFYVXBe4KKwfcLtVhrx3Juos-R36WcYGScXbJgA9ZLjoznN7ABvjnHlNQ5r5z25-jCs7BKJBf14ITvCqVqYRoU4Je2c7EJXa7K3IjPmNXeWvUosYbLsoGAtnlH17ScIM-MLrm9iDBAJqTO0xiOY4yYI7rYSgfcXcZg7DGLioni8XEelTqgjrlEoK21ORwstV8i90zRfqTmQExs8TjcYFZKzTD4oHqBbsXQCA4GMvrMRiWK5OmzXvauopthhijUDCDJqtg-cWGGuMCOb6dPNkqXW7oEMVCBo-U_e0Nw1dpXh0Goui8pgqvseadEG120d3kVZcke8WcmnIKdi2_VkUxhppOYnXjnAh"}
Completed 500 Internal Server Error in 2ms

TypeError (no implicit conversion of nil into String):
  app/controllers/home_controller.rb:9:in `contact'

ContactRequest 对象如下

class ContactRequest
    include ActiveModel::Model

    attr_accessor :name, :email, :phone, :message, :captcha

    validates :name, presence: true,length: {in:2..255}
    validates :email, presence: true, length: {in:6..255}
    validates :message, presence: true
    validates :phone, presence: true
    validates :captcha, presence: true
end

发布此数据的角度 sn-p 是

        var post_data = {  //prepare payload for request
            'name':$scope.contact.name,
            'email':$scope.contact.email,
            'phone':$scope.contact.phone,
            'message':$scope.contact.message,
            'captcha':$scope.response  //send g-captcha-reponse to our server
        }

        $http.post(
            'home/contact',post_data
        ).success(function(response){
            console.log(response);
            //flush form data
            $scope.contact = {};
            if(response.error === 0){
                $scope.messages = "Thanks!" + $scope.contact.name + "for your request! We will get back to you shortly"
            }else{
                $scope.messages = "We are sorry but your request was not processed, please try again."
            }
        })

我得到错误的控制器

class HomeController < ApplicationController

  wrap_parameters false

  def index
  end

  def contact
    @contactReq = HomeHelper::ContactRequest.new(JSON.parse(params[:json]))

    logger.debug "ContactRequest: #{@contactReq.attributes.inspect}"

  end
end

我在日志中没有任何 nil 或空白字段,也没有在 firebug 中的 POST 请求有效负载表单中

{
 "name":"Gabbar Singh",
 "email":"gabbar@rampur.in",
 "phone":"9820420420",
 "message":"kitne aadmi thein",
 "captcha":"03AHJ_VuvKsc5W9IrGKKnitvFp8niuxL2cnpIpJ2WgGXPkQFYVXBe4KKwfcLtVhrx3Juos-R36WcYGScXbJgA9ZL
joznN7ABvjnHlNQ5r5z25-jCs7BKJBf14ITvCqVqYRoU4Je2c7EJXa7K3IjPmNXeWvUosYbLsoGAtnlH17ScIM-MLrm9iDBAJqTO
0xiOY4yYI7rYSgfcXcZg7DGLioni8XEelTqgjrlEoK21ORwstV8i90zRfqTmQExs8TjcYFZKzTD4oHqBbsXQCA4GMvrMRiWK5Omz
XvauopthhijUDCDJqtg-cWGGuMCOb6dPNkqXW7oEMVCBo-U_e0Nw1dpXh0Goui8pgqvseadEG120d3kVZcke8WcmnIKdi2_VkUxhppOYnXjnAh"
}

【问题讨论】:

  • 显示第 9 行的内容?
  • 不允许我以任何方式显示行号,但错误出现在@contactReq = HomeHelper::ContactRequest.new(JSON.parse(params[:json])) 这一行中,根据@maxd 的建议,我将其更改为@contactReq = HomeHelper::ContactRequest.new(params),但是没有效果

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


【解决方案1】:

params 哈希中没有:json 参数:

@contactReq = HomeHelper::ContactRequest.new(JSON.parse(params[:json]))

查看上面的日志(参数附近:)

我想你想像这样将params 传递给构造函数:

@contactReq = HomeHelper::ContactRequest.new(params)

【讨论】:

  • 然后我得到Started POST "/home/contact" for 127.0.0.1 at 2015-07-21 19:14:45 +0530 Processing by HomeController#contact as JSON ... NoMethodError (undefined method controller=' for #&lt;HomeHelper::ContactRequest:0x007f905c06a4c0&gt;): app/controllers/home_controller.rb:11:in 'new' app/controllers/home_controller.rb:11:in 'contact'
  • 本质上,我想将 JSON 解析为 ContactRequest 类的实例
猜你喜欢
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 2017-07-15
  • 2019-12-27
  • 2016-12-27
  • 1970-01-01
相关资源
最近更新 更多