-1

我有以下帖子请求,我正在尝试获取团队 ID 值。

{"utf8"=>"✓",
 "_method"=>"put",
 "authenticity_token"=>"knq4dG1U/5NJxMD6KYxfOpKd3CuOBHRlp6xCwdpwCnQ=",
 "match"=>{"name"=>"latest match",
 "date(1i)"=>"2013",
 "date(2i)"=>"5",
 "date(3i)"=>"19",
 "teams_attributes"=>{"0"=>{"name"=>"Navi",
 "id"=>"1"},
 "1369038961631"=>{"name"=>"A team",
 "id"=>"2"}}},
 "commit"=>"Update Match",
 "match_id"=>"2"}

如果我这样做,那么我可以提取其中一个值的记录

params.first["match"]["teams_attributes"]["0"]["id"]

但我将处理一组“teams_attributes”,所以我正在执行这个循环,但它返回一个 nil 值。

  teams = params.first["match"]["teams_attributes"]   <---gets the teams_attributes array.

  teams.each do |tea|

    teamid = tea.first["id"]
    puts teamid

  end
4

4 回答 4

2

因为你的有一个嵌套的Hash,里面teams。往下看:

teams.each {|h| p h}
#=>["0", {"name"=>"Navi", "id"=>"1"}]
#=>["1369038961631", {"name"=>"A team", "id"=>"2"}]

执行以下操作:

teams.each_value.map{|v| v['id']} #=> ["1", "2"]
于 2013-05-20T10:21:15.010 回答
2

params.first绝对行不通,因为您处理的是哈希而不是看起来的数组。因此params.first会返回["utf8", "✓"]

其次,each在 Hash 上使用会为 分配一个 Array tea,其中包含 Hash 中的一个键和一个值。考虑:

teams = params['match']['teams_attributes']
teams.each do |tea|
  p tea
end

# ["0", {"name"=>"Navi", "id"=>"1"}]
# ["1369038961631", {"name"=>"A team", "id"=>"2"}]

因此,当您使用时,tea.first您将获得密钥,而不是价值。在您的示例tea.first中将分别产生"0""1369038961631"。您可以编写一个带有两个参数的块来只获取值,即

teams.each do |key,team|
  # ...
end

但由于你不使用key,你不妨使用匿名块参数_,这将丢弃密钥:

teams.each do |_,team|
  # ...
end

请改用以下代码尝试:

teams = params['match']['teams_attributes']

teams.each do |_,team|
  team_id = team['id']
  puts team_id
end

# 1
# 2

如果您想要一组团队 ID,可以使用map

teams = params['match']['teams_attributes']

team_ids = teams.map do |_,team|
  team['id']
end

p team_ids
# ["1", "2"]
于 2013-05-20T10:28:02.263 回答
0

使用以下代码,这id_array将为您提供所有团队的 id。

id_array = []
teams = params["match"]["teams_attributes"]
teams.keys.each do |key|
 id_array << teams[key]["id"]
end
于 2013-05-20T10:31:03.883 回答
0

如果您对破解团队的 id 想得太多,那您就大错特错了。

原因team_attributes是您在 Match 模型中有这样的类宏

accepts_nested_attributes_for :teams

所以,在你的控制器中

@match = Match.build(params[:match])

然后您可以使用 Match 模型的实例变量来访问团队值

@teams = @match.teams
@team1 = @teams.first
teams1_id = @team1.id # Though I really don't think you need to do that!
于 2013-05-20T10:38:39.847 回答