2017-01-04 2 views
2

В моем приложении rails у меня есть модель под названием JobPosting. Задание проводок имеет статус, это может быть:Отображение состояния в представлении - Rails

  1. Ждущих утверждениям
  2. Проект
  3. Open
  4. Интервью Назначенных
  5. Закрытого

Я реализовал эти статусы, используя ActiveRecord::Enum как так:

class JobPosting < ApplicationRecord 
    enum status: [:waiting_approval, :draft, :open, :interviews_scheduled, :closed] 
end 

Теперь я хотел бы отобразить другой элемент пользовательского интерфейса, который зависит от статуса публикации задания. т.е.

Для статуса утверждения ожидания Я хочу:

<div class="label label-warning">pending approval</div> 

И для открытого состояния Я хочу:

<div class="label label-success">open</div> 

Обратите внимание, что есть другой текст и класс отличается как элемент стиль для разных случаев. В моей index.html.erb, где этот стиль должен произойти, я мог бы просто сделать кучу встроенного рубина, если заявления и проверить состояние проводки и отображение нужного элемента, например, так:

<% if posting.waiting_approval? %> 
     <div class="label label-warning">pending approval</div> 
<% elsif posting.open? %> 
     <div class="label label-success">open</div> 
<% elsif posting.closed> %> 
     etc... 
<% end %> 

I чувствую, что это не очень СУХОЙ, есть ли лучший способ?

В качестве альтернативы, я мог бы создать частичный и сохранить в нем логику и просто отринуть частичную, но опять же, как это делается?

+0

Вы можете написать функцию, которая генерирует контент на основе значения перечисления – akash93

+0

Что я обычно делаю с этим, это сделать статус частью класса, а затем написать css для присоединения к классу. Итак, label-draft, будет классом со стилями, которые вы хотите на нем, а затем в представлении только одна строка, «label - <% = posting.status%>» применит класс и стили, которые вы хотите. –

+0

@RockwellRice, это хорошая идея, мне очень нравится эта реализация, хотя единственное, что мне не нравится, это то, что мне пришлось бы скомпрометировать мои имена статусов для имен классов CSS, которые более широко использовались в моем приложении. оправдать их изменение. В результате для ясности я предпочел бы сохранить имена статусов так, как они есть, а также не изменять классы CSS. –

ответ

2

Если у вас нет декораторы, я бы просто создал простой помощник

def status_label(posting) 
    case posting.status 
    when :waiting_approval 
    content_tag(:div, 'pending approval', class: 'label label-warning') 
    when :draft 
    ... 
end 
+0

Я бы изменил его так, чтобы вы могли передать блок для текста или использовать модуль I18n. – max

3

Я хотел бы сделать что-то вроде этого:

class JobPosting < ApplicationRecord 
    enum status: [:waiting_approval, :draft, :open, :interviews_scheduled, :closed] 

    def status_label 
    { 
     'waiting_approval' => 'pending approval', 
     'open' => 'open', 
     'interviews_scheduled' => 'interview is scheduled', 
     'closed' => 'closed', 
     'draft' => 'draft' 
    }[self.status] 
    end 
end 

затем в представлении:

<div class="label <%= posting.status %>"><%= posting.status_label %></div> 

Поскольку в Rails у нас есть sass, вы можете наследовать свойства других классов css:

.waiting_approval{ 
    @extend .label-warning; 
    // customize this css class if needed. 
} 

// and so on.. 
+0

Это отличное решение, единственное, чего я устал, это положить такую ​​логику в класс модели, я предпочитаю, чтобы вся бизнес-логика была в контроллере, вот почему я иду с другим ответом , хотя оба работают нормально! Спасибо за помощь! –