2011-08-13 81 views
3

我想寫一個Rails 3 rake任務來產生config/initializers/secret_token.rb。我想拉取應用程序的名稱,而不是在rake任務中對其進行硬編碼,但@app_name尚未填充,也不是ENV['APP_NAME']。這裏的任務代碼:如何在Rake任務中獲取Rails應用程序名稱?

desc "Regenerate the server secret" 
task :generate_secret do 
    include ActiveSupport 
    File.open('config/initializers/secret_token.rb', 'w') do |f| 
     f.puts "#{@app_name}::Application.config.secret_token = '#{SecureRandom.hex(30)}'" 
    end 
end 

它除了@app_name所有的作品是空白。我如何在這裏檢索應用程序名稱?

回答

15

您需要在rake任務中使用環境。然後你可以使用Rails應用程序的Rails.application.class.parent_name

desc "Regenerate the server secret" 
task :generate_secret => :environment do 
    include ActiveSupport 
    File.open('config/initializers/secret_token.rb', 'w') do |f| 
    f.puts "#{Rails.application.class.parent_name}::Application.config.secret_token = '#{SecureRandom.hex(30)}'" 
    end 
end 
+0

當我需要':environment',我得到一個錯誤:「(我的應用程序名)是不是類/模塊」。跟蹤顯示:**調用引導程序:generate_secret(first_time) **調用環境(first_time) **執行環境 rake中止! –

+0

...我不知道爲什麼,因爲我在那個需要':environment'的.rake文件中有另一個任務,並且它工作正常。 –

+0

......現在,在玩弄它之後,突然它可以正常工作。這個魔法裏面有一個gremlin(在運行這些任務時會緩存任何東西嗎?),但它現在似乎正在工作。謝謝你的幫助! –

4

名稱,因爲當你做了一個「軌道新的-APP-名」

app_name = Rails.application.config.session_options[:key].sub(/^_/,'').sub(/_session/,'') 
=> 'your-app-name' 

這工作非常可靠,即使是被拼寫應用程序目錄在部署過程中被重命名,並且您不必猜測如何從「類名」中獲取正確的拼寫,這些拼寫在'rails new'期間使用。

利用這一點,你可以這樣做:

class << Rails.application 
    def name 
    Rails.application.config.session_options[:key].sub(/^_/,'').sub(/_session/,'') 
    end 
end 

Rails.application.name 
=> 'test-app' 
相關問題