RahulOnRails
RahulOnRails

Reputation: 6542

ROR + Access Constant in Controller and Define in Config/initializer/constant.rb

Here in my project I want to use constant in place of simple string. For this, I have define color constant in config/initiailizer/constant.rb file. Here is the code ::

RED = "red"
GREEN = "green"
STALE = "stale"
YELLOW = "yellow"

Now I want to access this constant in one of my controller so, how can access this. I tried a lot to search something at Google but could not get any success. Please have a look.

Upvotes: 0

Views: 2923

Answers (2)

jafrog
jafrog

Reputation: 406

If you're using Rails 3, you can store constants in your constant.rb file like this:

AppName::Application.config.YELLOW = "yellow"

And access them from everywhere (controllers, models, etc) the same way:

AppName::Application.config.YELLOW

And if you need to store some environment-specific constants, you can create a YML-file in config/config.yml with contents like:

development:
  yellow: "yellow"

production:
  yellow: "green"

and replace your YELLOW constant with this:

AppName::Application.config.COLOR = YAML.load_file("#{Rails.root}/config/config.yml")[Rails.env]

and access your environment-specific COLOR constant like this:

AppName::Application.config.COLOR[:yellow]

Upvotes: 4

coreyward
coreyward

Reputation: 80041

If you're literally just storing constants that point to strings of the same name, you should really just be using symbols. They are better on memory, and you aren't forcing this awkward pseudo-enterprise requirement into Rails.

So rather than using something like this:

class MyController < ApplicationController
  def show
    @background_color = ::GREEN
  end
end

You could use a symbol:

class MyController < ApplicationController
  def show
    @background_color = :green
  end
end

Also, if you insist on defining a bunch of related color-constants, you should really avoid polluting the global scope with them and instead encase them in a module:

module Colors
  GREEN = 'green'
  BLUE = 'blue'
  ...
end

And then access them (from within another class/module defined inside another [such as a controller]):

puts "I'm #{::Colors::BLUE}, like him, inside and outside."

Or if you'll be using them in another class/module frequently:

class Eiffel65
  include ::Colors

  def house_color
    BLUE
  end
end

Make sense?

Upvotes: 2

Related Questions