从二维数组中获取值

时间:2013-04-03 06:55:02

标签: ruby-on-rails-3

我正在传递一个带有表格参数的数组来处理。它包含多个行,每个行包含多个值。如何检索单个值? 这是控制器代码:

params[:line].each do |line|
  ... 
end

每个“行”给我这些值,我想检索每个值,比如“home_score_id”:

["1", {":home_club_id"=>"11", ":home_score"=>"2", ":away_score"=>"4", ":away_club_id"=>"10"}]

更新

这是表单,它有12行输入匹配结果:

= form_tag store_all_results_path, class: 'form-horizontal' do
  .control-group
    .controls
      = select_tag :gameround_id, options_for_select(@gamerounds.map{ |g| ["#{markup_gameround(g)}", g.id] })
  - 1.upto(12) do |counter|
    .control-group
      .controls
      = select_tag "line[#{counter}][:home_club_id]", options_for_select(@clubs.map{ |c| [c.club_name, c.id] }), include_blank: true
      = text_field_tag "line[#{counter}][:home_score]", nil, class: "small_text_field"
      = text_field_tag "line[#{counter}][:away_score]", nil, class: "small_text_field"
      = select_tag "line[#{counter}][:away_club_id]", options_for_select(@clubs.map{ |c| [c.club_name, c.id] }), include_blank: true
  .form-actions
    = submit_tag :submit, value: I18n.t('.general.save'), class: "btn"
    = link_to t('.cancel', default: t("helpers.links.cancel")), results_path, class: 'btn'

提交后,它会提供以下POST参数:

Started POST "/results/store_all" for 127.0.0.1 at 2013-04-03 10:47:34 +0200
Processing by ResultsController#store_all as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"[FILTERED]", "gameround_id"=>"3", "line"=>{"1"=>{":home_club_id"=>"8", ":home_score"=>"3", ":away_score"=>"2", ":away_club_id"=>"10"}, "2"=>{":home_club_id"=>"7", ":home_score"=>"4", ":away_score"=>"2", ":away_club_id"=>"12"}, "3"=>{":home_club_id"=>"", ":home_score"=>"", ":away_score"=>"", ":away_club_id"=>""}, "4"=>{":home_club_id"=>"", ":home_score"=>"", ":away_score"=>"", ":away_club_id"=>""}, "5"=>{":home_club_id"=>"", ":home_score"=>"", ":away_score"=>"", ":away_club_id"=>""}, "6"=>{":home_club_id"=>"", ":home_score"=>"", ":away_score"=>"", ":away_club_id"=>""}, "7"=>{":home_club_id"=>"", ":home_score"=>"", ":away_score"=>"", ":away_club_id"=>""}, "8"=>{":home_club_id"=>"", ":home_score"=>"", ":away_score"=>"", ":away_club_id"=>""}, "9"=>{":home_club_id"=>"", ":home_score"=>"", ":away_score"=>"", ":away_club_id"=>""}, "10"=>{":home_club_id"=>"", ":home_score"=>"", ":away_score"=>"", ":away_club_id"=>""}, "11"=>{":home_club_id"=>"", ":home_score"=>"", ":away_score"=>"", ":away_club_id"=>""}, "12"=>{":home_club_id"=>"", ":home_score"=>"", ":away_score"=>"", ":away_club_id"=>""}}, "commit"=>"Opslaan"}

在控制器中,我想浏览12行中的每一行并创建结果记录(当行不为空时):

 def store_all
    params[:line].each do |line|
      unless line[:home_club_id].blank?
        Result.create(home_club_id: line[:home_club_id], away_club_id: line[:away_club_id],  home_score: line[:home_score], away_score: line[:away_score], gameround_id: params[:gameround_id])
      end
    end
  end

2 个答案:

答案 0 :(得分:0)

“line”中的第二个值是Hash,因此可以使用

进行访问
line[1][:home_club_id]

答案 1 :(得分:0)

虽然您的键看起来像符号(:home_club_id),但实际上它们的前缀是冒​​号(":home_club_id")。从视图中删除冒号应解决问题。

所以而不是:

= text_field_tag "line[#{counter}][:away_score]"

只需写下:

= text_field_tag "line[#{counter}][away_score]"

由于paramsHashWithIndifferentAccess,您可以在控制器中使用line["away_score"]line[:away_score]

def store_all
  params[:line].each do |counter, line|
    unless line[:home_club_id].blank?
      Result.create(line.merge(gameround_id: params[:gameround_id])
    end
  end
end
相关问题