【问题标题】:JSON Decode Parameter IssueJSON解码参数问题
【发布时间】:2014-05-30 14:43:25
【问题描述】:

我有一个使用 postgresql 的 rails 4 应用程序。我还有一个 backbone.js 应用程序,它将 JSON 推送到 rails 4 应用程序。

这是我的控制器:

def create
 @product = Product.new(ActiveSupport::JSON.decode product_params)

 respond_to do |format|
  if @product.save
    format.json { render action: 'show', status: :created, location: @product }
  else
    format.json { render json: @product.errors, status: :unprocessable_entity }
  end
 end
end
def product_params
  params.require(:product).permit(:title, :data)
end

我正在尝试解析 JSON 并插入产品,但在插入时出现错误:

TypeError (no implicit conversion of ActionController::Parameters into String):

感谢大家的帮助!

【问题讨论】:

    标签: ruby-on-rails ruby json postgresql


    【解决方案1】:

    使用to_json将哈希转换为JSON

    【讨论】:

      【解决方案2】:

      您的里程可能会有所不同,但我通过这样的创可贴代码解决了一个类似的问题:

      hash = product_params
      hash = JSON.parse(hash) if hash.is_a?(String)
      @product = Product.new(hash)
      

      我遇到的特殊问题是,如果我只是在包含我想要创建的对象的参数上执行JSON.parse,我会在单元测试时收到此错误,但是当我的 web 表单时代码工作得很好正在提交数据。最终,在记录各种愚蠢的事情浪费了 1 小时之后,我意识到我的单元测试以某种方式以“纯”形式传递了请求参数——也就是说,对象已经是 Hash,但是当我的网络表单 (或通过 cURL 手动进行无头测试)确实汇总了数据,参数与您期望的一样 - 哈希的字符串表示形式。

      使用上面的这个小代码 sn-p 当然是一个创可贴,但它提供了。

      希望对您有所帮助。

      【讨论】:

        【解决方案3】:

        错误告诉您 ActiveSupport::JSON.decode 期望提供一个字符串,但无法将您提供的参数强制转换为字符串。这里提供给它的参数是“product_params”,它返回一个 ActionController::Parameters(一个松散包装的 Hash)。

        如果您使用“开箱即用”样式的 Backbone,则无需解码该操作的 POST 内容。只需将操作更改为:

        @product = Product.new(product_params)
        

        您的 product_params 方法的结构表明该操作期望您发布的数据如下所示:

        {
          product: {
            title: "Foo",
            data: "bar"
          }
        }
        

        并且您的 Product 模型有两个将由 .new 填充的属性:标题和数据。

        如果您在客户端将某些内容显式编码为 JSON,您需要弄清楚它被提交为什么 POST 参数并在服务器上对其进行解码(同样 - 几乎可以肯定没有充分的理由跳过箍像那样)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-10
          • 1970-01-01
          • 1970-01-01
          • 2023-03-05
          • 1970-01-01
          相关资源
          最近更新 更多