可以用跑步者运行Rails控制器方法吗?

时间:2016-03-07 18:42:56

标签: ruby-on-rails

假设我有一个Rails 4应用程序,它跟踪一个设备中的使用计数器,因此我的控制器有一个方法record_usage,可以从视图中交互式调用,以立即检索和记录使用计数器。但是,我也想定期运行相同的方法,所以我将代码提取到一个独立的.rb文件中并通过cron定期运行

rails r -e production record_usage.rb

我的问题是:为了“DRY”的利益,我可以直接从'record_usage.rb'中调用控制器方法,而不是在.rb文件中维护record_usage代码的单独副本吗?

1 个答案:

答案 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中的所有内容都必须是模型,视图或控制器。那只是骨干。