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

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)


apn*_*ing 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
Run Code Online (Sandbox Code Playgroud)

然后在你看来:

<% if @challenge.closed? %>
Run Code Online (Sandbox Code Playgroud)

  • 如果方法有意义,那么创建方法并不是什么大问题,比将内部逻辑放在模型之外要好得多.@MrYoshiji的想法很顺便. (2认同)