我正在构建一个rails API,其中包含一个包含JSON类型的属性data
的模型。(PSQL)
但是当我尝试发布这样的东西时
{ model: { name: 'Hello', data: { a: 1, b: 2 } } }
Rails 认为a
和b
是嵌套data
关联的属性......它认为它们是不允许的参数。问题是,我的字段data
{ a: 1, b: 2 }
值。
如何为属性提供 JSON 值?
编辑:
显示的错误是:
Unpermitted parameters: name, provider, confidence, location_type, formatted_address, place_id, types, locality, ...
数据属性的值为{ name: 'Name', provider: 'Provider', ... }
就像我说的,Rails认为它们是嵌套data
关联的属性。
日志:Pastebin<</p>
如果事先不知道键,这可能是一种解决方法:
def model_params
data_keys = params[:model].try(:fetch, :data, {}).keys
params.require(:model).permit(data: data_keys)
end
功劳归于Aliibrahim,请阅读 https://github.com/rails/rails/issues/9454 的讨论(P.S似乎强大的参数将支持Rails 5.1中的这个用例)
当你发布一些东西时,你必须确保你的json与你的控制器具有相同的参数。
示例轨道 api:
def example
@model = Model.new(params)
@model.save
render(json: model.to_json, status: :ok)
end
def params
params.permit(:name, :provider, {:data => [:a, :b]})
end
示例 post 的前端 json:
var body = {
name: 'myName',
provider: 'provider',
data: {
a: 'something',
b: 'otherthing',
}
};
出于某种原因,rails 无法识别嵌套的 json,因此您需要写入 params.allow 数据将是具有该语法的 json,如果数组中,[] 应为空。
如果使用 Rails v7
def model_params
params.require(:model).permit(:name, data: {})
end
参考