我正在尝试创建一个日历表来显示公司每个员工的每日可用性。我认为我需要的是一个带有每月天数的标题,然后是每个工作人员的一行(与天数一样多的单元格)。每个单元格的不同背景颜色将代表不同的可用性状态,并且工作人员会发生变化,因此我希望所有这些都是动态生成的。
在网上研究并以Ryan Bates 的 Railscast #213 (Calendars Revised)作为我的指南后,到目前为止,我已经成功地生成了我的表格标题,该表格在每个单元格中显示了月份中的日期。
到目前为止,这就是我的代码:
module ReceptionHelper
def reception(date = Date.today, &block)
Reception.new(self, date, block).table
end
class Reception < Struct.new(:view, :date, :callback)
delegate :content_tag, to: :view
def table
content_tag :table, class: "calendar" do
daysHeader
end
end
def daysHeader
last_day = date.end_of_month.strftime("%d").to_i
(0..last_day).to_a.map { |day| content_tag :th, day }.join.html_safe
end
end
现在,这里是问题和困惑开始的地方:
正如我发现的那样,删除
&block
并:callback
带走了 { ... } 功能。我真的不能说我明白为什么。谁有好的解释?为什么上面的工作,但我不能使用
(..).each do
和content_tag
下面的块?(0..last_day).to_a.each do |day| content_tag :th do day end end
为了显示每个员工的行,我这样做了:
def table content_tag :table, class: "calendar" do daysHeader + staffRows end end def staffRows staff.to_a.map { |staff| content_tag :tr, staff.name }.join.html_safe end
我添加
staff
到Reception
类定义中,我打电话给<%= reception @staff %>
- 如果这不是一个很好的做法,请随时对我大喊大叫:D但是,我没有让每个工作人员获得一排,而是将所有成员的姓名排成一排,并在标题的正上方。更改
content_tag :tr
为content_tag :td
会在最后一个标题单元格之后生成一个包含每个员工姓名的单元格。
如您所知,我对此很迷茫,而且似乎我什至不清楚为什么按我想要的方式工作的部分是正确的。我希望这篇文章不会给人留下我希望把所有东西都放在盘子里的印象——我宁愿寻找可以帮助我理解的方向。:)
编辑:
staffRows
通过将方法更改为此,我取得了一些进展:
def staffRows
staff.to_a.in_groups_of(1).map do |staff|
content_tag :tr do
staff.map { |room| content_tag :th, staff.name }.join.html_safe
end
end.join.html_safe
end
但是,这只会为每个房间生成一个单元格,而我想要一行与标题一样多的单元格。