我有个小任务:

namespace :db do 
  namespace :test do 
    task :reset do 
      ENV['RAILS_ENV'] = "test" 
      Rake::Task['db:drop'].invoke
      Rake::Task['db:create'].invoke
      Rake::Task['db:migrate'].invoke
    end
  end
end

现在,当我执行时,它将忽略我试图硬编码的RAILS_ENV.我如何使这项任务按预期工作

推荐答案

对于这个特定的任务,您只需要更改DB连接,正如Adam指出的,您可以这样做:

namespace :db do 
  namespace :test do 
    task :reset do 
      ActiveRec或d::Base.establish_connection('test')
      Rake::Task['db:drop'].invoke
      Rake::Task['db:create'].invoke
      Rake::Task['db:migrate'].invoke
      ActiveRec或d::Base.establish_connection(ENV['RAILS_ENV'])  #Make sure you don't have side-effects!
    end
  end
end

如果您的任务更复杂,并且需要ENV的其他方面,那么最安全的做法是生成一个新的rake进程:

namespace :db do 
  namespace :test do 
    task :reset do 
      system("rake db:drop RAILS_ENV=test")
      system("rake db:create RAILS_ENV=test")
      system("rake db:migrate RAILS_ENV=test")
    end
  end
end

namespace :db do 
  namespace :test do 
    task :reset do 
      if (ENV['RAILS_ENV'] == "test")
        Rake::Task['db:drop'].invoke
        Rake::Task['db:create'].invoke
        Rake::Task['db:migrate'].invoke
      else
        system("rake db:test:reset RAILS_ENV=test")
      end
    end
  end
end

Ruby-on-rails相关问答推荐

仅当未在带有ENV[';Dyno';]的Heroku问题上运行时才初始化Sidekiq Cron

本地主机的上衣配置

仅在两个子域间共享Rails cookies,并为所有其他子域使用单独的cookie

将日期时间转换为月、日和年?

Ruby Sinatra Web 服务在 localhost:4567 上运行,但不在 IP 上

Ruby 地理定位Ruby /插件

如何在 Ruby 字符串中返回最后一个斜杠(/)之后的所有内容

如何配置设计以使用自定义邮箱布局?

$redis 全局变量与 ruby​​ on rails

使用devise gem点击确认链接后避免登录?

如何在rails中发回js.haml

更改 form_for rails 3.1 生成的 html 表单 ID

Rails如何对列求和?

奇怪的406 不可接受错误

如何将自定义路由添加到资源路由

未捕获的类型错误:未定义不是函数- 初学者 Backbone.js 应用程序

Rails SQL 正则表达式

为什么 RSpec 在 Rails 下这么慢?

Ruby:如何将一种方法接收到的所有参数和块传递给另一种方法?

设置EDITOR或BUNDLER_EDITOR环境变量