2012-07-26 71 views
0

我有一个耙子任务,每隔几个小时就会更改首页上的数据。我已经测试过了,它在开发中可以正常工作。但它在生产中不起作用。我需要做些什么才能获得我想要看到的更改?我应该添加一个重新启动服务器的命令吗?这会使服务器确认更改吗?有没有更聪明的方法来做到这一点?Rake任务在开发中工作,但不在生产中

耙子任务如下。它将由heroku的调度程序添加运行,所以它现在位于lib/tasks/scheduler.rake文件中。

desc 'changes the meta tags' 
task :mixup_meta_tags => :environment do 
    regex = /@meta_tag/ 
    file = File.open('app/controllers/site_controller.rb', 'r') 
    lines = [] 
    file.each_line do |line| 
    (line =~ regex) ? (lines << replace_line(line)) : (lines << line) 
    end 
    file.close 
    file = File.open('app/controllers/site_controller.rb', 'w') 
    lines.each{|line| file.write line} 
    file.close 
end 

def replace_line(line) 
    meta_tags = MetaTag.all.map { |tag| tag["tag"] } 
    new_tag = meta_tags.sample(1)[0] 
    line = " @meta_tag = \"#{new_tag}\" \n" # added the newline 
end 
+0

更确切地说...首先发布你的rake任务代码,以及如何运行它。您不应该重新启动服务器来运行任务。 – 2012-07-26 11:56:23

+0

没问题。刚添加rake任务发布。 – 2012-07-26 12:39:58

回答

1

是的,对生产中Rails应用程序的更改需要重新启动才能被服务器接收。为了让这个工作在飞行中,你可能想尝试在这篇文章中提到的解决方案why-does-code-need-to-be-reloaded-in-rails-3

+0

据我了解,拥有':environment'可以让任务在任何环境下运行,而如果我有':production',则只能用于生产环境。 – 2012-07-26 14:44:27

+0

:环境加载任务的当前Rails环境。所以'rake mix_up_meta_tags RAILS_ENV = production'会加载生产环境,'rake mix_up_meta_tags'会加载开发,因为它是默认的。 – rant 2012-07-26 15:49:34

+0

为了澄清,我的意思是在开发过程中控制器的变化立即得到应用,所以当你运行你的任务并且它改变你的site_controller时,你不必重新启动服务器。但是,在生产中,您需要重新启动服务器以获取对site_controller的更改。 – rant 2012-07-26 16:02:06

相关问题