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