我使用以下内容定义星期一和星期五:
@monday = Date.today.at_beginning_of_week
@friday = 5.days.since(@monday)
但实际上,我确实需要在任何一天,周一,周二,周三循环并取出该日期并将输出放入一列。
<th>Monday</th>
<th>Tuesday</th>
etcetera
例如,给定的行将是:
<tr><td>method_with_arg(monday)</td><td>method_with_arg(tuesday)</td><td>method_with_arg(wednesday)</td></tr>
这是值是一个采用args日期的方法。
最干净的方法是什么?
感谢。
答案 0 :(得分:5)
def dates_week(d)
(d.beginning_of_week...d.beginning_of_week+5).map{|a|
"<td>#{a.strftime('%F')}</td>"
}.join
end
dates_week Date.today
#=> "<td>2010-05-17</td><td>2010-05-18</td><td>2010-05-19</td><td>2010-05-20</td><td>2010-05-21</td>"
您可以调用接收日期和返回字符串的任何其他方法,例如a.strftime
等,而不是mails_sent_on(a)
。您还可以使用yield a
在那里使用块传递与日期相关的逻辑:
def dates_week(d)
(d.beginning_of_week...d.beginning_of_week+5).map{|a|
yield a
}.join
end
dates_week(Date.today) { |d|
"<td>#{mails_sent_on(d)}</td>"
}
或者,将字符串保留在dates_week
方法之外:
def dates_week(d)
(d.beginning_of_week...d.beginning_of_week+5).map{|a|
yield a
}
end
dates_week(Date.today) { |d|
mails_sent_on(d)
}.join(', ')
或您需要的任何形式。
答案 1 :(得分:1)
我只使用Plain Old Ruby Objects,但我认为如果你想保持干净,那么你想要将工作日的逻辑与工作日的逻辑区分开来。
def dates_week(d)
d.beginning_of_week...(d.beginning_of_week+5)
end
dates_week(Date.today).map {|a|
"<td>#{a.strftime('%F')}</td>"
}.join
答案 2 :(得分:1)
我甚至比安德鲁更进一步,并且需要一个块:
def dates_week(d, delim)
"<tr>" + (d.beginning_of_week...(d.beginning_of_week+5)).map do |day|
"<#{delim}> #{yield(day)} </#{delim}>"
end.join + "</tr>"
end
dates_week(Date.today, "th") {|d| d.strftime("%A")} # => <tr><th>Monday</th><th>Tuesday</th>...
dates_week(Date.today, "td") {|d| some_function(d)} #first row
答案 3 :(得分:0)
我能想到的最简单的解决方案是:
first_day = Date.today.at_beginning_of_week
days = 7.times.map {|x| first_day + x.days }
days.each do |day|
puts "<td>" + func(day) + "</td>"
end
应该做的伎俩