0

我想知道当在inherited_resources 框架中专门创建或更新记录时发送电子邮件的最佳方式是什么。

现在我正在这样做:

  def create
    create!
    UserMailer.create(object).deliver if @user.valid?
  end

  def update
    update!
    UserMailer.update(object).deliver if @user.valid?
  end

这是有道理的,但似乎有点笨拙。我尝试在成功响应块中这样做,但这似乎也是一件坏事。我还尝试链接到 update_resource 和 create_resource 方法。它们都可以工作,但它们看起来都不是很优雅。

也许我正试图最大限度地减少代码!

4

5 回答 5

1

这是我目前正在做的事情。对我来说,这是最好的和不那么混淆的方法:

  after_filter :send_create_email, :only => :create
  after_filter :send_update_email, :only => [:update, :update_password]

  private

  def send_create_email
    UserMailer.create(@user).deliver if @user.valid?
  end

  def send_update_email
    UserMailer.update(@user).deliver if @user.valid?
  end

在我需要非标准方法名称之前,Nathans 的方法很好。

于 2013-09-14T06:33:20.447 回答
1

我更喜欢 DDD 方法,使用ActiveRecord 回调

因此,如果您想在每次保存模型后发送电子邮件Example,您应该这样做

class Example < ActiveRecord::Base
  after_save :send_email

  protected
  def send_email
    UserMailer.create(object).deliver
  end
end
于 2013-09-13T19:29:25.330 回答
0

我更喜欢这种方法:

def create
  if @user.save # if your user is saved it should be valid
    do something
  else
    do something else
  end
end

def update
  if @user.update_attributes(params[:user])
    do something
  else
    do something else
  end
end
于 2013-05-09T08:47:53.637 回答
0

您可以重构电子邮件的发送并使用后过滤器。在这种情况下,除非您修改它们的默认行为,否则 create 和 update 都可以被删除。未经测试,但这是一个想法:

after_filter :send_email, :only => [ :create, :update ]

private
def send_email
  UserMailer.send(request[:action].to_sym, @user).deliver if @user.valid?
end
于 2013-08-01T19:18:28.630 回答
0

我认为覆盖create_resource是个好方法:

  # Responsible for saving the resource on :create method. Overwriting this
  # allow you to control the way resource is saved. Let's say you have a
  # PassworsController who is responsible for finding an user by email and
  # sent password instructions for him. Instead of overwriting the entire
  # :create method, you could do something:
  #
  #   def create_resource(object)
  #     object.send_instructions_by_email
  #   end
  #
  def create_resource(object)
    object.save
  end

它看起来像这样:

  ActiveAdmin.register SomeModel do
    controller do
      def create_resource(object)
        # TODO
      end
    end
  end
于 2019-10-15T11:53:30.087 回答