Ruby on Rails - 截断到特定的字符串

时间:2011-02-16 14:09:24

标签: ruby ruby-on-rails-3

澄清:帖子的创建者应该能够决定何时发生截断。

我在我的博客中使用以下辅助函数实现了类似[--- MORE ---]功能的Wordpress:

# application_helper.rb

def more_split(content)
split = content.split("[---MORE---]")
split.first
end

def remove_more_tag(content)
content.sub(“[---MORE---]", '')
end

在索引视图中,帖子正文将显示(但没有)[--- MORE ---]标记的所有内容。

# index.html.erb
<%= raw more_split(post.rendered_body) %>

在节目视图中,除了[--- MORE ---]标签外,还会显示帖子正文中的所有内容。

# show.html.erb
<%=raw remove_more_tag(@post.rendered_body) %>

这个解决方案目前对我没有任何问题。 由于我还是编程的初学者,我一直想知道是否有更优雅的方式来实现这一目标

你会怎么做?

感谢您的时间。


这是更新版本:

# index.html.erb
<%=raw truncate(post.rendered_body,  
                :length => 0, 
                :separator => '[---MORE---]', 
                :omission => link_to( "Continued...",post)) %>

...并在展会视图中:

# show.html.erb
<%=raw (@post.rendered_body).gsub("[---MORE---]", '') %>

4 个答案:

答案 0 :(得分:8)

我只使用截断,它具有您需要的所有选项。

truncate("And they found that many people were sleeping better.", :length => 25, :omission => '... (continued)')
# => "And they f... (continued)"

<强>更新

在阅读了评论之后,又挖掘了一些文档,似乎:separator完成了工作。

来自doc:

Pass a :separator to truncate text at a natural break.

有关参考资料,请参阅docs

truncate(post.rendered_body, :separator => '[---MORE---]')

在展示页面上,您必须使用gsub

答案 1 :(得分:0)

您可以在索引页面上使用辅助函数,该函数仅捕获字符串中的前X个字符。所以,它看起来更像是:

<%= raw summarize(post.rendered_body, 250) %>

获取帖子中的前250个字符。那么,你不必在[--- MORE ---]字符串上处理w / split。而且,在您的帖子的展示页面上,您根本不需要做任何事情......只需渲染post.body


这是一个示例摘要帮助程序(您将放入application_helper.rb):

def summarize(body, length)
return simple_format(truncate(body.gsub(/<\/?.*?>/,  ""), :length => length)).gsub(/<\/?.*?>/,  "")
end

答案 2 :(得分:0)

我试过,发现这个是最好最简单的

def summarize(body, length)
    return simple_format = body[0..length]+'...'
end

s = summarize("to get the first n characters in your post. So, then you don't have to deal w/ splitting on the [---MORE---]  post.body.",20)


ruby-1.9.2-p290 :017 > s
=> "to get the first n ..." 

答案 3 :(得分:0)

我需要一个可以在此ERB调用模板上使用的模板。这只是一个简单的字符串:

<%= @page_info.user_name %>

我尝试了<%= truncate(@page_info.user_name, :length => -2)

但它实际上会根据数字重复两次或不同的长用户名。我只想允许显示10个字符的用户名。