Access model-specific constants in a Rails view
Solution 1
You should access them as following:
Challenge::CLOSED
Since your CLOSED
constant is defined within a class, you need to access the constant using the scope resolution operator. So if your view you would check it like:
# challenge/_details.html.erb
<% if @challenge.status == Challenge::CLOSED %>
Challenge is closed, broheim!
<% end %>
Solution 2
It's a really bad idea to code this kind of statements: your object must handle it's own logic. Imagine if someday you decide to merge status, would you change every conditional in your codebase? No, you should use one method which handles the logic.
I'd do the following:
class Challenge < ActiveRecord::Base
SUGGESTED = 0
APPROVED = 1
OPEN = 2
VOTING = 3
CLOSED = 4
#defines:
# - suggested?
# - approved?
# - ...
%w(suggested approved open voting closed).each do |state|
define_method "#{state}?" do
status == self.class.const_get(state.upcase)
end
end
#if you prefer clarity, define each method:
def suggested?
status == SUGGESTED
end
#etc...
end
Then in your view:
<% if @challenge.closed? %>
alt
Updated on September 11, 2020Comments
-
alt over 3 years
I'm running Rails 4.
I have a model called
Challenge
, and in my database I'm storing thestatus
of each challenge in terms of 0-4.But 0-4 isn't very semantic so I want to define a few variables (I'm assuming a constants) so that in any controller or view I can access the number by calling the constant:
# Challenge.rb class Challenge < ActiveRecord::Base SUGGESTED = 0 APPROVED = 1 OPEN = 2 VOTING = 3 CLOSED = 4 end
I want to access these in my view:
# challenge/_details.html.erb <% if @challenge.status == CLOSED %> Challenge is closed, broheim! <% end %>
But my view doesn't want to render.
uninitialized constant ActionView::CompiledTemplates::CLOSED
What's the best way to set my status variables so that they may be accessed everywhere I need them? (i.e, anywhere the
@challenge
variable is present)