假设我有一个Rails 4应用程序,它跟踪一个设备中的使用计数器,因此我的控制器有一个方法record_usage,可以从视图中交互式调用,以立即检索和记录使用计数器。但是,我也想定期运行相同的方法,所以我将代码提取到一个独立的.rb文件中并通过cron定期运行
rails r -e production record_usage.rb
我的问题是:为了“DRY”的利益,我可以直接从'record_usage.rb'中调用控制器方法,而不是在.rb文件中维护record_usage代码的单独副本吗?
答案 0 :(得分:2)
你不要在外部调用控制器方法,除非你想要七年的厄运和MVC众神的愤怒!
控制器的公共API是响应HTTP请求的操作。其他一切都应该是私人方法。
请记住,控制器在MVC中的角色是一个接收请求并返回响应的类。因此,它不是推动所有这些小公用事业的地方。
事实上,如果你想从你的控制器外部调用一些非常强烈的信号,你的控制器是胖,你应该通过将业务逻辑移动到模型层来重构。
Aslo使用称为服务对象的单一用途对象是一种清理控制器的好方法,这些控制器非常适合于rake任务和单元测试:
module CleanupService
def self.call(foo)
foo.dot_the_is
foo.cross_the_ts
end
end
并非MVC中的所有内容都必须是模型,视图或控制器。那只是骨干。