FEATURE: Improve errors when title is invalid (#11149)
It used to simply say "title is invalid" without giving any hint what the problem could be. This commit adds different errors messages for all caps titles, low entropy titles or titles with very long words.
This commit is contained in:
parent
ab314218d3
commit
a48f7ba61c
|
@ -149,6 +149,9 @@ en:
|
||||||
inclusion: is not included in the list
|
inclusion: is not included in the list
|
||||||
invalid: is invalid
|
invalid: is invalid
|
||||||
is_invalid: "seems unclear, is it a complete sentence?"
|
is_invalid: "seems unclear, is it a complete sentence?"
|
||||||
|
is_invalid_meaningful: "seems unclear, most of the words contain the same letters over and over?"
|
||||||
|
is_invalid_unpretentious: "seems unclear, one or more words is very long?"
|
||||||
|
is_invalid_quiet: "seems unclear, did you mean to enter it in ALL CAPS?"
|
||||||
invalid_timezone: "'%{tz}' is not a valid timezone"
|
invalid_timezone: "'%{tz}' is not a valid timezone"
|
||||||
contains_censored_words: "contains the following censored words: %{censored_words}"
|
contains_censored_words: "contains the following censored words: %{censored_words}"
|
||||||
less_than: must be less than %{count}
|
less_than: must be less than %{count}
|
||||||
|
|
|
@ -54,12 +54,6 @@ class TextSentinel
|
||||||
seems_quiet?
|
seems_quiet?
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def symbols_regex
|
|
||||||
/[\ -\/\[-\`\:-\@\{-\~]/m
|
|
||||||
end
|
|
||||||
|
|
||||||
def seems_meaningful?
|
def seems_meaningful?
|
||||||
# Minimum entropy if entropy check required
|
# Minimum entropy if entropy check required
|
||||||
@opts[:min_entropy].blank? || (entropy >= @opts[:min_entropy])
|
@opts[:min_entropy].blank? || (entropy >= @opts[:min_entropy])
|
||||||
|
@ -71,10 +65,6 @@ class TextSentinel
|
||||||
@text.gsub(symbols_regex, '').size > 0
|
@text.gsub(symbols_regex, '').size > 0
|
||||||
end
|
end
|
||||||
|
|
||||||
def skipped_locale
|
|
||||||
%w(zh_CN zh_TW ko ja).freeze
|
|
||||||
end
|
|
||||||
|
|
||||||
def seems_unpretentious?
|
def seems_unpretentious?
|
||||||
return true if skipped_locale.include?(SiteSetting.default_locale)
|
return true if skipped_locale.include?(SiteSetting.default_locale)
|
||||||
# Don't allow super long words if there is a word length maximum
|
# Don't allow super long words if there is a word length maximum
|
||||||
|
@ -87,4 +77,14 @@ class TextSentinel
|
||||||
SiteSetting.allow_uppercase_posts || @text == @text.mb_chars.downcase.to_s || @text != @text.mb_chars.upcase.to_s
|
SiteSetting.allow_uppercase_posts || @text == @text.mb_chars.downcase.to_s || @text != @text.mb_chars.upcase.to_s
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def symbols_regex
|
||||||
|
/[\ -\/\[-\`\:-\@\{-\~]/m
|
||||||
|
end
|
||||||
|
|
||||||
|
def skipped_locale
|
||||||
|
%w(zh_CN zh_TW ko ja).freeze
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,6 +6,17 @@ require 'text_cleaner'
|
||||||
class QualityTitleValidator < ActiveModel::EachValidator
|
class QualityTitleValidator < ActiveModel::EachValidator
|
||||||
def validate_each(record, attribute, value)
|
def validate_each(record, attribute, value)
|
||||||
sentinel = TextSentinel.title_sentinel(value)
|
sentinel = TextSentinel.title_sentinel(value)
|
||||||
record.errors.add(attribute, :is_invalid) unless sentinel.valid?
|
|
||||||
|
if !sentinel.valid?
|
||||||
|
if !sentinel.seems_meaningful?
|
||||||
|
record.errors.add(attribute, :is_invalid_meaningful)
|
||||||
|
elsif !sentinel.seems_unpretentious?
|
||||||
|
record.errors.add(attribute, :is_invalid_unpretentious)
|
||||||
|
elsif !sentinel.seems_quiet?
|
||||||
|
record.errors.add(attribute, :is_invalid_quiet)
|
||||||
|
else
|
||||||
|
record.errors.add(attribute, :is_invalid)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -18,6 +18,10 @@ describe "A record validated with QualityTitleValidator" do
|
||||||
let(:long_title) { valid_title.center(SiteSetting.max_topic_title_length + 1, 'x') }
|
let(:long_title) { valid_title.center(SiteSetting.max_topic_title_length + 1, 'x') }
|
||||||
let(:xxxxx_title) { valid_title.gsub(/./, 'x') }
|
let(:xxxxx_title) { valid_title.gsub(/./, 'x') }
|
||||||
|
|
||||||
|
let(:meaningless_title) { "asdf asdf asdf" }
|
||||||
|
let(:loud_title) { "ALL CAPS INVALID TITLE" }
|
||||||
|
let(:pretentious_title) { "superverylongwordintitlefornoparticularreason" }
|
||||||
|
|
||||||
subject(:topic) { QualityTitleValidatorSpec::Validatable.new }
|
subject(:topic) { QualityTitleValidatorSpec::Validatable.new }
|
||||||
|
|
||||||
before(:each) do
|
before(:each) do
|
||||||
|
@ -67,12 +71,21 @@ describe "A record validated with QualityTitleValidator" do
|
||||||
expect(topic).not_to be_valid
|
expect(topic).not_to be_valid
|
||||||
end
|
end
|
||||||
|
|
||||||
# describe "with a name" do
|
it "doesn't allow a meaningless title" do
|
||||||
# it "is not valid without a name" do
|
topic.title = meaningless_title
|
||||||
# subject.stub(:name => nil)
|
expect(topic).not_to be_valid
|
||||||
# subject.should_not be_valid
|
expect(topic.errors.full_messages.first).to include(I18n.t("errors.messages.is_invalid_meaningful"))
|
||||||
# subject.should have(1).error_on(:name)
|
end
|
||||||
# subject.errors[:name].first.should == "can't be blank"
|
|
||||||
# end
|
it "doesn't allow a pretentious title" do
|
||||||
# end
|
topic.title = pretentious_title
|
||||||
|
expect(topic).not_to be_valid
|
||||||
|
expect(topic.errors.full_messages.first).to include(I18n.t("errors.messages.is_invalid_unpretentious"))
|
||||||
|
end
|
||||||
|
|
||||||
|
it "doesn't allow a loud title" do
|
||||||
|
topic.title = loud_title
|
||||||
|
expect(topic).not_to be_valid
|
||||||
|
expect(topic.errors.full_messages.first).to include(I18n.t("errors.messages.is_invalid_quiet"))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue