Linked Questions

Popular Questions

Rails 4 - mailer - how to pass arguments to a mailer method

Asked by At

I'm trying to figure out how to setup a mailer class in my Rails 4 app.

I have made a mailer called admin_notes. I want to use it to send emails to the internal team when certain actions are taken across the site.

In my mailer/admin_note.rb, I have:

class AdminNote < ApplicationMailer

    def unknown_organisation(organisation_request, user_full_name, name)

     @organisation_request = 
     @user_full_name = 
     @organisation_request.name = 

        # @greeting = "Hi"
    mail( to: "[email protected]",from: "[email protected]", subject: "A new organisation")

  end
end

I have an organisation_requests model. It has:

class OrganisationRequest < ActiveRecord::Base
  belongs_to :profile
  delegate :user_full_name, to: :profile, prefix: false, allow_nil: true

The organisation request table has an attribute called :name in it.

When a new organisation request is created, I want to send an admin note to the internal team, alerting someone to start a process.

I'm struggling to figure out how I define the three variables in the mailer method.

I plan to add the send email call to the create action in the organisation requests controller.

How can I set these variables?

Form to create an organisation request is:

<%= simple_form_for(@organisation_request) do |f| %>
            <%= f.error_notification %>
            <div class="form-inputs">
          <%= f.input :organisation_id, collection: @all_organisations << ['other', nil] %>
                </div>

        <div class="form-inputs">
          <%= f.input :name %>
        </div>

                <div class="form-actions">
                    <%= f.button :submit, "Create", :class => 'formsubmit' %>
                </div>
          <% end %>

NEW ATTEMPT:

I have a create action in my organisation controller, I added this service class request for an email:

def create
    @organisation_request = OrganisationRequest.new(organisation_request_params)
    @organisation_request.profile_id = current_user.profile.id

    if @organisation_request.save
      NewOrgRequestService.send_unknown_organisation_requested_flag(organisation_request)
      return redirect_to(profile_path(current_user.profile),
        flash[:alert] => 'Your request is being processed.')
    else
      # Failure scenario below
      @all_organisations    = Organisation.select(:title, :id).map { |org| [org.title, org.id] }

      render :new
    end
  end

I then have a services/organisations requests/NewOrgRequestService.rb

class OrganisationRequest < ActiveRecord::Base
  class NewOrgRequestService
    attr_accessor :organisation_request

    def self.send_unknown_organisation_requested_flag(organisation_request)
        if @organisation_request.name.present?
            AdminNote.unknown_organisation_requested(organisation_request, user_full_name, name).deliver_later
        end 
      end
  end
end

The AdminNote mailer has:

class AdminNote < ApplicationMailer
    layout 'transactional_mailer'

    def unknown_organisation_requested(organisation_request, user_full_name, name)

        @organisation_request = @organisation_request
        @user_full_name = @organisation_request.user_full_name
        @name = organisation_request.name

    # @greeting = "Hi"
    mail 
    to: "[email protected]",from: "[email protected]", subject: "A new organisation"

  end
end

This doesnt work, but I'm wondering if Im on the right track? Im not sure if the create action in the controller needs to have some kind of reference to the services/organisation_requests/ path that gets to the file??

I think I may have made a bigger mess than I started with - but I'm out of ideas for things to try next.

Related Questions