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

Mat*_*ler 3 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
Run Code Online (Sandbox Code Playgroud)

这一切都有效,除了@app_name空白.如何在此处检索应用程序名称?

joh*_*ley 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
Run Code Online (Sandbox Code Playgroud)


Til*_*ilo 5

Rails 应用程序的名称,就像您执行“rails new your-app-name”时拼写的那样

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

这非常可靠,即使应用程序目录在部署期间被重命名,并且您不必猜测如何从类名称获取在“rails new”期间使用的正确拼写。

使用这个,你可以这样做:

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

Rails.application.name
=> 'test-app'
Run Code Online (Sandbox Code Playgroud)