2013-05-20 2 views
-1

У меня есть следующий запрос на отправку, где я пытаюсь получить значение id команд.Как читать эти параметры сообщения в rails

{"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

Почему вы делаете '. First'? –

ответ

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"] 
+0

Спасибо, это единственный способ сделать это в rails при использовании пользовательских маршрутов? Я хотел бы сделать это «Team.find (params [: team_id]», но это не сработает. Не знаете, почему, когда команды являются вложенным атрибутом Match. – user901790

+0

Я знаю только Ruby. Не знаю о 'ROR'.: ( –

2

params.first точно не будет работать, потому что вы имеете дело с Hash, а не с массивом, как это кажется. Поэтому 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 

Если вы хотите массив команды идентификаторов, вы можете использовать map:

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

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

p team_ids 
# ["1", "2"] 
+0

кажется, что вы и я на той же странице. :) –

+0

Да, не видел вашего ответа, пока я не отправил свою ;-) –

0

Используйте следующий код, в котором id_array предоставит вам идентификатор всех команд.

id_array = [] 
teams = params["match"]["teams_attributes"] 
teams.keys.each do |key| 
id_array << teams[key]["id"] 
end 
0

Вы готовите неправильно, если слишком много думаете о взломе идентификатора команды.

Причины есть 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!