Как правильно перебирать параметры - PullRequest
4 голосов
/ 01 марта 2012

Как мне прокрутить параметры в моем контроллере, чтобы я мог изменить их значения?

This:

...
params[:contact][:relationships_attributes].each do |rel|
  rel[:contact_ids] = [rel[:contact_ids]]
end
...

Возвращает ошибку:

# can't convert Symbol into Integer

Чтобы обеспечить больше контекста, я использую одно поле выбора вместо множественного выбора.Таким образом, контроллер ожидает массив, но вместо этого получает одно значение.

Вот мои параметры:

{"utf8"=>"✓",
"_method"=>"put",
"authenticity_token"=>"8FrW59t9vzSep+jEGceMdE/b5q69i5hrEp08yZJJk0o=",
"contact"=>
  {"first_name"=>"John",
   "last_name"=>"Smith",
   "email_addresses_attributes"=>
    {"0"=>
      {"value"=>"john.smith@gmail.com",
       "type"=>"Home",
       "_destroy"=>"false",
       "id"=>"4f4eea6dbe5a2ccf03000031"
      },
       "1"=>{"value"=>"john@smith.com",
       "type"=>"Home",
       "_destroy"=>"false",
       "id"=>"4f4eea7dbe5a2ccf03000035"
      }
    },
  "phone_numbers_attributes"=>
    {"0"=>
      {"value"=>"555-334-5959",
       "type"=>"Home",
       "_destroy"=>"false",
       "id"=>"4f4eea64be5a2ccf0300002c"}
    },
  "addresses_attributes"=>
    {"0"=>
      {"type"=>"Home",
       "street_address"=>"12345 Any Rd",
       "city"=>"Anytown",
       "state"=>"CO",
       "country"=>"United States",
       "_destroy"=>"false",
       "id"=>"4f4eea64be5a2ccf0300002d"
      }
    },
  "relationships_attributes"=>
    {"1330623965418"=>
      {"contact_ids"=>"4f4e6696be5a2ca2a7000045",
       "title"=>"Wife",
       "_destroy"=>"false"
      }
    }
  },
  "commit"=>"Update Contact",
  "id"=>"4f4e6696be5a2ca2a7000045"
}

1 Ответ

18 голосов
/ 01 марта 2012

Когда вы используете each для хэша, например:

params[:contact][:relationships_attributes].each do |rel|

аргумент блока, rel, на самом деле представляет собой двухэлементный массив с ключом в позиции 0 и значением в позиции 1. Затем ваш блок пытается получить доступ к массиву, как если бы это был хэш:

rel[:contact_ids]

и это объясняет ваше сообщение об ошибке: вы не можете индексировать массив с помощью символа.

Я думаю, что вы хотите сделать что-то вроде этого:

params['contact']['relationships_attributes'].each do |k, v|
  v['contact_ids'] = [ v['contact_ids'] ] unless v['contact_ids'].is_a?(Array)
end

Это даст вам такую ​​структуру:

{
  :contact => {
    :relationships_attributes => {
      '1330623965418' => {
        :contact_ids => ['4f4e6696be5a2ca2a7000045']
        :title => 'Wife',
        :_destroy => 'false'
      }
      ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...