2

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?

2 Answers 2

2

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

Sign up to request clarification or add additional context in comments.

2 Comments

Where should I add this code? I didn't find before_configuration in config/application.rb
1

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.