新手问题 在 Rails 的 controller 里面调用 rake task 不成功

blacktulip · 2013年08月27日 · 最后由 zhangyanan 回复于 2014年02月12日 · 5099 次阅读

我在一个 controller 的 #create 方法里面调用一个 rake task,是想在每建立一行记录的同时运行一个 task。假设这个 task 叫 agent:test

使用代码如下:

# 文件: lib/tasks/agent.rake

namespace :agent do
  desc 'test'
  task :test => :environment do
    puts "aaaaaaa"
    puts "aaaaaaa"
    puts "aaaaaaa"
  end
end
# 文件:  app/controller/agents_controller.rb

require 'rake'
class AgentsController < ApplicationController

  # 略去一些 actions

  def create
    @agent = current_user.agents.build(agent_params)
    if @agent.save
      Rake::Task['agent:test'].invoke  # 此处调用 rake task
      flash[:success] = "Agent sent!"
      redirect_to current_user
    else
      flash.now[:error] = "Oops, something is wrong."
      render 'new'
    end
  end
end

使用 rails server 或者 bundle exec rails server 启动服务器,然后通过网页创建一个 agent 的时候,agent:test 并没有被执行,服务器 log 输出:

RuntimeError: Don't know how to build task 'agent:test'

然后我尝试在 rails console 中运行:

Rake::Task['agent:test'].invoke

输出同样的错误信息。

我打开 Rails 缺省的 Rakefile 看了看,里面是这样的

# 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__)

Agent::Application.load_tasks

看这顶上两行注释,lib/tasks 下面的 .rake 文件应该是能直接用才对,不知道为什么......

请问我是不是做错了什么?...

rake task 是构建/编译程序用的,不是程序的一部分,rails server 不载入 .rake 文件

#1 楼 @luikore 额,那就是说那个 Rake::Task#invoke 其实只是用在 rake task 里 call 另外一个 rake task 用的么...

#2 楼 @blacktulip 从来没这么搞过,不知道... 直接 system 'rake agent:test' 应该是可以的

rake 是 make 的替代品,而一般程序不会自己去调用 make 吧...

#1 楼 @luikore 话说我在 config/environment.rb 里面加了一行 Agent::Application.load_tasks 就能调用了。你觉得这是可以接受的 practice 不...

把 agent 的代码丢到 lib 下面,rake 任务和业务代码里去调用。

#4 楼 @blacktulip 不推荐 server 程序载入 rake, 另外你这个 task 到底是干什么的?如果是 server 用的代码,改成一个方法放到 lib 里就可以了

#5 楼 @kenshin54 #6 楼 @luikore

谢谢,这个 task 是根据 agent 的参数写 whenever 的 schedule 文件,然后 update crontab ...

#1 楼 @luikore #7 楼 @blacktulip

哈哈,当年曾把 ant 这样用,

这个,呃,信赖方向有点反了。

resque/sideqik 吧

刚好解决我的问题~

#7 楼 @blacktulip 话说能不能总结一下,到底你这么做合适吗?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号