2016-03-07 82 views
0

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

rails r -e production record_usage.rb 

我的问题定期运行,它是:在利益“干”我可以直接从'record_usage.rb'中调用控制器方法,而不是在.rb文件中保存record_usage代码的单独副本?

+0

听起来像违反了“单一责任”......任何原因你不能将该方法提取到单独的帮助程序/库/模型并从那里使用它?如果不围绕请求假设来解决可能出现的问题(取决于您的控制器实际制定的假设),您无法轻松完成此任务。 – PinnyM

+0

您可能想要使用[sidekiq](https://github.com/mperham/sidekiq)或[delayed_job](https://github.com/collectiveidea/delayed_job)之类的内容。此外,你可以将你的代码包装在一个类中;一个模型(没有ActiveRecord)应该没问题。 – rdupz

回答

2

除非你想要7年的运气不佳和MVC神的愤怒,否则你不会在外部调用控制器方法!

控制器的公共API是响应HTTP请求的操作。其他一切应该是一种私人方法。

请记住,MVC中控制器的角色是一个接受请求并返回响应的类。因此它不是推动所有这些小公用事业的地方。

事实上,如果你想从你的控制器外部调用一些非常强烈的信号,表明你的控制器是fat,并且你应该通过将业务逻辑移入模型层来重构。

ASLO使用一种称为服务对象单一目的的对象是清理控制器,巧合的是使其本身很好地耙任务和单元测试的好方法:

module CleanupService 
    def self.call(foo) 
    foo.dot_the_is 
    foo.cross_the_ts 
    end 
end 

并非一切都在MVC已经是一个模型,视图或控制器。那只是骨干。

相关问题