Как передать пустой текстовый массив из представления в контроллер для обновления в Rails? - PullRequest
2 голосов
/ 29 февраля 2020

У меня есть модель, в которой поле текстового массива определено так:

t.text "widgets", default: [], array: true и допустимый параметр в моем контроллере

params.require(:model).permit(widgets: [])

На мой взгляд Я могу построить значения для помещения в этот массив, используя поля ввода, которые выглядят как

<input multiple="true" value="widget_name" name="model[widgets][]" id="model_widgets"/>

Это прекрасно работает для всех случаев добавления и удаления значений из массива, кроме случая удаления последнее значение из массива, если оно уже существует в модели

Есть ли волшебный скрытый вход, который я могу использовать, чтобы передать пустой массив обратно в контроллер для обновления?

Я знаю, что флажки имеют похожую проблему, в которой вы можете использовать скрытое поле со значением 0. Я пытался использовать подобные методы, такие как

<input type="hidden" value="0" name="model[widgets][]" id="model_widgets"/>, который возвращает массив в контроллер, который выглядит как ["0"] (очевидно),

<input type="hidden" value="0" name="model[widgets]" id="model_widgets"/>, который является недопустимым параметром в контроллере (поскольку это не массив), и даже

<input type="hidden" value="[]" name="model[widgets]" id="model_widgets"/> - также недопустимым, надеялся для пустого массива.

Я знаю Теперь я могу выполнить sh эту задачу, включив новый параметр в моем контроллере, который, когда присутствует, указывает на пустой массив виджетов, но я надеюсь, что есть "правильный" подход с точки зрения представления.

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

Ответ, кажется, нет - нет магического скрытого ввода для передачи пустого массива обратно в контроллер. Поскольку модель не будет обновлять поле для отсутствующего параметра, в контроллере должны использоваться значения по умолчанию.

Я нашел элегантный способ сделать это с помощью параметров разрешения, я использовал предоставленные рельсы reverse_merge, чтобы установить значения по умолчанию для массивов, так что если они не будут включены в параметры POST, они будут пустыми вместо отсутствия (т. е. удаление всех скрытых входных данных для этого параметра приведет к использованию пустого массива).

def permitted_params
  defaults = { widgets: [] }
  params.require(:model).permit(widgets: []).reverse_merge(defaults)
end
0 голосов
/ 11 марта 2020

Вы пробовали?:

<input name="model[widgets][]" type="hidden" value="" />

А в контроллере сделать Array.wrap(params.dig(:model, :widgets)).reject(:blank?) для назначения?

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