Rails 4 - 邮件程序 - 如何将参数传递给邮件程序方法

时间:2016-08-08 00:44:18

标签: ruby-on-rails ruby variables actionmailer

我正试图弄清楚如何在我的Rails 4应用程序中设置邮件程序类。

我制作了一个名为admin_notes的邮件程序。我想用它在网站上采取某些行动时向内部团队发送电子邮件。

在我的邮件程序/ admin_note.rb中,我有:

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

我有一个organisation_requests模型。它有:

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

组织请求表有一个名为:name的属性。

创建新的组织请求时,我想向内部团队发送管理员注释,提醒某人启动流程。

我正在努力弄清楚如何在邮件程序方法中定义三个变量。

我计划将发送电子邮件调用添加到组织请求控制器中的创建操作。

如何设置这些变量?

创建组织请求的表单是:

<%= 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:

我的组织控制器中有一个创建操作,我在电子邮件中添加了此服务类请求:

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

然后我有一个服务/组织请求/ 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

AdminNote邮件程序包含:

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

这不起作用,但我想知道我是否在正确的轨道上?我不确定控制器中的create动作是否需要对到达文件的services / organisation_requests / path有某种引用?

我想我可能比我开始时更糟糕 - 但是我对于接下来要尝试的事情没有想法。

2 个答案:

答案 0 :(得分:0)

这可以帮助您

在您的邮件程序方法

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

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

在保存organization_request之后的控制器方法中,这就是设置变量的方法。你可以传递你想要的变量。

AdminNote.unknown_organization(@organization_request, current_user).deliver_now

在您的邮件程序模板中,您可以像在操作视图中一样访问传递的值。这就是你使用变量的方式。

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

希望这会有所帮助

如果您想排队邮件或稍后发送邮件,可以使用ActiveJob在后台发送邮件。

有关详情,请参阅http://guides.rubyonrails.org/active_job_basics.html

答案 1 :(得分:0)

我知道我来晚了,但是我走了。

我了解到您正在尝试向邮件程序发送一些参数(值),以便在发送电子邮件时可以使用它。

为此,您只需要定义一个接受某些参数的mailer方法。完成的操作就在AdminNote Mailer unknown_organization方法中。

让我们进入您的新尝试。 除了传递未定义的变量organization_request外,您在此处所做的一切似乎都是正确的。您已经创建了实例变量@organization_request,但是您传递的是未定义的内容。在这里

NewOrgRequestService.send_unknown_organisation_requested_flag(organisation_request)

那是你的第一个问题。可以将其改进为: 您的组织#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

您的模型可以如下:

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

我不知道为什么要在模型类中定义一个类。

您的邮件程序应如下所示:

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

这里有很多错别字和方法实现错误。