【发布时间】:2013-02-20 17:13:12
【问题描述】:
我正在尝试创建一个日历表来显示公司每个员工的每日可用性。我认为我需要的是一个带有每月天数的标题,然后是每个工作人员的一行(与天数一样多的单元格)。每个单元格的不同背景颜色将代表不同的可用性状态,并且工作人员会发生变化,所以我希望所有这些都是动态生成的。
在网上研究并以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我在
Reception类定义中添加了staff,并使用<%= 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
但是,这只会为每个房间生成一个单元格,而我想要一行与标题一样多的单元格。
【问题讨论】:
标签: ruby-on-rails ruby block helper content-tag