1

我正在构建一个小型应用程序,它将输入的内容输入到输入字段中,并在输入时直接显示在该输入字段的下方。

我使用此代码的目标是按日期分隔这些条目,以便在 6 月 1 日发布的所有内容之间都有一个换行符,并且 6 月 2 日的第一个条目与 6 月 1 日的条目之间有 2 个空格。

这是我的代码,它没有按计划运行,但我不知道为什么,我认为它源于第 3 行,而且我做错了。(注意:我知道这还没有考虑到月份或年份的变化。一旦我确定了正确的日期间距,我就会解决这个问题)

<% for i in (0..(@allLessons.count-1)) %>

<b><%= @date[i].created_at.strftime('%b %d')%></b><br/>

<% if @date[i].created_at.strftime('%d') == @date[i-1].created_at.strftime('%d') %>

<%= @date[i].created_at.strftime('%d') %> <br />

<% else %>

<%= @date[i].created_at.strftime('%d') %><br /><br />

<% end %>           
<% end %>

从控制器:

@allLessons = Lesson.all
@date = Lesson.find(:all, :order => 'created_at ASC')

您可以为此提供的任何帮助将不胜感激!

4

1 回答 1

1

块和迭代器是它所在的地方。

@allLessons = Lesson.order('created_at ASC')
@dates = @allLessons.group_by { |lesson| lesson.created_at.beginning_of_day }.sort

<% @dates.each do |date, lessons| %>
  <% lessons.each do |lesson| %>
    <b><%= lesson.created_at.strftime("%d") %></b><br />
  <% end %>
  <br />
<% end %>

带注释的

首先,我们将所有课程放在一起。这相当于 find(:all, :order => 'created_at ASC'),但我喜欢这种更新、紧凑的语法

@allLessons = Lesson.order('created_at ASC')

然后我们将它们全部组合成一个散列,其中键是日期,值是当天创建的记录数组。beginning_of_day将 a 转换DateTime为 a Date,其中时间设置为00:00:00。所以,2012-05-25 18:00变成2012-05-25 00:00:00。这样我们就可以自己对日期进行分组,而不会妨碍时间

@dates = @allLessons.group_by { |lesson| lesson.created_at.beginning_of_day }.sort

@dates现在是一个哈希,其中键是日期,值是该日期的课程数组。例如,{ '2012-05-24 00:00:00' => [ lesson_1 ], 2012-05-25 00:00:00' => [ lesson_2, lesson_3 ]

然后我们将哈希传递到一个块中,其中键是日期,值是课程数组。这就是说,对于每个日期...

<% @dates.each do |date, lessons| %>

给我属于那个日期的课程。而对于每一个...

  <% lessons.each do |lesson| %>

打印上课日期

    <b><%= lesson.created_at.strftime("%d") %></b><br />
  <% end %>

在继续下一个日期之前,打印一个<br />

  <br />
<% end %>
于 2012-05-25T22:43:57.047 回答