3

在这里原谅一个基本问题。

通过阅读,我了解到从另一个控制器触发创建操作不是最佳实践 - 我正在寻找有关在以下情况下如何组织代码的建议:

我有两个控制器:案例和通知。

创建新案例时,我希望它也创建一个新通知。

通知创建操作在其模型中创建一个新实例,并发送一封电子邮件。

我认为我不应该只是从我的案例控制器调用 Notification#create 是否正确?我应该将其提取到帮助程序或模块中吗?如果是这样,它会是什么样子?关于这个主题的其他大致相似的帖子没有详细说明。

谢谢你。

4

4 回答 4

3

由于 create 是一种 POST 方法,我认为没有办法从案例控制器调用通知控制器的创建。我的建议是将通知实例的创建和发送邮件逻辑移动到您的案例模型的保存之前。这将在每次创建案例时创建一个通知,并且还会处理邮件发送机制。由于这是您业务需求的一部分,因此最好将业务逻辑移动到您的模型中。

于 2012-09-13T02:28:04.130 回答
1

这个逻辑应该在你的模型中。好的解决方案是使用 ActiveRecord 回调。

# app/models/case.rb
class Case < ActiveRecord:Base
  after_create :create_notification

private        # <--- bottom of your model
  def create_notification
    Notification.create!(some_options_for_notification)
  end
end

# app/models/notification.rb
class Notification < ActiveRecord:Base
  after_create :send_notification

def send(opts)
  ...          # <--- some logic to send notification here
end


private        # <--- bottom of your model
  def send_notification
    send(some_options_for_sending)
  end
end
于 2012-09-13T02:42:14.617 回答
1

作为选项之一,您可以使用 rails 观察者来创建通知http://api.rubyonrails.org/classes/ActiveRecord/Observer.html

观察者和回调之间几乎没有区别,例如观察者不能取消任何模型动作,但在你的情况下,我认为无论如何都可以使用。

但观察者也曾经坚持单一职责原则。

例子

class CaseObserver < ActiveRecord::Observer
 def after_create(case)
    #create notification
 end
end

应该保存到/app/models/case_observer.rb.

在你的config/application.rb

config.active_record.observers = :case_observer
于 2012-09-13T12:08:12.113 回答
0

您只需要在您的案例控制器操作中编写 Notification.create 即可。

您可以根据需要编写尽可能多的代码,在控制器操作中创建尽可能多的模型。

于 2012-09-12T20:40:03.550 回答