как разрешить массив с сильными параметрами



у меня есть функционирующее приложение 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
532   5  

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 пункта, чтобы заметить здесь:

  1. array должен быть последним аргументом permit метод.
  2. вы должны указать ключи хэша в массиве, иначе вы получите ошибку 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

    Ничего не найдено.