user3752649
user3752649

Reputation: 67

How do I have different envirenment variable values in Rails?

This is how I run rails console command:

COMPANY=b2b RAILS_ENV=development DEPLOY_ENV=localhost rails console

Instead I want to run only rails console command by setting these variables internally. How do I do that?

I saw some answers and made the config/company.yml file:

development:
  COMPANY: b2b
  DEPLOY_ENV: localhost

production:
  COMPANY: b2c
  DEPLOY_ENV: xyz.com

And I wrote the following config/initializers/company.rb file:

COMPANY_CONFIG = YAML.load_file("#{::Rails.root}/config/company.yml")[::Rails.env]

How do I access these variables in some helper/controller? I didn't understand how to do that? How do I set these ENV variables after running only rails console or rails server without passing the extra environment variable shown above?

Upvotes: 2

Views: 152

Answers (2)

Roman Kiselenko
Roman Kiselenko

Reputation: 44360

You can't set environment variables in yaml file this difference things. Use dotenv gem for manage environment variables.

Read first Environment Variables

But have dirty hack. You can create ENV variable when rails loaded

add this code to before_configuration in config/application.rb:

config.before_configuration do
  env_file = File.join(Rails.root, 'config', 'company.yml') # Find yml file
  YAML.load(File.open(env_file)).each do |key, value|       # Open file
    ENV[key.to_s] = value                                   # Set value to ENV
  end if File.exists?(env_file)                             # If file exists
end

And now you can access to env variables from yml file anywhere in app.

I do not test this but i think this work. This work.

Some info

Upvotes: 2

MrYoshiji
MrYoshiji

Reputation: 54882

You can create these settings variables in the config/initializers/application.rb file:

company_settings_path = Rails.root.join('config', 'company.yml')

COMPANY_CONFIG = { development: { company: :default, deploy_env: :none_yet } }
COMPANY_CONFIG = YAML::load(File.open(company_settings_path)) if File.exists?(company_settings_path)
COMPANY_CONFIG = COMPANY_CONFIG.with_indifferent_access

And then access them like this:

# controller
def show
  if COMPANY_CONFIG[:company] == 'b2c'
    # your logic
  else
    # other logic
  end
end

You can acces the constant COMPANY_CONFIG everywhere in your app (models, controllers, views, helpers) the same way I used below.

Upvotes: 1

Related Questions