[RUBY-ON-RAILS] 어떻게 레이크 작업에 RAILS_ENV를 강요하는 걸까?
RUBY-ON-RAILS어떻게 레이크 작업에 RAILS_ENV를 강요하는 걸까?
나는이 작은 레이크 작업이 :
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 내가 하드 코드로 시도 무시합니다. 예상대로 나는이 작업을 작업을 어떻게해야합니까
해결법
-
==============================
1.이 특정 작업을 위해, 당신은 단지 아담 지적 그래서, 당신은이 작업을 수행 할 수 있으며, DB 연결을 변경해야합니다 :
이 특정 작업을 위해, 당신은 단지 아담 지적 그래서, 당신은이 작업을 수행 할 수 있으며, DB 연결을 변경해야합니다 :
namespace :db do namespace :test do task :reset do ActiveRecord::Base.establish_connection('test') Rake::Task['db:drop'].invoke Rake::Task['db:create'].invoke Rake::Task['db:migrate'].invoke ActiveRecord::Base.establish_connection(ENV['RAILS_ENV']) #Make sure you don't have side-effects! end end end
당신의 작업이 더 복잡, 당신은 ENV의 다른 측면을해야 할 경우, 당신은 새로운 레이크 프로세스를 생성 안전한 있습니다 :
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
-
==============================
2.레일 3, 당신은 사용해야합니다
레일 3, 당신은 사용해야합니다
Rails.env = "test" Rake::Task["db:drop"].invoke
대신에
RAILS_ENV = "test" Rake::Task["db:drop"].invoke
-
==============================
3.또 다른 옵션은 ENV를 확인하고 계속하기를 거부하는 것입니다 :
또 다른 옵션은 ENV를 확인하고 계속하기를 거부하는 것입니다 :
unless Rails.env.development? puts "This task can only be run in development environment" exit end
또는 정말 계속할 것인지 물어 :
unless Rails.env.development? puts "You are using #{Rails.env} environment, are you sure? y/n" continue = STDIN.gets.chomp exit unless continue == 'y' end
-
==============================
4.깨끗하고 간단한 솔루션 RAILS_ENV 다시 정의하는 것 (ENV를하지 [ 'RAILS_ENV'])
깨끗하고 간단한 솔루션 RAILS_ENV 다시 정의하는 것 (ENV를하지 [ 'RAILS_ENV'])
namespace :db do namespace :test do task :reset do RAILS_ENV = "test" Rake::Task['db:drop'].invoke Rake::Task['db:create'].invoke Rake::Task['db:migrate'].invoke end end end
다음과 같이 레일 응용 프로그램의 부팅 과정에서 RAILS_ENV 초기화됩니다
RAILS_ENV = (ENV['RAILS_ENV'] || 'development').dup unless defined?(RAILS_ENV)
레일 코드의 나머지 부분은 직접 RAILS_ENV를 사용합니다.
마이클은 그의 대답에 코멘트에 지적 그러나, 즉석에서 RAILS_ENV 전환하는 것은 위험 할 수 있습니다. 또 다른 방법은 데이터베이스 연결을 전환하는 것,이 솔루션은 사실의 기본 DB에서 사용되는 : 테스트 작업을
ActiveRecord::Base.establish_connection(:test)
-
==============================
5.물론 가장 좋은 방법은 당신이 레이크 작업을 실행 명령 줄에서 환경을 지정하는 것입니다,하지만 당신이 원하는 게 아니에요 어떤 이유로, 당신은이 작업을 수행 할 수 있습니다 :
물론 가장 좋은 방법은 당신이 레이크 작업을 실행 명령 줄에서 환경을 지정하는 것입니다,하지만 당신이 원하는 게 아니에요 어떤 이유로, 당신은이 작업을 수행 할 수 있습니다 :
ENV["RAILS_ENV"] = 'test' RAILS_ENV.replace('test') if defined?(RAILS_ENV) load "#{RAILS_ROOT}/config/environment.rb"
그리고 그 트릭을 할해야합니다.
-
==============================
6.database_tasks.rb에서 이상한 코드가있다 :
database_tasks.rb에서 이상한 코드가있다 :
def each_current_configuration(environment) environments = [environment] environments << 'test' if environment == 'development' configurations = ActiveRecord::Base.configurations.values_at(*environments) configurations.compact.each do |configuration| yield configuration unless configuration['database'].blank? end end
ENV 개발의 경우 항상 테스트를 추가합니다. 동시 개발 및 첫 번째 개발을 실행하여 테스트 및 테스트 초 동안 작업을 다시 : 나는 정의 DB를 수행하고자하는 경우를 해결했다. 또한, 작업을 실행하기 전에, 내가 액티브 :: 작업을 설정해야합니다 내 set_env 방법 :: DatabaseTasks.env이없는 전화, 데이터베이스 연결은 예상대로 환경에 몰래 처리하지 못하는 것 같습니다. 나는 분리 등의 다른 모든 종류의 시도했지만이 추가 코드없이 일했다.
def set_env(env) Rails.env = env.to_s ENV['RAILS_ENV'] = env.to_s ActiveRecord::Tasks::DatabaseTasks.env = env.to_s end
재 구축 및 DB : 다음은 동시 다중 환경 데시벨 내 전체 db.rake 파일의 요점은 잘라야
from https://stackoverflow.com/questions/1090176/how-do-i-force-rails-env-in-a-rake-task by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 레일 클립 및 승객` '확인'command`에서 인식되지 않습니다 (0) | 2020.02.14 |
---|---|
[RUBY-ON-RAILS] 루비 온 레일즈에 has_many 항목의 수의 유효성을 검사합니다 (0) | 2020.02.14 |
[RUBY-ON-RAILS] 레일 3 개 양식을 제출에서 제거 "UTF8 = ✓" (0) | 2020.02.14 |
[RUBY-ON-RAILS] 어떻게 액티브 콜백을 건너 뛰려면? [복제] (0) | 2020.02.14 |
[RUBY-ON-RAILS] 고안 비밀 키가 설정되지 않았습니다 (0) | 2020.02.14 |