web-dev-qa-db-ja.com

Railsビューでモデル固有の定数にアクセスする

実行中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

私の見解ではこれらにアクセスしたい:

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

しかし、私のビューはレンダリングしたくありません。

uninitialized constant ActionView::CompiledTemplates::CLOSED

ステータス変数を設定して、必要な場所からアクセスできるようにする最良の方法は何ですか? (つまり、どこでも@challenge変数が存在します)

26
alt

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

Challenge::CLOSED

CLOSED定数はクラス内で定義されているため、スコープ解決演算子を使用して定数にアクセスする必要があります。だからあなたの見解ならあなたはそれを次のようにチェックするでしょう:

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

この種のステートメントをコーディングするのは本当に悪い考えです。オブジェクトはそれ自体のロジックを処理する必要があります。いつかステータスをマージすることにした場合、コードベースのすべての条件を変更しますか?いいえ、ロジックを処理する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? %>
9
apneadiving