【发布时间】:2014-02-11 01:10:39
【问题描述】:
我使用 ActionMailer 向用户发送不同的通知。我为此使用模型回调。 当我以管理员身份进行更改时,我不希望向客户发送任何电子邮件。
如何在 RailsAdmin 中禁用 ActionMailer?
实际上,我想为管理员提供打开/关闭电子邮件的功能。
谢谢
【问题讨论】:
标签: ruby-on-rails admin actionmailer rails-admin
我使用 ActionMailer 向用户发送不同的通知。我为此使用模型回调。 当我以管理员身份进行更改时,我不希望向客户发送任何电子邮件。
如何在 RailsAdmin 中禁用 ActionMailer?
实际上,我想为管理员提供打开/关闭电子邮件的功能。
谢谢
【问题讨论】:
标签: ruby-on-rails admin actionmailer rails-admin
恕我直言,不建议在模型生命周期中触发您的邮件。推荐的方法是从控制器触发邮件。
如果您想在您的控制器中实现关注点分离,并且不通过邮件调用污染您的控制器代码,您可以使用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
本质上,我们在控制器操作上创建了一个观察者,并在控制器上注册了我们的邮件回调,而不是将其绑定到模型生命周期中。我个人认为这种方法更简洁,更易于管理。
【讨论】:
你应该在回调方法上处理它。
def call_back_name
if is_rails_admin?
#Do nothing
else
#send mail
end
end
【讨论】: