我正在尝试编写一些JavaScript,该JavaScript允许用户一次输入一个邮政编码,并建立一个将提交到Rails应用程序的数组。
以下是相关的部分:
Controller.rb-参数
{:zipcodes => []}
模式.rb
t.text "zipcodes", default: [], array: true
html.erb Javascript更新隐藏元素的值
<%= f.hidden_field :zipcodes, id:"zipcodes-hidden-tag", name:"provider[zipcodes]" %>
js.erb文件
//Adding a zipcode
var array = [];
$("#addZipcode").click(
function addZipcode() {
x = $("#newZipcode").val(); // gets the zipcode entered by the user
array.push(x);
$("#zipcode_div").text(array); // updates a div so the user can see the data entered
$("#newZipcode").val(""); //clear the zipcode box after submitting
$("#zipcodes-hidden-tag").val("[" + '"",' + '"' + array.join('","') + '"' + "]"); //puts the brackets, empty quote block, and quotes around the elements and updates the hidden field value
}); //Adding a zipcode
成功后(使用多选字段),这是在Rails控制台中的外观:
"provider"=>{"zipcodes"=>["", "90210", "90211", "90212"],
当使用Javascript生成的数组时,我可以看到以下值已传递给Rails,这是正确的格式
["","90210","90211","90212"]
但是在Rails控制台中,它是这样的:
"provider"=>{"zipcodes"=>"[\"\",\"90210\",\"90211\",\"90212\"]"
Rails表示
Unpermitted parameter: zipcodes
我觉得这里有两个问题。括号的开头和结尾处添加了一组额外的引号:
"[ ... ]"
并且双引号已被转换为带有反斜杠的文字。
对我需要进行哪些更改才能使其正常工作有任何想法吗?
谢谢!
最佳答案
控制台的输出,
"provider"=>{"zipcodes"=>"[\"\",\"90210\",\"90211\",\"90212\"]"
正是您应该期望的。您的JavaScript代码将数组编码为字符串,并通过隐藏字段提交,因此
params[:provider][:zipcodes]
是控制器中的字符串。为了将其分配给您的模型,您需要执行以下操作provider.zipcodes = JSON.parse(params[:provider][:zipcodes])
Unpermitted parameter: zipcodes
消息很可能是因为您正在批量分配模型而没有将白名单中的zipcodes
密钥从白名单中删除或将其删除。编辑:
要绕过强参数,请尝试删除
zipcodes
键。provider.zipcodes = JSON.parse(params[:provider].delete(:zipcodes))
safe_params = params.require(:provider).permit(:any, :other, :fields)
provider.update!(safe_params)