在我的rails应用程序中,我有一个名为JobPosting的模型。职位发布具有状态,可以是:
我使用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并将逻辑存储在那里并只渲染部分,但又是如何完成的?
答案 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