ruby-on-rails – Rails:捕获方法
以下代码来自Ryan Bates的
RailsCasts,他将博客的首页变成一个日历,以便文章在几天内显示为链接.以下帮助程序模块创建日历.我有两个关于这段代码的问题
>在day_cell方法中,他使用一种叫做capture的方法.我发现了一些文档,但我仍然无法弄清楚捕获在这种情况下是如何工作的.另外,作为被捕获的参数传递的&回调是什么?会是一样的:回调传递给Struct.new吗?如果是这样,它如何进入捕获?什么是传递给Struct的回调函数? def day_cell(day) content_tag :td,view.capture(day,&callback),class: day_classes(day) end 源代码 module CalendarHelper def calendar(date = Date.today,&block) binding.pry Calendar.new(self,date,block).table end class Calendar < Struct.new(:view,:date,:callback) HEADER = %w[Sunday Monday Tuesday Wednesday Thursday Friday Saturday] START_DAY = :sunday delegate :content_tag,to: :view def table content_tag :table,class: "calendar" do header + week_rows end end def header content_tag :tr do HEADER.map { |day| content_tag :th,day }.join.html_safe end end def week_rows weeks.map do |week| content_tag :tr do week.map { |day| day_cell(day) }.join.html_safe end end.join.html_safe end def day_cell(day) content_tag :td,class: day_classes(day) end def day_classes(day) classes = [] classes << "today" if day == Date.today classes << "notmonth" if day.month != date.month classes.empty? ? nil : classes.join(" ") end def weeks first = date.beginning_of_month.beginning_of_week(START_DAY) last = date.end_of_month.end_of_week(START_DAY) (first..last).to_a.in_groups_of(7) end end end 解决方法
我做了我的研究,我终于解开了这个谜.
所以,开始的几件事情;像往常一样documentation不是很清楚, 来自Ryan Bate的Calendar Screen-cast的源代码: <div id="articles"> <h2 id="month"> <%= link_to "<",date: @date.prev_month %> <%= @date.strftime("%B %Y") %> <%= link_to ">",date: @date.next_month %> </h2> <%= calendar @date do |date| %> <%= date.day %> <% if @articles_by_date[date] %> <ul> <% @articles_by_date[date].each do |article| %> <li><%= link_to article.name,article %></li> <% end %> </ul> <% end %> <% end %> </div> 在上面的代码中,块将是这一部分: do |date| %> <%= date.day %> <% if @articles_by_date[date] %> <ul> <% @articles_by_date[date].each do |article| %> <li><%= link_to article.name,article %></li> <% end %> </ul> <% end %> <% end %> 所以,当他打电话时: content_tag :td,class: day_classes(day) 尤其: view.capture(day,&callback) 这里发生的是他将日期参数传递到上面的Block作为| date |参数(在块中). 在这里需要理解的是,在问题的背景下(制作30天的日历);每个月的每一天都会传递到捕获方法,以及模板(&回调),这样做,从而在给定月份的每一天呈现上面的块.最后一步,当然是..将呈现的内容(每天)作为content_tag的内容:td 最后一句话Ryan正在调用一个视图变量的捕获方法,文档中也没有说明,但他在ScreenCast中提到他需要这个视图作为访问视图的“代理”,当然这个视图是只有一个可以访问ViewHelper方法. 所以,总而言之,这是非常漂亮的代码,但是只要你明白它是什么,它只是美丽的,所以我同意的是一见钟情. 希望这有帮助,这是我可以想出的最好的解释. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |