简体   繁体   English

为什么我不能在params中做每一个?

[英]why I can't do each in params?

I have this inputs 我有这个输入

<input type="hidden" name="languages[0][name]" value="xx">
<input type="hidden" name="languages[0][level]" value="yy">

0 is a value thats change as this inputs are generated dynamically with javascript. 0是一个值,随着这个输入是用javascript动态生成的。

In my controller, I want access to this parameters, and do each, like this: 在我的控制器中,我想要访问这些参数,并执行每个参数,如下所示:

params[:languages].each do |lang|
    @job_offer.job_offer_languages.create name: lang[:name], level: lang[:level]
  end
end

params[:languages] is : params[:languages]是:

{"0"=><ActionController::Parameters {"name"=>"Inglés", "level"=>"Bás̄ico"} permitted: false>} permitted: false>

So I'm expecting each to give me a hash with name and level, 所以我希望每个人都给我一个名字和等级的哈希,

But in the each lang is the key "0" as an string, not the parameters. 但是在每个lang中键为"0"作为字符串,而不是参数。

I've tried with fetch and permit, got the same results. 我尝试过fetch和permit,得到了相同的结果。

The only way I made it works is adding this as the first line in the each, but I don't understand why I have to do it. 我使它成功的唯一方法是将它作为每个中的第一行添加,但我不明白为什么我必须这样做。

 ...each do |lang|
        lang = params[:languages].fetch(lang)

Because your params[:language] is a hash each iterates over its entries and passes key and value of each entry to a block. 因为你的params[:language]是一个哈希, each遍历它的条目并将每个条目的keyvalue传递给一个块。 Therefore, to access lang the way you want you need to the following: 因此,要以您希望的方式访问lang ,您需要执行以下操作:

params[:languages].each do |index, lang|
    @job_offer.job_offer_languages.create name: lang[:name], level: lang[:level]
  end
end

or use ActiveSupport to receive list of lang values to iterate over: 或使用ActiveSupport接收要迭​​代的lang值列表:

 params[:languages].values.each do |lang|
    @job_offer.job_offer_languages.create name: lang[:name], level: lang[:level]
  end
end

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM