以下代码来自Ryan Bates的RailsCasts,他将博客的首页转换为日历,以便文章在日期显示为链接.以下辅助模块创建日历.我对这段代码有两个问题
在该day_cell方法中,他使用了一种名为的方法capture.我在其上找到了一些文档,但我仍然无法弄清楚捕获在这种情况下是如何工作的.那么&callback,作为一个参数被捕获的是什么?是否与:callback传递给Struct.new 的相同?如果是这样,它如何进入捕获?什么是:传递给Struct的回调?
def day_cell(day)
content_tag :td, view.capture(day, &callback), class: day_classes(day)
end
Run Code Online (Sandbox Code Playgroud)源代码
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, view.capture(day, &callback), 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
Run Code Online (Sandbox Code Playgroud)
jls*_*str 19
我做了我的研究,最后我揭开了神秘面纱.
所以,有几件事要开始; 像往常一样,文档不是很清楚,捕获(*args)方法应该将一块模板抓取到一个变量中,但它并没有深入解释你可以将变量传递给抓取的模板,那当然是一个块的形式
来自 Ryan Bate的日历屏幕的源代码:
<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>
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,块只是这部分:
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 %>
Run Code Online (Sandbox Code Playgroud)
所以,当他打这个电话时:
content_tag :td, view.capture(day, &callback), class: day_classes(day)
Run Code Online (Sandbox Code Playgroud)
尤其:
view.capture(day, &callback)
Run Code Online (Sandbox Code Playgroud)
这里发生的事情是他将日期参数传递给上面的Block作为| date | 参数(在块中).
这里需要理解的是,在问题的背景下(制作30天的日历); 每月的每一天都会传递给捕获方法,以及模板(&回调),这样做.结果在给定月份的每一天呈现上面的块.最后一步当然是..将呈现的内容(每天)放置为content_tag:td的内容
最后一点; Ryan在视图变量上调用捕获方法,文档中也没有说明,但他在ScreenCast中确实提到他需要这个视图作为访问视图的"代理",当然视图是只有一个可以访问ViewHelper方法的人.
所以,总而言之,它是非常漂亮的代码,但是一旦你理解它的作用它就会很美好.所以,我同意一见钟情.
希望这会有所帮助,这是我能想到的最好的解释.:)
| 归档时间: |
|
| 查看次数: |
2873 次 |
| 最近记录: |