Проверка длины статьи в Rails

В настоящее время я изучаю Rails и следовал руководству "Начало работы с 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' %>

person Lilspree    schedule 17.05.2015    source источник


Ответы (3)


Если вы хотите сократить текст до определенного количества символов, вы можете использовать обрезать:

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. Кроме того, если вы собираетесь использовать последний, я бы лично создал для него вспомогательный метод.

person Kevin    schedule 17.05.2015
comment
Красиво... усечение было тем, что я искал, поскольку мне нужно было добавить его только в одну строку кода. Метод не нужен.. <%= truncate(article.text, length: 500) %> - person Lilspree; 17.05.2015

Вы можете добавить валидацию к модели:

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

Для получения дополнительной информации ознакомьтесь с этим руководством.

person duykhoa    schedule 17.05.2015
comment
Думаю, мне не следовало использовать слово «проверка», поскольку мне не нужно было генерировать сообщение об ошибке. Но на самом деле я могу использовать это, чтобы помочь моей аутентификации пользователя. - person Lilspree; 17.05.2015

Вы можете справиться с этим на свой взгляд.

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 %>
person Amit Badheka    schedule 17.05.2015