実行中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
変数が存在します)
次のようにそれらにアクセスする必要があります。
Challenge::CLOSED
CLOSED
定数はクラス内で定義されているため、スコープ解決演算子を使用して定数にアクセスする必要があります。だからあなたの見解ならあなたはそれを次のようにチェックするでしょう:
# challenge/_details.html.erb
<% if @challenge.status == Challenge::CLOSED %>
Challenge is closed, broheim!
<% end %>
この種のステートメントをコーディングするのは本当に悪い考えです。オブジェクトはそれ自体のロジックを処理する必要があります。いつかステータスをマージすることにした場合、コードベースのすべての条件を変更しますか?いいえ、ロジックを処理する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? %>