简体   繁体   中英

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

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: "test@testerongmail.com",from: "test@testerongmail.com", 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: "test@testerongmail.com",from: "test@testerongmail.com", 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.

This may help you .

In your mailer method

def unknown_organisation(org,user)
   @org = org
   @user = user

   mail(to: "test@testerongmail.com",from: "test@testerongmail.com", subject: "A new organisation")
end

In your controller method after saving organization_request and this is how you set your variable. You can pass variable you want.

AdminNote.unknown_organization(@organization_request, current_user).deliver_now

In your mailer template access passed value as you do in action view. And this is how you use your variable.

<%= @org.name %>
<%= @org.full_name %>

Hope this helps

If you want to queue message or send later you can use ActiveJob to send mails in the background.

For more, see http://guides.rubyonrails.org/active_job_basics.html

I know I am super late but here I go.

I understand that you are trying to send in some parameters (values) to mailer so that you can use it while sending an email.

To do so you just need to define a mailer method that accepts some parameters. What you have done is right in your AdminNote Mailer unknown_organization method.

Let's get to your NEW ATTEMPT . Everything you have done there seems about right except you are passing an undefined variable organization_request . You have created an instance variable @organization_request but you are passing something that is not defined. Here

NewOrgRequestService.send_unknown_organisation_requested_flag(organisation_request)

That is your first problem. This can be improved as: Your Organizations#create

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

    if @organisation_request.save
      @organisation_request.send_unknown_organisation_requested_flag
      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

And your model can be as follows:

class OrganisationRequest < ActiveRecord::Base
    def send_unknown_organisation_requested_flag
        if self.name.present?
            AdminNote.unknown_organisation_requested(self).deliver_later
        end 
      end
end

I don't know why you are defining a class inside your model class.

Your Mailer should look like below:

class AdminNote < ApplicationMailer
    layout 'transactional_mailer'

    def unknown_organisation_requested(organisation_request)

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

    # @greeting = "Hi"
    mail 
    to: "test@testerongmail.com",from: "test@testerongmail.com", subject: "A new organisation"

  end
end

There are a lot of typos and method implementation errors here.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM