Отсутствие неявного преобразования типа Array в Integer с Rails 4.0.2 и строгими параметрами

Я пытаюсь обновить вложенную модель с помощью простой ассоциации has_many / own_to

Я установил параметры в контроллере с помощью

params.require(:survey).permit(:name, :questions[[:id, :content]])

но я получаю сообщение Нет неявного преобразования типа Array в Integer

консольный дамп внизу. Из аналогичных проблем я читал, что проблема может заключаться в том, как этот :questions_attributes хешируется - не знаю, где это нужно исправить - любые идеи приветствуются!

Спасибо

Started PATCH "/surveys/1" for 127.0.0.1 at 2014-01-04 15:53:31 +1100
Processing by SurveysController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"l5ANLS/y2Z+aB4xiJzEw+pF+j7V7LQk4THfU7mkTGX4=", "survey"=>{"name"=>"do u like cats?", "questions_attributes"=>{"0"=>{"content"=>"nope3", "id"=>"1"}, "1"=>{"content"=>"no way", "id"=>"2"}}}, "commit"=>"Update Survey", "id"=>"1"}
  Survey Load (0.3ms)  SELECT "surveys".* FROM "surveys" WHERE "surveys"."id" = $1 LIMIT 1  [["id", "1"]]
Completed 500 Internal Server Error in 2ms

TypeError (no implicit conversion of Array into Integer):
  app/controllers/surveys_controller.rb:72:in `[]'
  app/controllers/surveys_controller.rb:72:in `survey_params'
  app/controllers/surveys_controller.rb:44:in `block in update'
  app/controllers/surveys_controller.rb:43:in `update'

Обновление: это то, что публикуется, когда: question_attributes не имеет лишних скобок

{"utf8"=>"✓",
 "_method"=>"patch",
 "authenticity_token"=>"l5ANLS/y2Z+aB4xiJzEw+pF+j7V7LQk4THfU7mkTGX4=",
 "survey"=>{"name"=>"do u like cats?",
 "questions_attributes"=>{"0"=>{"content"=>"nope2",
 "id"=>"1"},
 "1"=>{"content"=>"no way",
 "id"=>"2"}}},
 "commit"=>"Update Survey",
 "id"=>"1"}

person MikeW    schedule 04.01.2014    source источник


Ответы (2)


просто замените :questions[[:id, :content]] на

:questions_attributes => [:id, :content]
person medBouzid    schedule 04.01.2014
comment
Если вы перечитаете мой ответ, я уже дал вам это. Я не просто поправил твои двойные скобки. - person Jon; 04.01.2014

Ваше заявление о разрешении параметров не совсем верно.

Предполагая, что вы используете accepts_nested_attributes_for в своей модели и fields_for в своей форме, вам необходимо обновить заявление о разрешении следующим образом:

params.require(:survey).permit(:name, questions_attributes: [:id, :content])

Если вы хотите иметь возможность удалять дочерние объекты через форму, вам также необходимо добавить :_destroy в массив questions_attributes.

person Jon    schedule 04.01.2014
comment
это была опечатка с моей стороны с двойными скобками. Я пытался обернуть атрибуты в [], поэтому у меня все в точности так, как в вашем ответе. Я думаю, что как-то мне нужно сделать так, чтобы параметры обертывали атрибут questions_attribute определенным образом. Я обновил свой ответ текущими параметрами, которые отправлены в запросе - person MikeW; 04.01.2014
comment
Также обратите внимание, что question_attributes: [] эквивалентно :question_attributes => [] - person Jon; 04.01.2014
comment
Я считаю, что это: questions_attributes (как отмечено), а не questions_attributes: (как в вашем) - то, где находится двоеточие, похоже, имеет значение. - person MikeW; 05.01.2014
comment
Начиная с Ruby 1.9, вы можете использовать :symbol => value и symbol: value как взаимозаменяемые. Взгляните на этот вопрос и ответ на него для получения более подробной информации - stackoverflow.com/questions/18835189/ - person Jon; 06.01.2014