這種情況很簡單:我在數據庫中有markdown,並且希望它在輸出(*)上進行解析。Rails提供修改屬性的方式
@post.body
被映射到數據庫中的posts.body列。簡單的默認Activerecord ORM。該列存儲用戶插入的減價文本。
現在,我看到四個方面所提供的降價渲染的版本,我的意見:在app/models/post.rb
首先,:
# ...
def body
markdown = RDiscount.new(body)
markdown.to_html
end
讓我簡單地調用@ post.body,並得到一個已經呈現版本。我看到很多潛在的問題,例如在編輯文本字段時預先填充了呈現的HMTL而不是降價代碼。
二辦法是在方法
形式的新屬性在app/models/post.rb
:
# ...
def body_mardownified
markdown = RDiscount.new(body)
markdown.to_html
end
似乎乾淨給我。
在app/helpers/application_helper.rb
def markdownify(string)
markdown = RDiscount.new(string)
markdown.to_html
end
或者,的幫手第三這是在視圖中使用,而不是<%= body %>
,<%= mardownify(body) %>
。
該第四的方式,將解析這個在PostsController
。
def index
@posts = Post.find(:all)
@posts.each do |p|
p.body = RDiscount.new(string).to_html
@rendered_posts << p
end
end
我不太熟悉Rails 3的正確方法和屬性體系結構。我應該怎麼去?有第五種選擇嗎?我應該注意這些選項中的一個或另一個的陷阱,陷阱或性能問題嗎?
(*)將來可能會更新數據庫緩存層,甚至可能會更新渲染版本的特殊列。但僅此而已,這是不言而喻的,所以要避免討論過濾輸出與過濾輸入:)。
聽起來像一個偉大的,非常Ruby的方式來做到這一點。 – berkes 2011-01-26 20:29:24