Доступ к параметрам, зависящим от модели, в представлении 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
)
Ответы
Ответ 1
Вы должны получить к ним доступ следующим образом:
Challenge::CLOSED
Поскольку ваша константа CLOSED
определена внутри класса, вам нужно получить доступ к константе с помощью оператора разрешения области. Поэтому, если вы посмотрите на это, выполните следующие действия:
# challenge/_details.html.erb
<% if @challenge.status == Challenge::CLOSED %>
Challenge is closed, broheim!
<% end %>
Ответ 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? %>