Rails - 如何避免必须从另一个控制器中的create action触发一个控制器中的create操作

时间:2012-09-12 20:26:28

标签: ruby-on-rails model-view-controller controller action

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

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

  

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

     

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

     

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

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

谢谢。

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分:0)

你只需要在你的案例控制器动作中编写Notification.create,就是这样。

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