我正在构建一个小应用程序,它将输入的内容输入到输入字段中,并在输入时直接显示在输入字段下方。
我使用此代码的目标是按日期分隔这些条目,以便在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')
您可以借此给予任何帮助,我们将非常感激!
答案 0 :(得分: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 %>
<强>带注释强>
首先,我们将所有课程结合在一起。这相当于找到(:all,:order =&gt;'created_at ASC'),但我喜欢这种更新,更紧凑的语法
@allLessons = Lesson.order('created_at ASC')
然后我们将它们组合成一个散列,其中键是日期,值是当天创建的记录数组。 beginning_of_day
会将DateTime
转换为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 %>