在Rails部分中生成链接的最有效方法是什么?

时间:2013-10-25 05:00:21

标签: ruby-on-rails ruby performance heroku erb

我的应用会生成一个用户的日历,其中包含预约约会的可用插槽。它会自动检测访问者的时区,并在访问者的时区显示用户的可用性。

由于检测到的时区用于呈现显示,因此片段缓存将不起作用。

该视图会生成100多个链接,访问者可以选择这些链接预订约会的时间段。基准测试表明,生成链接是视图中最慢的部分 - 每个链接 0.5ms

循环ERB并生成超链接的最有效方法是什么?

我们开始使用HTML而不是link_to Rails帮助程序 - 这在开发中快2倍但在生产中却不那么快 - 我们的结论是Heroku必须优化这些Rails帮助程序。

<a href="/<%= @profile.profile_url %>/
appointments_calendars/<%= @appointments_calendar.id %>/
booked_events/new?
timezone_name=<%= @timezone.name %>&amp;
event_slot_id=<%= event_id %>"
class="left-slot open-slot" rel="nofollow">
<%= timeslot.strftime("%l:%M%p") %></a>

,其中 @ profile.profile_url 是一个字符串, @ appointmentments_calendar.id 是来自activerecord对象的整数。 @ timezone.name 是一个字符串。它们不会在循环中更改 - 也就是说,它们是在页面呈现时生成的,并且不会更改。

event_id 是一个整数,时间段是一个时间。它们对于循环中的每个链接都是不同的。

我想知道是否有一种在Ruby / Rails中根据字符串缓冲的工作方式生成此HTML链接的最佳方法。

循环是一个每天运行的整数范围,

(first_hour..last_hour).step(1.hour).each

或者,是否有更快的方法在不依赖ERB的Rails中执行此操作?

1 个答案:

答案 0 :(得分:2)

您可以尝试以下方式:

# somewhere before the loop starts:
<% slug = "/#{@profile.profile_url}/appointments_calendars/#{@appointments_calendar.id}/booked_events/new?timezone_name=#{@timezone.name}&amp;event_slot_id=" %>

然后你可以做

<a href="<%= slug + event_id %>" class="left-slot open-slot" rel="nofollow">
  <%= timeslot.strftime("%l:%M%p") %>
</a>

我不知道这是否会成为瓶颈,尽管它更具可读性。我怀疑生成链接的时间很长也可能与您定义event_idtimeslot有关。