如何在rails中读取这些post参数

时间:2013-05-20 10:14:15

标签: ruby-on-rails ruby ruby-on-rails-3

我有以下帖子请求,我正在尝试获取团队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

4 个答案:

答案 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!