如何在rake任务中获取Rails应用程序名称?

时间:2011-08-13 20:59:36

标签: ruby-on-rails ruby-on-rails-3

我正在尝试编写Rails 3 rake任务来生成config/initializers/secret_token.rb。我想拉取应用程序的名称而不是在rake任务中对其进行硬编码,但@app_name尚未填充,ENV['APP_NAME']也不是。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

除{{1}}为空之外,一切正常。如何在此处检索应用程序名称?

2 个答案:

答案 0 :(得分:15)

您需要在rake任务中使用环境。然后,您可以使用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

答案 1 :(得分:4)

当您执行“rails new your-app-name”时拼写的Rails应用程序的名称

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

即使在部署期间重命名app目录,这也非常可靠,并且您不必猜测如何从Class name获取“rails new”期间使用的正确拼写。< / p>

使用它,你可以这样做:

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

Rails.application.name
=> 'test-app'