Подтвердить что ты не робот

Доступ к параметрам, зависящим от модели, в представлении 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)

4b9b3361

Ответ 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? %>