【问题标题】:Access model-specific constants in a Rails view在 Rails 视图中访问特定于模型的常量
【发布时间】:2013-07-02 20:42:25
【问题描述】:

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

【问题讨论】:

  • 在这种情况下,我建议您使用哈希作为常量。为什么?因为它会减少模型中不同常数的数量。类似:STATUSES = { suggested: 0, approved: 1, open: 2, etc: .. } 并像 Challenge::STATUSES.approved 一样访问它

标签: ruby-on-rails ruby constants


【解决方案1】:

您应该按以下方式访问它们:

Challenge::CLOSED

由于您的CLOSED 常量是在一个类中定义的,因此您需要使用范围解析运算符来访问该常量。所以如果你的观点你会像这样检查它:

# challenge/_details.html.erb
<% if @challenge.status == Challenge::CLOSED %>
  Challenge is closed, broheim!
<% end %>

【讨论】:

  • 考虑到我的 if 语句已经引用了 @challenge 变量,这有点多余。有没有办法做到这样语义化,读起来像英语?
  • 嘿thanx 这对我很有用。
【解决方案2】:

编写这种语句是一个非常糟糕的主意:您的对象必须处理它自己的逻辑。 想象一下,如果有一天您决定合并状态,您会更改代码库中的每个条件吗?不,您应该使用一种处理逻辑的方法。

我会做以下事情:

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

【讨论】:

  • 看起来不太语义化。开源项目模型中的代码量也相当令人困惑。也许您可以详细说明为什么@MrYoshiji 的想法如此糟糕?
  • 创建有意义的方法没什么大不了的,这比将内部逻辑放在模型之外要好得多。顺便说一句,@MrYoshiji 的想法很好。
  • 顺便说一句,它怎么可能比@challenge.closed?更具语义?
  • 就语义而言,我指的是代码实现。我希望人们看看挑战模型并理解它的每一个部分,与@MrYoshiji 的想法相比,你的想法有太多的认知开销,但我很欣赏你的回应!
  • 我坚持,但是将模型的逻辑传播到它的类之外是一个非常糟糕的主意,这与 OOP 基础知识背道而驰..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多