Rails中的文章长度验证

时间:2015-05-17 11:39:25

标签: ruby-on-rails ruby validation blogs maxlength

我目前正在学习Rails,并且我遵循了#34;入门Rails"教程http://guides.rubyonrails.org/getting_started.html。我的问题是如何验证文章的长度,如果它超过一定长度,最后会加上三个点?

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

我的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' %>

3 个答案:

答案 0 :(得分:1)

您可以向模型添加验证:

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

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

答案 1 :(得分:1)

如果您想将文字缩短为一定数量的字符,可以使用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即可。另外,如果你打算使用后者,我会亲自为它创建一个辅助方法。

答案 2 :(得分:1)

您可以在视图中处理它。

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 %>