2012-08-28 14 views
17

Raylarım uygulamasında, tarayıcının, config/initializers numaralı telefondan bir ray başlatıcıda kullandığı kimlik doğrulama bilgilerini yükleyen bir web sitesi tarayıcısı vardır. Başlatıcı, SiteLogin modelinde bir model yöntemi çağırarak kimlik doğrulamasını yükler.Bir rake görevi yürütürken Rails başlatıcısının yüklenmesini nasıl atlayabilirim?

SiteLogin model tablosunu oluşturmak için rake db:migrate'u çalıştırdığımda, başlatıcı veritabanı tablosunun zaten var olmasını beklediğinden başarısız olur. Sadece başlatıcıdaki kodu yorumlayabilirim, tabloyu oluşturmak için geçişi çalıştırın, sonra başlatıcı kodunu kaldırın ve sorun hakkında endişelenmeyin.

Sorun şu ki, dağıtmak için Capistrano kullanıyorum ve bu, ilk önce, başlatıcı kodu olmadan geçişi çalıştırmadan önce dağıtıcıyı çalıştırmak ve sonra başlatıcı koduyla yeniden dağıtmak zorunda olduğum anlamına gelir. Bunu yapmanın daha iyi bir yolu var mı yoksa bu yaklaşım benim yaklaşımım tamamen yanlış mı?

İşte daha iyi davamı açıklamak için biraz kod örneği verilmiştir:

# config/initializers/site_crawler_init.rb 
SiteCrawler.setup do |config| 
    config.hostname = "www.example.com" 
end 

# model/site_crawler.rb 
class SiteCrawler 
    ... 
    class << self 
    attr_accessor :configuration 

    def setup 
     self.configuration ||= Configuration.new 
     yield(configuration) 
    end 
    end 

    class Configuration 

    attr_accessor :hostname, :login_credentials 

    def initialize 
     @login_credentials = SiteLogin.admin_user 
     ... 
    end 
    end 
end 

cevap

18

Onun belki de daha iyi bir çözüm, ancak tablo varsa kontrol edebilirsiniz: onun genellikle yeterli

if ActiveRecord::Base.connection.tables.include?('your_table_name') 
    # your code goes here 
end 

Ama çünkü bekleyen taşıma işlemleri olabilir. Şimdi

, bir tırmık görev çekiyorsa istediğin kontrol edebilir:

if ActiveRecord::Base.connection.tables.include?('your_table_name') and !defined?(::Rake) 
    # your code goes here 
end 

Ve bu yeterli değil hala olabilir testleri başlatırken, bir tırmık görev var yürütülür çünkü, bu yüzden de olabilir Rails ortamının test olup olmadığını kontrol edin (Rails.env.test?).

8

Belirli bir başlatıcıyı çalıştırırken, belirli bir başlatıcıyı (gecikmeli iş için, gecikmeli bir işin var olmasını gerektiren) belirli bir komisyon görevini çalıştırırken atladığım benzer bir sorunla karşılaştım - bu durumda db: migrate. Sonra

def running_tasks 
    @running_tasks ||= Rake.application.top_level_tasks 
end 

def is_running_migration? 
    running_tasks.include?("db:migrate") 
end 

Ve sorunlu Başlatıcı aşağıdaki:

unless defined?(is_running_migration?) && is_running_migration? 
    ... do whatever 
end 

benim Rakefile için aşağıdaki eklendi
İlgili konular