29

Rails 4 を実行しています。

というモデルがあり、データベースに各課題の を 0 ~ 4 の単位でChallenge保存しています。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変数が存在する場所ならどこでも)

4

2 に答える 2

58

次のようにアクセスする必要があります。

Challenge::CLOSED

CLOSED定数はクラス内で定義されているため、スコープ解決演算子を使用して定数にアクセスする必要があります。したがって、ビューの場合は次のようにチェックします。

# challenge/_details.html.erb
<% if @challenge.status == Challenge::CLOSED %>
  Challenge is closed, broheim!
<% end %>
于 2013-07-04T19:35:11.870 に答える
9

この種のステートメントをコーディングするのは本当に悪い考えです。オブジェクトはそれ自身のロジックを処理する必要があります。いつかステータスをマージすることにした場合、コードベースのすべての条件を変更しますか? いいえ、ロジックを処理する 1 つのメソッドを使用する必要があります。

私は次のことをします:

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? %>
于 2013-07-04T19:59:28.177 に答える