模型中的消毒和纺织品

时间:2011-06-30 15:10:30

标签: ruby-on-rails-3 model sanitize

这是一个双重问题。

我有一个接受用户输入的RoR(3.0.7)应用程序,例如创建新闻文章。到目前为止,用户输入是普通的XHTML,因为用户是可信的。但是,在XHTML网站上创建帖子对某些用户来说是一项挑战,因此我们将尝试转向纺织品。

使用纺织品我安装了RedCloth。

由于我们不会将现有的新闻文章转换为纺织品,我知道这对于获得统一数据是正确的,因此计划是在给定日期之后仅对内容使用RedCloth。

在视图中,我只需要一个条件来检查created_at日期,然后在输出之前调用RedCloth。但是,这意味着每当我呈现特定内容时,我必须遍历所有视图并插入条件。我甚至可以创建一个帮助程序来最小化我必须复制的代码。

而不是这样做并保持干燥我决定将逻辑移到模型中。该模型有一个名为articlecontent的列。我想出的是下面的代码,到目前为止似乎有效:

def articlecontent
  if !self.new_record? && created_at.to_datetime > 'YYYY.MM.DD'.to_datetime
    articlecontent_in_textile = self[:articlecontent]
    articlecontent_in_html = RedCloth.new(articlecontent_in_textile, [:filter_html]).to_html
    return articlecontent_in_html
  else
    return self[:articlecontent]
  end
end

所以我的问题是:

1) 这是正确的方法吗?或者我应该定义某种ViewHelper?

2) 似乎我不能在模型中调用清理帮助器,可能是有充分理由的。有没有办法在模型中调用帮助器?

由于 马克

1 个答案:

答案 0 :(得分:0)

我会定义一个帮助器,因为这是逻辑,它真正属于视图而不是模型。

但是,您可能希望在模型上定义一个返回所用标记类型的方法:

def markup_type
   created_at > MARKUP_CHANGED_DATETIME ? "textile" : "html"
end

MARKUP_CHANGED_DATETIME是常量,您可以在配置文件中定义。

或者通过迁移为模型添加markup_type属性,并将之前的所有属性设置为“html”,将所有未来的属性设置为“纺织品” - 这样可以让您继续并排使用,或逐渐改变旧的。