我正在尝试创建一个日历表来显示公司每位员工的每日空闲时间。我想我需要的是一个带有月份日期的标题,然后是每个工作人员的一行(包含与天数一样多的单元格)。每个单元格的不同背景颜色将代表不同的可用性状态和工作人员的变化,所以我希望所有这些都是动态生成的。
在线研究并使用 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
然而,这只为每个房间生成一个单元格,而我想要一行包含与标题一样多的单元格。
最佳答案
首先是 ruby 约定:使用 2 个空格作为间距并使用 _ 作为方法名称。
现在认识你编写复杂助手时最好的 friend :concat
.它所做的是将字符串直接输出到 ERB 缓冲区。向您展示和示例:
def my_helper
concat "hello world"
end
<% my_helper %>
会输出 hello world
在 html 中,即使我们使用了 <%
而不是 <%=
.
在帮助程序中处理 block 时,这是非常重要的方法,因为这意味着您可以调用 concat
在 block 中多次,两个字符串都将被输出。这是一个例子:
def my_helper
content_tag :div do
concat "Hello "
concat "World"
concat "!"
end
end
<%= my_helper %>
会输出 <div>Hello World!</div>
.所以使用相同的想法你可以做这样的事情:
def my_helper
content_tag :ul do
@people.each do |person|
concat content_tag(:li, person.name)
end
end
end
<%= my_helper %>
这会导致这样的结果:<ul><li>John Doe</li><li>Mike Tyson</li></ul>
.
所以我会重写days_helper
像这样:
def days_header
(0..date.end_of_month.day).each { |day| concat content_tag(:th, day) }
end
用 staff_rows
做类似的事情方法然后table
方法看起来就像这样:
content_tag :table, class: "calendar" do
days_header
staff_rows
end
至于问题的回调部分:&block
将传递给方法的 block 捕获到 Proc 对象中。该对象稍后可以传递给其他方法或直接调用。由于您没有使用回调对象,我只是建议将其删除。
关于ruby-on-rails - 相当新的 Rails 开发人员对 content_tag 和 helpers 感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14985822/