У меня есть сообщение, которое имеет получатель, проводным так:Pass массив идентификаторов в качестве одного скрытого поля
class Message < ApplicationRecord
has_many :message_recipients
has_many :recipients, through: :message_recipients, source: :user
end
Я прохожу user_ids как GET
паров к новой форме сообщений для предварительной propulate получателей:
def new
@message = Message.new
@message.recipients = User.where(id: params[:user_ids])
end
создал strong_params так:
def message_params
params.require(:message).permit(
:subject,
:body,
recipient_ids: []
)
end
И создал форму следующим образом:
= simple_form_for @message do |f|
= f.hidden_field :recipient_ids
Я ожидал, что все это просто работать, но потом я понял, что в одиночку это скрытое поле не рассматривается как скаляр, так что это игнорируется strong_params (в противном случае я бы делать :recipient_ids
вместо recipient_ids: []
, но тогда он не будет в конечном итоге, как массив).
Так я думал об этом:
= hidden_field_tag 'message[recipient_ids][]', @message.recipients.pluck(:id)
Но тогда контроллер будет анализировать Params, как это:
message_params[:recipient_ids] => ["1, 2, 3"]
вместо:
message_params[:recipient_ids] => ["1", "2", "3"]
Так что я имел для возврата к уродливому:
- @message.recipient_ids.each do |recipient_id|
= hidden_field_tag 'message[recipient_ids][]', recipient_id
И все это сработало.
Но я чувствую, что это далеко не идеально, потому что теперь у меня есть десятки элементов DOM, лежащих вокруг, а не потенциально только один.
Знаете ли вы, что лучший способ достичь такого же результата?
Может быть, Rails должен быть немного умным при получении одного скалярного поля чисел, разделенного запятыми?
Ну, что вы, ребята, думаете? версия
Rails: 5.0.0
Я думаю, что вы раскрыли оба пути подойти к этой проблеме в вашем вопросе: 1) с использованием нескольких входов с именем [] в имени, чтобы они обрабатывались как массив или 2) сериализовали данные в одном входе формы, а затем безриализовали его на сервере. Отправка меньшего количества элементов может способствовать первому подходу, в то время как другие элементы могут способствовать последнему подходу. – Puhlze