相当新的rails开发人员对content_tag和helper感到困惑

seb*_*kom 1 ruby ruby-on-rails block helper content-tag

我正在尝试创建一个日历表来显示公司每个员工的每日可用性.我认为我需要的是一个标题,其中包含每月的日期,然后是每个工作人员的一行(具有与天数一样多的单元格).每个单元格的不同背景颜色将代表不同的可用性状态,并且工作人员会更改,因此我希望动态生成所有这些.

经过网上研究并以Ryan Bates的Railscast#213(日历修订版)作为我的向导,我到目前为止设法生成了我的表格的标题,显示了每个单元格中每月的日期.

到目前为止,这是我的代码:

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
Run Code Online (Sandbox Code Playgroud)

现在,问题和困惑开始于此:

  • 正如我所发现的那样,删除&block并删除:callback{...}功能.我不能说我理解为什么.谁有一个很好的解释?

  • 为什么以上工作,但我不能使用(..).each docontent_tag下面的块?

    (0..last_day).to_a.each do |day| 
        content_tag :th do
            day
        end
    end
    
    Run Code Online (Sandbox Code Playgroud)
  • 在我努力为每个员工显示行时,我选择了这个:

    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
    
    Run Code Online (Sandbox Code Playgroud)

    我添加staffReception课程定义中,我打电话给<%= reception @staff %>- 如果这不是一个很好的练习,请随时喊我:D

    但是,不是每个工作人员获得一行,而是将所有成员名称放在一行中并且在标题的正上方.在最后一个标题单元格之后更改content_tag :trcontent_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
Run Code Online (Sandbox Code Playgroud)

但是,这会为每个房间只生成一个单元格,而我想要一个包含与标题一样多的单元格的行.

And*_*kas 6

首先是ruby约定:使用2个空格作为间距,并使用_作为方法名称.

现在,在写复杂的帮手时,请与你最好的朋友见面:concat.它的作用是将字符串直接输出到ERB缓冲区.向您展示和示例:

def my_helper
  concat "hello world"
end
<% my_helper %>
Run Code Online (Sandbox Code Playgroud)

hello world即使我们使用<%和不使用html 输出<%=.

在处理帮助程序中的块时,这是非常重要的方法,因为这意味着您可以concat在块中多次调用,并且将输出两个字符串.这是一个例子:

def my_helper
  content_tag :div do
    concat "Hello "
    concat "World"
    concat "!"
  end
end
<%= my_helper %>
Run Code Online (Sandbox Code Playgroud)

会输出<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 %>
Run Code Online (Sandbox Code Playgroud)

这将产生这样的事情:<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
Run Code Online (Sandbox Code Playgroud)

staff_rows方法做类似的事情然后table方法看起来像这样:

content_tag :table, class: "calendar" do
  days_header
  staff_rows
end
Run Code Online (Sandbox Code Playgroud)

至于问题的回调部分:&block捕获传递给方法的块到Proc对象.以后可以将此对象传递给其他方法或直接调用.由于你没有使用回调对象,我只是建议删除它.