Я боролся с этим довольно много дней, и я прочитал полдюжины SO-ответов, но, похоже, не могу найти правильный путь для достижения того, что мне нужно.Последний, на который я смотрел - ЗДЕСЬ .Я не мог понять, как приспособить это к моим потребностям.
Я был отмечен ранее за то, что не задал вопрос правильно, поэтому я попытался включить в свой вопрос как можно больше деталей.Если это слишком много, пожалуйста, не отмечайте вопрос, просто предложите изменения, и я обязуюсь.
По сути, я хочу обновить сразу несколько записей во вложенной модели из флажков во вложенной форме.
У меня есть 2 модели, первая модель сообщения: -
class Message < ApplicationRecord
has_many :message_recipients, dependent: :destroy
accepts_nested_attributes_for :message_recipients, :allow_destroy => true
end
Вторая модель MessageRecipient: -
class MessageRecipient < ApplicationRecord
belongs_to :message, optional: true
end
В моем контроллере сообщений Iесть 2 метода: -
def new
@message = Message.new
4.times do
@message.message_recipients.build
end
end
def create
@message = Message.new(message_params)
respond_to do |format|
if @message.save
format.html { redirect_to @message, notice: 'Message was successfully created.' }
format.json { render :show, status: :created, location: @message }
end
У меня также есть это для разрешения параметров в контроллере: -
def message_params
params.require(:message).permit(:user_id, :expirydate, :subject, :messagebody, :createdate, {message_recipients_attributes: [:id, :_destroy, :role]} )
end
На мой взгляд, у меня есть: -
<%= form_with(model: message, local: true) do |form| %>
<div class="field">
<%= form.label :messagebody %>
<%= form.text_field :messagebody %>
</div>
<%= form.fields_for :message_recipients do |m| %>
<%= m.select :role, options_for_select(User.role_for_messages.map {|k, v| [k.humanize.capitalize, v]}, :selected => m.object.role) %>
<% end %>
<div class="actions">
<%= form.submit %>
</div>
<% end %>
Теперь все это работает на отлично и выполняет именно то, что мне нужно, однако вместо использования нескольких вариантов выбора я хочу преобразовать это в флажки.Для этого я изменил свой файл представления: -
<%= form.fields_for :message_recipients do |m| %>
<%= m.collection_check_boxes :role, User.role_for_messages, :second, :first do |b| %>
<div class="collection-check-box"> %>
<%= b.check_box %>
<%= b.label %>
</div> %>
<% end %>
<% end %>
Я также изменил message_params, чтобы разрешить массив флажков в: -
params.require(:message).permit(:user_id, :expirydate, :subject, :messagebody, :createdate, {message_recipients_attributes: [:id, :_destroy, :role =>[]] } )
И, наконец, я изменилКонтроллер сообщений Новый метод: -
def new
@message = Message.new
@message.message_recipients.build
end
Проблема в том, что я не получаю консольных ошибок. Я также не получаю несколько дочерних записей.Я фактически получаю одну запись, созданную, но без каких-либо значений из флажка.Я думаю, что это связано с тем, как генерируются параметры, но я просто не могу понять, в чем проблема.Для полноты я включил сгенерированные ниже параметры: -
Parameters: {"utf8"=>"✓", "authenticity_token"=>"qKQ+Ove7DRJqUIZ+NlgCdM85G9Mf5p8h1gWCF36vd9ODa40G4miKkhHaNbG7grpVFqqCiF7uq+BT8G9Olvm5qQ==", "message"=>{"user_id"=>"3", "subject"=>"Subject 3", "messagebody"=>"Message Body 3", "createdate"=>"2018-12-21", "expirydate"=>"09/08/18", "message_recipients_attributes"=>{"0"=>{"role"=>["", "0", "1", "2", "3"]}}}, "commit"=>"Create Message"}
Может ли кто-нибудь указать мне правильное направление и / или привести пример?