JSON解码参数问题

时间:2014-04-16 01:24:45

标签: ruby-on-rails ruby json postgresql

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

这是我的控制人员:

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):

感谢您的帮助!

3 个答案:

答案 0 :(得分:8)

你的里程可能会有所不同,但我通过像这样的绑定代码解决了一个微笑的问题:

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

我遇到的特殊问题是,如果我只是在包含我想要创建的对象的参数上进行JSON.parse,那么在单元测试时我得到了这个错误,但代码工作得很好网络表单正在提交数据。最终,在记录了各种愚蠢的事情后丢失1小时后,我意识到我的单元测试以某种方式将请求参数传递给了一个纯粹的"形式 - 即,对象已经是Hash,但是当我的webforms(或通过cURL进行手动无头测试)确实对数据进行求和时,params就像你期望的那样 - 一个哈希的字符串表示。

使用上面的这个小代码片段当然是一个bandaid,但它提供了。

希望有所帮助。

答案 1 :(得分:3)

使用to_json

将哈希转换为JSON

答案 2 :(得分:0)

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

如果您正在使用"开箱即用"样式Backbone没有必要解码POST到该操作的内容。只需将操作更改为:

@product = Product.new(product_params)

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

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

并且您的产品型号有两个属性,将由.new填充:标题和数据。

如果您在客户端明确地将某些内容编码为JSON,则需要弄清楚它所提交的POST参数以及在服务器上对其进行解码(再次 - 几乎可以肯定没有理由跳过箍那样的。)