使用Javascript生成Rails文本数组

Use Javascript to generate Rails Text Array

本文关键字:文本 数组 Rails 生成 Javascript 使用      更新时间:2023-09-26

我正在尝试编写一些JavaScript,允许用户一次输入一个邮政编码,并建立一个数组,将提交给Rails应用程序。

相关内容如下:

控制器。rb -参数

    {:zipcodes => []} 

Schema.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)

代替这一行:

$("#zipcodes-hidden-tag").val("[" + '"",' + '"' + array.join('","') + '"' + "]");

如果你把它改成:

$("#zipcodes-hidden-tag").val('"' + array.join('","')); 

那么你的值将会是:"979794,297942,24444"

这将使它非常容易在控制器中转换为数组:

params[:provider][:zipcodes].split(',') 
#=> ["979794", "297942", "24444"]

可以是:

params[:provider][:zipcodes] = params[:provider][:zipcodes].split(',')