Rails API:无法将JSON字段属性列入白名单

时间:2017-01-19 16:22:18

标签: ruby-on-rails json api activerecord ruby-on-rails-5

我正在使用包含JSON类型的属性data的模型构建rails API。 (PSQL)

但是当我尝试发布类似这样的内容时

{ model: { name: 'Hello', data: { a: 1, b: 2 } } }

Rails认为ab是嵌套data关联的属性......它认为它们是不允许的参数。 问题是,{ a: 1, b: 2 }是我的字段data的值。

如何为属性提供JSON值?

-

编辑:

显示的错误是:

Unpermitted parameters: name, provider, confidence, location_type, formatted_address, place_id, types, locality, ...

数据属性的值为{ name: 'Name', provider: 'Provider', ... }

就像我说Rails认为它们是嵌套data关联的属性。

-

日志: Pastebin

2 个答案:

答案 0 :(得分:2)

如果密钥事先未知,这可能是一种解决方法:

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中的这个用例)

答案 1 :(得分:0)

发布内容时,必须确保json与控制器具有相同的参数。

示例rails 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

帖子的前端json示例:

var body = {
 name: 'myName',
 provider: 'provider',
 data: {
  a: 'something',
  b: 'otherthing',
 }
};

由于某些原因,rails无法识别嵌套的json,因此您需要写入 params.permit 数据将是具有该语法的json,如果是数组的话, [] 应为空。