之前写了一篇博客, 在rails中可以使用rake在后台执行特性任务
关于后台执行rake任务,再补充一点,有些时候,rake任务需要从页面获取表单元素,作为rake的参数来执行
namespace "autotest" do desc "puts user's name by say" task :say, [:first_name, :last_name] do |t, args| puts "First name is #{args.first_name}" puts "Last name is #{args.last_name}" end end
这个rake任务,可以看做一个函数,:say是函数名, [:first_name, :last_name]可以看做是参数
在命令行中执行 rake autotest:say["hello","world"],可以看到rake通过args获取到了参数
再举个例子:
比如:iteye中有个功能叫:做电子书, 执行的时候,它会立即返回一个提示:电子书正在生成,大概需要30分钟,稍后会发送站内信通知, 这样一个功能就可以用rake来做
简单的模拟一下:在表单中发送文件名,然后调用rake,来创建这样一个文件,为了模拟电子书的制作,可以再rake中sleep一会, 但是页面不会停,而是立即返回一个提示, 文件正在创建,请稍后。。
控制中,获取表单提交的文件名(这里写死),然后调用rake create_file
class HomeController < ApplicationController def index file_name = "test.txt" system "start rake create_file['#{file_name}']" end end
在rake任务中sleep 10秒,可以想象成做电子书的过程,最后杀死start开启的命令行,因为我不知道怎么关了它
desc "create file in F:\\" task :create_file, [:file_name] do |t, args| sleep 10 File.open("F:\\#{args.file_name}", "w") system "Taskkill /F /IM cmd.exe" end
试图页面比较简单,在index.html.erb文件中
<h2>file create success!</h2>
这样,当我访问index页面时,页面会立即返回文件创建成功的提示,而在后台启动了rake任务,去执行创建文件的操纵
因为rake会自启动一个子进程,而不会影响rails的执行,rake任务执行完成后,可以通过发送邮件的形式来通知用户操纵已完成。
注意:
1. rake代码可直接写在工程根目录下的rakefile文件中,使用rake -T可以查看rake任务是否成功创建
2. rake任务的描述 desc 不能少,否则使用rake -T是检查不到的,命名空间可以根据需要添加
3. 另外rake任务可以放在lib/tasks文件夹下,但是我这里就是看不到,可能我用的是windows的原因吧
#!/usr/bin/env rake # Add your own tasks in files placed in lib/tasks ending in .rake, # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. require File.expand_path('../config/application', __FILE__) TestRake::Application.load_tasks desc "create file in F:\\" task :create_file, [:file_name] do |t, args| sleep 10 File.open("F:\\#{args.file_name}", "w") system "Taskkill /F /IM cmd.exe" end namespace "autotest" do desc "puts user's name by say" task :say, [:first_name, :last_name] do |t, args| puts "First name is #{args.first_name}" puts "Last name is #{args.last_name}" end desc "puts user's name by hello" task :hello, [:first_name, :last_name] do |t, args| puts "First name is #{args.first_name}" puts "Last name is #{args.last_name}" end end
补充一个参数传递的方法,使用ENV
class HomeController < ApplicationController def index file_name = "test.txt" system "start rake c_file name=#{file_name} " end end
desc "create file in F:\\" task :c_file do File.open("F:\\#{ENV["name"]}", "w") system "Taskkill /F /IM cmd.exe" end