在Rails视图中访问特定于模型的常量

时间:2013-07-04 19:33:13

标签: ruby-on-rails ruby constants

我正在运行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变量存在的任何地方)

2 个答案:

答案 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? %>