我有一个使用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):
感谢您的帮助!
答案 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
答案 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参数以及在服务器上对其进行解码(再次 - 几乎可以肯定没有理由跳过箍那样的。)