2011-12-12 101 views
0

我正在建设一个使用rails 3.1的网站,它的核心部分由一大堆文章组成(类似于博客文章)。这些被存储和格式化为HTML。现在,我需要的是生成文章内容的预览,以便在这些文章的提要中仅显示简短的版本。内容将不得不缩短而不会破坏它的HTML。用HTML内容显示文章的缩写版本

有没有简单的方法来做到这一点?一颗宝石会是完美的,但是对于一个干净的方式来实现缩短功能的想法本身也会很棒。谢谢!

编辑: 做进一步的实验,我目前有这种东西的工作,使用Sanitize gem,它似乎工作得非常好:

def shortened_content(length) 
    Sanitize.clean(content[0..length], Sanitize::Config::RELAXED) 
end 

我不喜欢稀释和改变我的问题的方向,但我想我必须。

是否有更好的解决方案? (我认为,消毒宝石会去掉不需要的内容以及清理HTML,我只是真的需要它来清理HTML)

我在想我应该把这个处理移到上游东西的?也就是说,存储缩短的内容以及完整的内容。我想它会为我节省足够的处理时间,使其值得额外存储。

+0

我会使用[HTML :: Trim](https://metacpan.org/module/HTML::Trim),但我不是Ruby用户。不过,它的源代码可能会有帮助。 – Quentin

回答

1

是的,消毒的宝石是正确的道路要走。我使用Nokogiri宝石做了类似的事情 - 你可以看到Sanitize宝石依赖于它。除了完整的HTML之外,将HTML的缩短预览存储在新的列中绝对是一种更好的方式。所以像before_save这样的东西

def generate_preview 
    self.preview_content ||= shortened_content(100) 
end 

一个很好的副作用是,管理员现在可以手动编写预览,如果需要的话。

+0

是的,我已经实现了这样的东西:)这段代码不会很好地处理内容编辑(虽然缩短版本不会更新主要内容) –

0

您可以将所有文本放在div(或您想使用的任何块级元素)中,将其设置为固定大小,然后将overflow: hidden;放在上面。您也可以使用text-overflow: ellipsis;,浏览器将显示...截断文本 - 如果它支持它。

#synopsis { 
    width: 300px; 
    height: 100px; 
    overflow: hidden; 
    text-overflow: ellipsis; 
} 

你可能会得到很多多余的文本,只会增加你需要下载的HTML的大小。

Example fiddle

+0

是的,这个想法是缩短实际内容 - 不仅仅是显示更少的内容:)此外,我怀疑这是最容易获得的解决方案。 –

+0

另外,该功能是否实现了?我在linux和Chrome上尝试了这两个铬和firefox - 没有省略号显示。 –

1

你需要的东西截断HTML不破坏标签,试试这个jquery truncator plugin

+0

谢谢,虽然我在寻找纯粹的服务器端,但我发现了一些很好的信息。包括rails truncate函数,尽管它不会清理HTML,但它的功能相当不错。 –

1

使用Rails的'HtmlSlicer'gem。

把这一行在你的Gemfile:

gem 'html_slicer' 

然后捆绑:

% bundle 

你的模型:

class YourModel < ActiveRecord::Base 
    slice :content, :as => :shorten, :slice => {:maximum => 100, :limit => 1, :text_break => "..."} 
end 

您的看法:

<%= @your_model.shorten %>