【发布时间】:2012-10-20 02:57:53
【问题描述】:
我听说过一些关于 Web 应用程序中的 MVC 结构的观点。有些人认为模型应该非常小,并且只包含 ActiveRecord(或其他一些 ORM)和像 validates 和 belongs_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 => @user.id, ...),然后通过Notification.send 传递消息。这也会在 Notification 对象中添加一些逻辑,以便它知道如何发送自己。事实上,我可能更喜欢这种方法而不是通过 User 模型创建通知对象。
我不介意模型中的这些小逻辑,以便在从多个控制器发送消息时方便。这是最好的方法吗?我想一个更纯粹的方法是在每个发送通知的控制器中包含一个 NotificationHelper 模块?
编辑:我一直在阅读一些关于模型中的“域逻辑”的文章。似乎这是鼓励的,我想notify 或send 方法被认为是域逻辑。任何有 MVC 经验的开发人员都可以对此发表评论吗?
【问题讨论】:
-
拥有一个名为
notified的用户属性不会更容易吗?它似乎可以满足您的需求。 -
不...这是用于根据用户的设置(电子邮件、短信等)向用户发送通知。我在问将实际发送通知的方法放置在哪里。此方法会将通知保存在数据库中(
Notification模型,出于历史目的),根据自己的喜好决定如何发送,然后发送。用户没有“通知”状态。我可以向用户发送 1000 条通知。 -
啊,我明白了。在那种情况下,你的想法听起来很合理。将该方法放在 NotificationHelper 中,并使助手在应用程序级别可用。这样,您不必在每个控制器中单独包含 NotificationHelper。
-
这可行,但实际上是我试图避免的。我宁愿将此逻辑放在模型中(用户或通知)。我在问这是否是一个“可接受的”解决方案。我提出疑问的原因是我听到了关于模型在 MVC 结构中的作用的不同观点。我个人认为模型方法更好,但其他人(与我一起工作的一些人)不同意。我希望比我自己更有经验的人的意见(希望)支持我。
标签: ruby-on-rails model-view-controller model