builders是一種 Template Handler,跟 erb 是很像的東西,erb 會幫我們把內容轉化為瀏覽器看得懂的 HTML 或 js 等,而builder也是做一樣的事情,只是大家習慣使用erb作為 HTML 和js的handler,使用 builder作為 XML、RSS、Atom 的handler。
補充:
Builder templates are a more programmatic alternative to ERB. They are especially useful for generating XML content. An XmlMarkup object named xml is automatically made available to templates with a .builder extension.
所謂的 more programmatic alternative to ERB 應該是指它是以更程式的邏輯去 generate 出 XML file,所以更能展現 tag 間彼此的相對關係的意思,見下方例子:
app/views/topics/show.xml.builder
xml.topic do |t|
t.title @topic.title
t.content @topic.content
end
會產出這樣的xml
<topic>
<title>Topic Title</title>
<content>Topic Content Here</content>
</topic>
可以參考 jbuilder 生成 JSON 格式的資料。
RSS、Atom 跟 XML 是很像的東西,因為 RSS 、 ATOM 都是基於 XML 格式的延伸應用,所以 Build 的方式跟 XML 一樣,唯一需要注意的就是一些 RSS 規範中需要有的 Tag ,例如要有 rss version 的 tag ,並把要呈現的內容放在 channel tag 中:
app/views/topics/index.rss.builder
xml.instruct! :xml, :version => "1.0"
xml.rss :version => "2.0" do
xml.channel do
xml.title "Rails102"
xml.description "Intermediate to Rails"
xml.link root_url
for topic in @topics
xml.item do
xml.title topic.title
xml.description topic.content
xml.pubDate topic.created_at.to_s(:rfc822)
xml.link board_topic_url(topic.board_id, topic)
xml.guid board_topic_url(topic.board_id, topic)
end
end
end
end
首先要讓 controller 可以 respond_to rss ,並且將 layout 預設為 false
class TopicsController < ApplicationController
def index
@topcis = Topic.all
respond_to do |format|
format.html
format.rss { render :layout => false }
end
end
end
之後再 html view 內加上 RSS 連結就完成了。
<%= link_to "+RSS", posts_url(format: "rss") %>