Rails 中的文章长度验证

Article length validation in Rails

我目前正在学习 Rails,并且我遵循了 "Getting started with Rails" 教程 http://guides.rubyonrails.org/getting_started.html。我的问题是如何验证文章的长度,如果超过一定长度,则在末尾附加三个点?

我有一个页面显示所有没有评论的文章,​​我有一个页面显示每篇特定文章和评论。如果有人想查看文章的其余部分和评论,他们会单击 link 以查看该特定文章。

我的 index.html.erb 显示每篇文章,但我只希望它显示每篇文章最多 200 个单词并附加三个点

<% @articles.each do |article| %>
 <h1><%= article.title %></h1>
  <p><%= article.text %></p>
  <%= link_to 'Show full post', article_path(article) %>

<% end %>

show.html.erb 显示带有评论的完整文章

    <h1>
      <%= @articles.title %>
    </h1>

    <p>
    <%= @articles.text %>
    </p>

    <h2>Comments</h2>
    <%= render @articles.comments %>

    <h2>Add a comment:</h2>
    <%= render 'comments/form' %>

这里是文章控制器

class ArticlesController < ApplicationController

def index
    @articles = Article.all
end

def show
    @articles = Article.find(params[:id])

end


def new
    @articles = Article.new
end

def edit
    @articles = Article.find(params[:id])
end

def create
    @articles = Article.new(articles_params)

    if @articles.save
        redirect_to @articles
    else
        render 'new'
    end
end

def update
    @articles = Article.find(params[:id])

    if @articles.update(articles_params)
        redirect_to @articles
    else
        render 'edit'
    end
end

def destroy
    @articles = Article.find(params[:id])
    @articles.destroy

    redirect_to articles_path
end

private
    def articles_params
        params.require(:articles).permit(:title, :text)
    end
end


    <h2>Comments</h2>
    <%= render @articles.comments %>

    <h2>Add a comment:</h2>
    <%= render 'comments/form' %>

您可以向模型添加验证:

class Article < ActiveRecord::Base
  validates :text, length: { maximum: 1000 }
end

有关详细信息,请查看 this guide

如果您想将文本缩短到一定数量的字符,您可以使用 truncate:

truncate("Once upon a time in a world far far away", length: 17)
# => "Once upon a ti..."

如果您真的想将文本缩短到一定数量的单词,您可以按空格拆分字符串,计算到您想要的单词数,然后按空格连接这些单词:

string = "Once upon a time in a world far far away"
string.split(" ").join(0, 5).join(" ")
# => "Once upon a time in"

如您所见,您仍然需要在之后添加 ...,但只有当您的限制(在我的示例中为 5)小于总字数(或者当结果字符串与原始字符串不匹配时。当我使用 15 (我的字符串中只有 10 个单词)时,你不需要这样做:

string = "Once upon a time in a world far far away"
string.split(" ").join(0, 15).join(" ")
# => "Once upon a time in a world far far away"

要将此应用于您的代码,只需将 string 替换为 article.text。另外,如果你打算使用后者,我会亲自为它创建一个辅助方法。

在你看来可以处理。

article.text = "Some article text which should be shown if the length is less than 200, or else it should be truncated"
<% article_array = article.split(" ") %>
<% if article_array.length > 200 %>
    <%= article_array[0..200].join(" ") %>
    <%= link_to "... more", article_path(article) %>
<% else %>
    <%= article.text %>
<% end %>