开发者

Rails form params issue

I'm constructing some data to send over jQuery's $.post, the data that I send looks like this:

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

Which is from jQuery converting the data object which is prepared by:

  • creating an array [] for each 'crew' found in the DOM, called crews.
  • Then I cycle over the crews in the DOM, create an object and store its boat ID
  • then I create another array for its a crews list of members, which is then added into the crew's object and pushed onto the 'crews' array. (The JS is a bit long, can post if needed)

Then in my controller I have:

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

The two inspect statements print something like this:

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

and I get this error:

TypeError (Symbol as array index):

To me, crews shouldn't be开发者_运维技巧 an indexed array, and that's where the issue is. But I could also be totally wrong. Any ideas on what I'm doing wrong or how to fix it?


Your params[:crews] is a Hash, but you're trying to use it as if it's an Array. Hashes don't have indexes, per se, but rather keys.

You could get the result you're looking for if you use Hash#each_pair (or Hash#each_value if you don't need keys) instead of each_with_index:

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

To demonstrate:

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

Note that you will still have an issue looking for crew[:boat_id], because your keys are strings and not symbols.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜