如何在Ruby中循环一周的每一天?

Tim*_* T. 2 ruby loops ruby-on-rails date

我使用以下内容定义星期一和星期五:

@monday = Date.today.at_beginning_of_week

@friday = 5.days.since(@monday)
Run Code Online (Sandbox Code Playgroud)

但实际上,我确实需要在任何一天,周一,周二,周三循环,并采取该日期并将输出放入一列.

<th>Monday</th>
<th>Tuesday</th>
etcetera
Run Code Online (Sandbox Code Playgroud)

例如,给定的行将是:

<tr><td>method_with_arg(monday)</td><td>method_with_arg(tuesday)</td><td>method_with_arg(wednesday)</td></tr>
Run Code Online (Sandbox Code Playgroud)

这是值是一个采用args日期的方法.

最干净的方法是什么?

谢谢.

Mla*_*vić 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>"
Run Code Online (Sandbox Code Playgroud)

而不是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>"
}
Run Code Online (Sandbox Code Playgroud)

或者,保持字符串不受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(', ')
Run Code Online (Sandbox Code Playgroud)

或者你需要的任何形式.