我正在尝试编写一些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)

10-05 20:33
查看更多