Rails形成params问题

时间:2010-07-28 13:04:06

标签: jquery ruby-on-rails ruby ajax

我正在构建一些数据以通过jQuery的$ .post发送,我发送的数据如下所示:

authenticity_token: LxHlgi1WU8o0DtaNuiQOit/e+HlGR2plVcToHUAhA6I=
crews[0][boat_id]: 2
crews[0][crew][]: 10
end_time: 1280408400
start_time: 1280404800

这是来自jQuery转换由以下内容编写的数据对象:

  • 为DOM中的每个'工作人员'创建一个数组[],称为工作人员。
  • 然后我循环在DOM中的工作人员,创建一个对象并存储其船ID
  • 然后我为其成员列表创建了另一个数组,然后将其添加到工作人员的对象中并推送到“工作人员”阵列。 (JS有点长,如果需要可以发布)

然后在我的控制器中我有:

def create
  @outing = Outing.create(
    :club => current_user.club,
    :title => 'Outing',
    :start_time => Time.at(params[:start_time].to_i),
    :end_time => Time.at(params[:end_time].to_i)
  )
  @outing.save

  Rails.logger.debug(params[:crews].inspect)
  params[:crews].each_with_index do |crew,i|
    Rails.logger.debug(crew.inspect)

    @crew = Crew.create(
      :boat_id => crew[:boat_id].to_i,
      :outing_id => @outing.id
    )
    @crew.save

    crew[:crew].each do |c|
      @cu = CrewUsers.create(
        :crew_id => @crew.id,
        :user_id => c.to_i
      )
    end
  end

  render :nothing => true    
end

两个检查语句打印如下:

{"0"=>{"crew"=>["10"], "boat_id"=>"2"}}
["0", {"crew"=>["10"], "boat_id"=>"2"}]

我收到此错误:

TypeError (Symbol as array index):

对我来说,工作人员不应该是一个索引数组,这就是问题所在。但我也可能完全错了。关于我做错了什么或如何解决它的任何想法?

1 个答案:

答案 0 :(得分:2)

您的params[:crews]Hash,但您尝试使用它,就好像它是Array一样。哈希本身没有索引,而是键。

如果您使用Hash#each_pair(或Hash#each_value,如果您不需要密钥)而不是each_with_index,则可以获得所需的结果:

params[:crews].each_pair do |i, crew| # note that the block parameters are reversed
  ...
end

演示:

hash = {"0"=>{"crew"=>["10"], "boat_id"=>"2"}}
hash.each_pair do |i, crew|
  puts crew.inspect
end
#=> {"crew"=>["10"], "boat_id"=>"2"}

请注意,查找crew[:boat_id]时仍有问题,因为您的密钥是字符串而不是符号。