如何在rails_admin中禁用ActionMailer?

时间:2014-01-21 12:28:03

标签: ruby-on-rails admin actionmailer rails-admin

我使用ActionMailer向用户发送不同的通知。我为此使用了模型回调。 当我以管理员身份进行更改时,我不希望将任何电子邮件发送给客户。

如何在RailsAdmin中禁用ActionMailer?

实际上,我想提供管理员打开/关闭电子邮件的功能。

谢谢

3 个答案:

答案 0 :(得分:1)

建议不要在模型生命周期中触发邮件程序恕我直言。建议的方法是从控制器触发邮件程序。

如果您希望在控制器中实现关注点分离并且不通过邮件程序调用污染控制器代码,则可以使用ActiveSupport::Notifications和控制器after_filter的组合将邮件程序逻辑提取到自己的模块。

module MailerCallbacks
  module ControllerExtensions
    def self.included(base)
      base.after_filter do |controller|
        ActiveSupport::Notifications.instrument(
          "mailer_callbacks.#{controller_path}##{action_name}", controller: controller
        )
      end
    end
  end

  module Listener
    def listen_to(action, &block)
      ActiveSupport::Notifications.subscribe("mailer_callbacks.#{action}") do |*args|
        event = ActiveSupport::Notifications::Event.new(*args)
        controller = event.payload[:controller]
        controller.instance_eval(&block)
      end
    end
  end
end

假设您想使用我们在上面创建的模块重构以下控制器:

class PostsController < ApplicationController
  def create
    @post = Post.new permitted_params

    respond_to do |format|
      if @post.save
        PostMailer.notify(@post).deliver
        format.html { redirect_to @post, notice: 'Successfully created Post' }
      else
        format.html { render action: 'new' }
      end
    end
  end
end

采取以下步骤:

  1. 创建初始化程序以注册控制器扩展名:

    # config/initializers/mailer_callbacks.rb
    ActiveSupport.on_load(:action_controller) do
      include MailerCallbacks::ControllerExtensions
    end
    
  2. 在相同或单独的初始值设定项中,创建一个类并扩展Listener模块以注册回调:

    # config/initializers/mailer_callbacks.rb
    class MailerListeners
      extend MailerCallbacks::Listener
    
      # register as many listeners as you would like here
    
      listen_to 'posts#create' do
        PostMailer.notify(@post).deliver if @post.persisted?
      end
    end
    
  3. 从控制器中删除邮件代码。

    class PostsController < ApplicationController
      def create
        @post = Post.new permitted_params
    
        respond_to do |format|
          if @post.save
            format.html { redirect_to @post, notice: 'Successfully created Post' }
          else
            format.html { render action: 'new' }
          end
        end
      end
    end
    
  4. 基本上,我们已经在控制器操作上创建了一个观察者,并使用控制器注册了我们的邮件程序回调,而不是将其绑定到模型生命周期中。我个人认为这种方法更清洁,更容易管理。

答案 1 :(得分:0)

您应该在回调方法上处理它。

def call_back_name
  if is_rails_admin?
   #Do nothing
  else 
    #send mail
  end
end

答案 2 :(得分:0)

让我们将这个问题分成两部分:

  1. 禁用电子邮件

    选中answer

  2. 与Rails管理员集成

    您可以将其添加到Rails管理导航部分并将其放入单独的控制器中,以便管理邮件程序打开/关闭。更多信息here