【问题标题】:Where should I place a "notify user" method in a Rails app (or any MVC app)?我应该在 Rails 应用程序(或任何 MVC 应用程序)中的哪里放置“通知用户”方法?
【发布时间】:2012-10-20 02:57:53
【问题描述】:

我听说过一些关于 Web 应用程序中的 MVC 结构的观点。有些人认为模型应该非常小,并且只包含 ActiveRecord(或其他一些 ORM)和像 validatesbelongs_to 这样的小东西,所以模型只有几行长。

我个人认为模型可以在应用中发挥更大的作用。例如,我需要在整个应用程序中频繁通知用户。通知可以从多个控制器触发。它们都根据用户的通知设置向用户发送通知,这是一个可通过用户模型访问的对象。

我想做类似的东西:

class User < ActiveRecord::Base
  #validations, relationships, etc

  def notify(event)
    notif = Notification.new
    notif.type = event.type
    notif.to = self.id
    # etc

    if notif.save
      # send the notification based on the settings
    end
  end
end

这将使任何控制器都可以使用@user.notify 将消息传递给用户。这让事情变得非常干净,但我意识到我的模型中有一些逻辑。更不用说这个模型制造了另一个模型。

我不介意的另一种方法是创建通知并通过该对象发送通知。因此控制器可以执行Notification.new(:to =&gt; @user.id, ...),然后通过Notification.send 传递消息。这也会在 Notification 对象中添加一些逻辑,以便它知道如何发送自己。事实上,我可能更喜欢这种方法而不是通过 User 模型创建通知对象。

我不介意模型中的这些小逻辑,以便在从多个控制器发送消息时方便。这是最好的方法吗?我想一个更纯粹的方法是在每个发送通知的控制器中包含一个 NotificationHelper 模块?

编辑:我一直在阅读一些关于模型中的“域逻辑”的文章。似乎这是鼓励的,我想notifysend 方法被认为是域逻辑。任何有 MVC 经验的开发人员都可以对此发表评论吗?

【问题讨论】:

  • 拥有一个名为notified 的用户属性不会更容易吗?它似乎可以满足您的需求。
  • 不...这是用于根据用户的设置(电子邮件、短信等)向用户发送通知。我在问将实际发送通知的方法放置在哪里。此方法会将通知保存在数据库中(Notification 模型,出于历史目的),根据自己的喜好决定如何发送,然后发送。用户没有“通知”状态。我可以向用户发送 1000 条通知。
  • 啊,我明白了。在那种情况下,你的想法听起来很合理。将该方法放在 NotificationHelper 中,并使助手在应用程序级别可用。这样,您不必在每个控制器中单独包含 NotificationHelper。
  • 这可行,但实际上是我试图避免的。我宁愿将此逻辑放在模型中(用户或通知)。我在问这是否是一个“可接受的”解决方案。我提出疑问的原因是我听到了关于模型在 MVC 结构中的作用的不同观点。我个人认为模型方法更好,但其他人(与我一起工作的一些人)不同意。我希望比我自己更有经验的人的意见(希望)支持我。

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


【解决方案1】:

对于您的第二种方法,您可以使用 ActiveRecord::Observer

 class NotificationObserver < ActiveRecord::Observer
   def after_create(notification)
       # some sending logic
   end
 end

但不要害羞将小块逻辑提取到它们自己的类中,例如

lib/user_notify.rb

 class UserNotify
   def event_trigger(user,event)
       # some logic
   end
 end

使用适合您系统的命名概念(可能是 Notify.send_user_about_event 等)

【讨论】:

  • 这很好,但不一定能回答我的问题。另外,为什么需要观察者?不能只在 Notification 模型文件中使用 after_create 吗?
  • 松耦合,这里有很好的解释Use Observer
  • 并添加显式抽象层以更好地理解您的域逻辑,并将一些东西分解成小块以便更轻松、更快地进行测试
猜你喜欢
  • 1970-01-01
  • 2011-12-07
  • 2016-09-20
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 2020-08-02
  • 1970-01-01
相关资源
最近更新 更多