module CreateAvisConcern extend ActiveSupport::Concern private def create_avis_from_params(dossier, confidentiel = false) confidentiel ||= create_avis_params[:confidentiel] # Because of a limitation of the email_field rails helper, # the :emails parameter is a 1-element array. # Hence the call to first # https://github.com/rails/rails/issues/17225 emails = create_avis_params[:emails].first.split(',').map(&:strip) create_results = Avis.create( emails.map do |email| { email: email, introduction: create_avis_params[:introduction], claimant: current_instructeur, dossier: dossier, confidentiel: confidentiel } end ) persisted, failed = create_results.partition(&:persisted?) if persisted.any? sent_emails_addresses = persisted.map(&:email_to_display).join(", ") flash.notice = "Une demande d'avis a été envoyée à #{sent_emails_addresses}" persisted.each do |avis| dossier.demander_un_avis!(avis) end end if failed.any? flash.now.alert = failed .filter { |avis| avis.errors.present? } .map { |avis| "#{avis.email} : #{avis.errors.full_messages.join(', ')}" } # When an error occurs, return the avis back to the controller # to give the user a chance to correct and resubmit Avis.new(create_avis_params.merge(emails: [failed.map(&:email).join(", ")])) else nil end end def create_avis_params params.require(:avis).permit(:introduction, :confidentiel, emails: []) end end