我应该如何从Rails的视图中删除这个逻辑?

时间:2016-01-04 18:33:24

标签: ruby-on-rails ruby-on-rails-4

我有一个带有事件的Rails应用程序,当事件的结束日期已经过去时,我想在event#show个页面上包含一个元素,表明该事件已过期。

现在我在我的view中有这样的逻辑:

<% if @event.end_time <= Time.now %>
  <h4 class="label--warning">This event has already happened</h4>
<% end %>

我理解将逻辑排除在视图之外是好的,我不想从视图中查看数据库,所以我想知道这样做的最佳方法是什么?

2 个答案:

答案 0 :(得分:4)

如果您正在加载@event的页面,那么您已经访问了数据库。因此,视图中的代码不会生成额外的数据库查询。

视图中的逻辑(无论事件是否过期)可以移动到模型中。但是你仍然会在视图中有一些代码。然而,将它移动到模型的好处是可以轻松地为模型类编写测试。

型号:

def is_expired?
  end_time <= Time.now
end

查看:

<% if @event.is_expired? %>
  <h4 class="label--warning">This event has already happened</h4>
<% end %>

答案 1 :(得分:2)

您可以始终使用视图帮助程序,而不是在视图中使用条件逻辑。

=&GT;应用程序/助手/ expired_event.rb

Module ExpiredEvent
    def event_expired?(event)
        if event.end_time <= Time.now
            return "<h4 class="label--warning">This event has already happened</h4>".html_safe
        end
    end
end

然后在你看来

<%= event_expired?(@event) %>

那样的东西?