这种情况很简单:我在数据库中有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