как разрешить массив с сильными параметрами
у меня есть функционирующее приложение Rails 3, которое использует has_many :через ассоциации, которые не являются, поскольку я переделываю его как приложение Rails 4, позволяя мне сохранять идентификаторы из связанной модели в версии Rails 4.
эти три соответствующие модели одинаковы для двух версий.
классификация.РБ
class Categorization < ActiveRecord::Base
belongs_to :question
belongs_to :category
end
вопрос.РБ
has_many :categorizations
has_many :categories, through: :categorizations
5 ответов:
Это https://github.com/rails/strong_parameters похоже на соответствующий раздел документов:
разрешенные скалярные типы: строка, символ, NilClass, числовой, TrueClass, FalseClass, Дата, Время, Датавремя, StringIO, ИО, ActionDispatch::с HTTP::UploadedFile и стойку::тест::UploadedFile.
чтобы объявить, что значение в params должно быть массивом разрешенных скалярных значений, сопоставьте ключ с пустым массив:
params.permit(:id => [])в моем приложении category_ids передаются в действие создать в массиве
"category_ids"=>["", "2"],таким образом, при объявлении сильные параметры, я явно задать category_ids, чтобы быть массив
params.require(:question).permit(:question_details, :question_content, :user_id, :accepted_answer_id, :province_id, :city, :category_ids => [])отлично работает теперь!
если вы хотите разрешить массив хэшей(или
an array of objectsС точки зрения JSON)params.permit(:foo, array: [:key1, :key2])2 пункта, чтобы заметить здесь:
arrayдолжен быть последним аргументомpermitметод.- вы должны указать ключи хэша в массиве, иначе вы получите ошибку
Unpermitted parameter: array, который очень трудно отладить в этом случае.
Это должно быть как
params.permit(:id => [])также начиная с rails версии 4+ Вы можете использовать:
params.permit(id: [])
Если у вас есть хэш-структуру:
Parameters: {"link"=>{"title"=>"Something", "time_span"=>[{"start"=>"2017-05-06T16:00:00.000Z", "end"=>"2017-05-06T17:00:00.000Z"}]}}тогда вот как я получил его на работу:
params.require(:link).permit(:title, time_span: [[:start, :end]])
Я пока не могу комментировать, но после решения Fellow Stranger вы также можете сохранить вложенность, если у вас есть ключи, значения которых являются массивом. Вот так:
filters: [{ name: 'test name', values: ['test value 1', 'test value 2'] }]это работает:
params.require(:model).permit(filters: [[:name, values: []]])
Comments