use*_*632 5 json ruby-on-rails
我试图在我的模型中通过一个深度嵌套的JSON字段(document => field_instance => value).由于对文档的误解,我使用的是空哈希.
允许!可以做我需要的,但我试图避免简单地做,params.fetch(:document).permit!因为这打开了大量的安全漏洞.那么我如何才能在双重嵌套的JSON值'参数'下允许任何类型的任何结构呢?
我正在使用名为text的值下的单个字符串进行测试,并且正在获取'Unpermitted parameter:text'
每个instance_field都有一个特定的类型,其中包含所需参数的列表,但是没有特定于文档中每个instance_field的方法,我选择只允许该JSON字段下的所有参数.
这是我的document_params方法:
params.fetch(:document)
.permit(:structure_id, :field_instances_attributes => [
:value,
:document_id,
:field_id,
:value_attributes => {}
])
Run Code Online (Sandbox Code Playgroud)
那么,我在这里做错了什么?
或者,甚至更好:每个field_instance都有一个知道字段值期望的确切结构的类型.我可以具体说明每个field_instance的值下允许的字段吗?
相关日志:
service_1 | Parameters: {"utf8"=>"Ô£ô", "authenticity_token"=>" -- censored --", "document"=>{"structure_id"=>"1", "field_instances_attributes"=>[{"document_id"=>"0", "field_id"=>"1", "value_attributes"=>{"text"=>"asdf"}}]}, "commit"=>"Create Document"}
service_1 | Unpermitted parameter: text
service_1 | Unpermitted parameter: text
service_1 | #<FieldInstance id: nil, field_id: 1, document_id: nil, value: nil, created_at: nil, updated_at: nil>
Run Code Online (Sandbox Code Playgroud)
实际上,通过多个步骤构建 params 哈希非常简单,但有点不明显。
这就是我所做的:
def document_params
@document_params ||= params.require(:document).permit(:structure_id, field_instance_atributes: %i[document_id field_id]).tap do |doc|
doc[:value] = params[:document].require(:value).permit!
end
end
Run Code Online (Sandbox Code Playgroud)
如果value对象清理确实很复杂,也许可以将其编写为自己的帮助程序并在此处使用它。
重要的部分是 的使用require:它将内部值作为新对象返回,因此对其进行的操作不会影响params. 可以这么说,你可以根据需要多次返回井中。
警告:如果找不到密钥,require则会抛出异常。ActionController::ParameterMissing
| 归档时间: |
|
| 查看次数: |
907 次 |
| 最近记录: |