【问题标题】:How to disable ActionMailer in rails_admin?如何在 rails_admin 中禁用 ActionMailer?
【发布时间】:2014-02-11 01:10:39
【问题描述】:

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

如何在 RailsAdmin 中禁用 ActionMailer?

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

谢谢

【问题讨论】:

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


    【解决方案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
      

    本质上,我们在控制器操作上创建了一个观察者,并在控制器上注册了我们的邮件回调,而不是将其绑定到模型生命周期中。我个人认为这种方法更简洁,更易于管理。

    【讨论】:

    • 有人知道如何在 rails admin 中操作吗?
    【解决方案2】:

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

    1. 禁用电子邮件

      查看answer

    2. 与 Rails 管理集成

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我想在管理员请求时禁用 ActionMailer。否则,将需要我对所有回调进行许多更改。它必须更优雅。
      猜你喜欢
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      相关资源
      最近更新 更多