0

这是一个双重问题。

我有一个接受用户输入的 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) 似乎我无法在模型中调用 sanitize 助手,这可能是有充分理由的。有没有办法在模型中调用助手?

谢谢马克

4

1 回答 1

0

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

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

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

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

或者markup_type通过迁移向模型添加一个属性,并将所有以前的属性设置为“html”,将所有未来的属性设置为“textile” - 这将有利于您继续并排使用两者,或者逐渐把旧的改过来。

于 2011-06-30T16:08:31.280 回答