FAQ |
login

日本語の文字数制限の問題

Layer-visible-off
0
Unfavorites
0
日本語で質問をした場合に、タイトルが33文字を超えたあたりで、
「タイトルが長すぎます。50文字以内にしてください。」とでて質問できない。

英語では「"The title is too long. It should not contain more than 100 characters."」と100文字制限になっているおり、
app/models/question.rb

  validates_length_of       :title,    :minimum => 5, :maximum => 100, :message => lambda { I18n.t("questions.model.messages.title_too_long") }

コード上では100文字制限となっているので、日本語でも100文字制限になるはずだが、
日本語のメッセージだけがvalidates_length_ofがバイト単位で判定して日本語を2バイト文字と決めつけたようになっている。
実際の動作はvalidates_length_ofがバイト単位で判定されて、UTF-8で3バイトの文字の日本語を入力すると3分の1の33文字程度しか入力できない。

Shapado 3.10.7

0
correct_answer

jnunemaker-validatable-1.8.4 の validates_length_of がマルチバイト文字に対応していないようです。

shapadoはactiverecordのvalidates_length_ofではなくjnunemaker-validatableのvalidates_length_ofを使用していて、
jnunemaker-validatable の validates_length_of が文字数をlengthでカウントしていました。

以下のように修正すると日本語でも正しく文字数を扱うことができるようになりました。

validates_length_of.rb.orig 2011-05-13 16:41:05.000000000 +0900
—– validates_length_of.rb 2011-05-13 16:42:28.000000000 +0900
*****
20,30
          value = ‘’
        end
        
!       valid &&= value.length <= maximum unless maximum.nil? 
!       valid &&= value.length >= minimum unless minimum.nil?
!       valid &&= value.length == is unless is.nil?
!       valid &&= within.include?(value.length) unless within.nil?
        valid
      end
    end
! end
\ No newline at end of file
—– 20,31 ——
          value = ‘’
        end
        
!       length = value.split(//).length
!       valid &&= length <= maximum unless maximum.nil? 
!       valid &&= length >= minimum unless minimum.nil?
!       valid &&= length == is unless is.nil?
!       valid &&= within.include?(length) unless within.nil?
        valid
      end
    end
! end

answered about 1 year ago
shade3dqa 9
from Japan