我正在运行Rails 4。
我有一个名为Challenge
的模型,在我的数据库中,我以0-4的方式存储每个挑战的status
。
但是0-4不是非常语义所以我想定义一些变量(我假设一个常量),这样在任何控制器或视图中我都可以通过调用常量来访问该数字:
# Challenge.rb
class Challenge < ActiveRecord::Base
SUGGESTED = 0
APPROVED = 1
OPEN = 2
VOTING = 3
CLOSED = 4
end
我想在我看来访问这些内容:
# challenge/_details.html.erb
<% if @challenge.status == CLOSED %>
Challenge is closed, broheim!
<% end %>
但我的观点不想呈现。
uninitialized constant ActionView::CompiledTemplates::CLOSED
设置状态变量的最佳方法是什么,以便可以在我需要的任何地方访问它们? (即@challenge
变量存在的任何地方)
答案 0 :(得分:46)
您应该按以下方式访问它们:
Challenge::CLOSED
由于您的CLOSED
常量是在类中定义的,因此您需要使用范围解析运算符来访问常量。所以,如果你的观点,你会检查它:
# challenge/_details.html.erb
<% if @challenge.status == Challenge::CLOSED %>
Challenge is closed, broheim!
<% end %>
答案 1 :(得分:9)
编写这种语句是一个非常糟糕的主意:你的对象必须处理它自己的逻辑。 想象一下,如果有一天你决定合并状态,你会改变代码库中的每个条件吗?不,你应该使用一种处理逻辑的方法。
我会做以下事情:
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
然后在你看来:
<% if @challenge.closed? %>