我有以下帖子请求,我正在尝试获取团队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'数组,所以我正在做这个循环,但它返回的是一个零值。
teams = params.first["match"]["teams_attributes"] <---gets the teams_attributes array.
teams.each do |tea|
teamid = tea.first["id"]
puts teamid
end
答案 0 :(得分: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"]
答案 1 :(得分:2)
params.first
肯定不会起作用,因为你正在处理一个哈希而不是一个数组。因此params.first
将返回["utf8", "✓"]
。
其次,在哈希上使用each
会将一个数组分配给tea
,其中包含一个键和来自哈希的值。考虑:
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"]
答案 2 :(得分:0)
使用以下代码,在此id_array
将为您提供所有团队的ID。
id_array = []
teams = params["match"]["teams_attributes"]
teams.keys.each do |key|
id_array << teams[key]["id"]
end
答案 3 :(得分:0)
如果你对黑客攻击团队的内容过多考虑,那你就错了。
team_attributes
的原因是你在匹配模型中有这样的类宏
accepts_nested_attributes_for :teams
所以,在你的控制器中
@match = Match.build(params[:match])
然后您可以使用Match model的实例变量来访问团队值
@teams = @match.teams
@team1 = @teams.first
teams1_id = @team1.id # Though I really don't think you need to do that!