我使用ActionMailer向用户发送不同的通知。我为此使用了模型回调。 当我以管理员身份进行更改时,我不希望将任何电子邮件发送给客户。
如何在RailsAdmin中禁用ActionMailer?
实际上,我想提供管理员打开/关闭电子邮件的功能。
谢谢
答案 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
采取以下步骤:
创建初始化程序以注册控制器扩展名:
# config/initializers/mailer_callbacks.rb
ActiveSupport.on_load(:action_controller) do
include MailerCallbacks::ControllerExtensions
end
在相同或单独的初始值设定项中,创建一个类并扩展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
从控制器中删除邮件代码。
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
基本上,我们已经在控制器操作上创建了一个观察者,并使用控制器注册了我们的邮件程序回调,而不是将其绑定到模型生命周期中。我个人认为这种方法更清洁,更容易管理。
答案 1 :(得分:0)
您应该在回调方法上处理它。
def call_back_name
if is_rails_admin?
#Do nothing
else
#send mail
end
end
答案 2 :(得分:0)