Обновить несколько записей во вложенной модели из флажков - PullRequest
0 голосов
/ 23 декабря 2018

Я боролся с этим довольно много дней, и я прочитал полдюжины 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"}

Может ли кто-нибудь указать мне правильное направление и / или привести пример?

1 Ответ

0 голосов
/ 27 декабря 2018

Теперь у меня это работает со следующим кодом в методе 'create'.На всякий случай это помогает кому-то другому пытаться достичь того же самого.Не стесняйтесь комментировать, если это не считается хорошей практикой.

 def create
  # create the message and save it so I can access it's ID
  @message = Message.new(message_params)
  @message.save

  # populate a new array with the role attributes and discard any that are empty
  params_array = params[:message_recipients_attributes][:role]
  params_array.reject!(&:empty?)

  #loop through the roles and create new child records with the message_id and role(s)
  params_array.each  do |doo|
    @message_recipients = MessageRecipient.new(:message_id => @message.id, :role => doo)
    @message_recipients.save
  end

  #standard boilerplate for checking the message saved and redirecting user
  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 }
    else
      format.html { render :new }
      format.json { render json: @message.errors, status: :unprocessable_entity }
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...