在视图中显示状态 - Rails

时间:2017-01-04 13:48:34

标签: ruby-on-rails ruby activerecord active-enum

在我的rails应用程序中,我有一个名为JobPosting的模型。职位发布具有状态,可以是:

  1. 等待批准
  2. 草案
  3. 打开
  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中,这个样式需要发生,我可以做一堆嵌入式ruby if语句并检查发布的状态并显示所需的元素,如下所示:

    <% 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 %>
    

    我觉得好像不是很干,有更好的方法吗?

    或者,我可以创建partial并将逻辑存储在那里并只渲染部分,但又是如何完成的?

2 个答案:

答案 0 :(得分: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中我们可以继承其他css类的属性:

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

// and so on..

答案 1 :(得分:2)

除非你有装饰者,否则我会创建一个简单的帮手

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