Rails формируют параметры params - PullRequest
0 голосов
/ 28 июля 2010

Я создаю некоторые данные для отправки через $ .post jQuery, данные, которые я отправляю, выглядят так:

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

Которая из jQuery преобразует объект данных, который подготовлен:

  • создание массива [] для каждого «экипажа», обнаруженного в DOM, называемого экипажами.
  • Затем я перебираю экипажи в DOM, создаю объект и сохраняю его идентификатор лодки
  • затем я создаю еще один массив для его списка членов экипажа, который затем добавляется в объект экипажа и помещается в массив «экипажи».(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 Ответ

2 голосов
/ 28 июля 2010

Ваш 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] потому что ваши ключи - это строки, а не символы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...