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 %>
我目前正在学习 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 %>