json 数组的强参数

Strong parameters with json array

我已经读过这个答案 how to permit an array with strong parameters 但我无法使用 params.permit 来理解这种情况,来自使用 rails 4.2:

的 byebug 会话

如何提取评论参数?

(byebug) params
{"comments"=>"[{\"comment\":\"ndjsnjakldnfljkasdbfhjae\",\"date\":\"2017-07-20 17:14:38\"}]", "format"=>:json, "controller"=>"airis/observations", "action"=>"create", "id"=>"13534543543"}
(byebug) params.permit(:id)
[2017-07-20 19:14:43 +0200] [f2b3d7c8-c84a-43a5-b48f-0f634be49dc7] Unpermitted parameters: comments, format
{"id"=>"13534543543"}
(byebug) params.permit(:comments)
[2017-07-20 19:14:43 +0200] [f2b3d7c8-c84a-43a5-b48f-0f634be49dc7] Unpermitted parameters: format, id
{"comments"=>"[{\"comment\":\"ndjsnjakldnfljkasdbfhjae\",\"date\":\"2017-07-20 17:14:38\"}]"}
(byebug) params.permit(comments: [:comment, :date])
[2017-07-20 19:14:43 +0200] [f2b3d7c8-c84a-43a5-b48f-0f634be49dc7] Unpermitted parameters: format, id
{"comments"=>nil}
(byebug) params.permit(:id, comments: [:comment, :date])
[2017-07-20 19:14:43 +0200] [f2b3d7c8-c84a-43a5-b48f-0f634be49dc7] Unpermitted parameter: format
{"id"=>"13534543543", "comments"=>nil}

甚至这样:

(byebug) params.permit( :comments => [:comment, :date])
[2017-07-20 19:14:43 +0200] [f2b3d7c8-c84a-43a5-b48f-0f634be49dc7] Unpermitted parameters: format, id
{"comments"=>nil}

试一试:

2.3.1 :034 > JSON.parse(params.permit(:comments)[:comments])
Unpermitted parameters: format, id
 => [{"comment"=>"ndjsnjakldnfljkasdbfhjae", "date"=>"2017-07-20 17:14:38"}]  

params.permit(:comments) returns 参数散列只有 "comments" k,v 对(删除不允许的参数,formatid):

2.3.1 :035 > params.permit(:comments)
Unpermitted parameters: format, id
 => {"comments"=>"[{\"comment\":\"ndjsnjakldnfljkasdbfhjae\",\"date\":\"2017-07-20 17:14:38\"}]"} 

params.permit(:comments)[:comments] 从散列中选择 :comments 键的值:

2.3.1 :036 > params.permit(:comments)[:comments]
Unpermitted parameters: format, id
 => "[{\"comment\":\"ndjsnjakldnfljkasdbfhjae\",\"date\":\"2017-07-20 17:14:38\"}]" 

JSON.parse(params.permit(:comments)[:comments]) 将字符串转换为适当的 ruby 数组。

从那里,您可以随心所欲地使用 ruby array 对象。

如果您同时想要 :comments:id,那么只需:

params.permit(:comments, :id)
Unpermitted parameter: format
 => {"comments"=>"[{\"comment\":\"ndjsnjakldnfljkasdbfhjae\",\"date\":\"2017-07-20 17:14:38\"}]", "id"=>"13534543543"} 

获取各​​个部分:

2.3.1 :038 > params.permit(:comments, :id)[:comments]
Unpermitted parameter: format
 => "[{\"comment\":\"ndjsnjakldnfljkasdbfhjae\",\"date\":\"2017-07-20 17:14:38\"}]" 

和:

2.3.1 :039 > params.permit(:comments, :id)[:id]
Unpermitted parameter: format
 => "13534543543" 

你可能想把它包装成类似这样的东西:

def clean_params
  @clean_params ||= params.permit(:comments, :id)
end

所以你可以做 clean_params[:comments]clean_params[:id]