Я немного запутался в том, что вы используете count и num_of_participants. Во всяком случае, вот как я бы это сделал:
В вашем представлении обновлений у вас должна быть форма, объявленная следующим образом, верно?
# views/reports/edit.html.erb
<%= form_for @report, :url => report_path(@report) do |f| -%>
Если вы это сделаете, то текстовые поля, которые вы используете для ввода своих электронных писем, должны выглядеть следующим образом:
# views/reports/edit.html.erb
<%= f.text_field :emails, :name => "emails[]" %>
Если вы используете form_tag
вместо form_for
, вам следует использовать text_field_tag
вместо f.text_field
.
Зачем ты это спрашиваешь? Ну, потому что таким образом все ваши письма будут упакованы в params[:emails]
. Все они будут внутри массива, что значительно облегчит работу.
Теперь первое, что мы хотим сделать, - это получить текущие электронные письма, связанные с отчетом, и сравнить их с электронными письмами, которые мы получили из формы. Если одно из сообщений было удалено из формы, мы должны удалить его из отчета.
# controllers/reports_controller.rb
@report.participants.each do |participant|
if !params[:emails].include?(participant.email)
@report.participants.delete(participant) #remove the link to the participant from the report
end
end
Теперь нам нужно перебрать наш массив писем, и если в отчете нет пользователя с таким письмом, добавьте этого участника.
# controllers/reports_controller.rb
params[:emails].each do |email|
participant = @report.participants.find_by_email(email)
if participant.nil?
@report.participants << Participant.find_or_create_by_email(email)
end
end
И это все!
@report.save!