ruby-on-rails 在Rails视图中访问特定于模型的常量

baubqpgj  于 2022-12-24  发布在  Ruby
关注(0)|答案(3)|浏览(170)

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

ia2d9nvy

ia2d9nvy1#

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

Challenge::CLOSED

由于CLOSED常量是在类中定义的,因此需要使用作用域解析操作符来访问常量。因此,如果您的视图是这样的:

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

u0njafvf2#

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

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

oknwwptz3#

我强烈建议您使用枚举,如果您要求枚举特定的值,那么使用Rails 4.1中引入的枚举。

class Challenge < ActiveRecord
  enum status: {
    suggested: 0
    approved: 1
    open: 2
    voting: 3
    closed: 4
  }
end

之后,您可以使用以下方法:

Challenge.first.suggested? # For checking
Challange.first.open! # For change the status
Challange.open # Get all challanges with "open" status

要使用枚举,必须声明一个具有枚举名的整数列(即:“状态”)的“挑战”(或哪个表与型号相关)表中。
有关枚举的更多信息

相关问题