ご回答いただけるとありがたいです。よろしくお願いします!
実現したいこと
ツイート機能があるアプリを作成しています。
ツイートを投稿する時、400文字以内というバリデーションを設定しています。
しかし以下の条件のように、入力する文字に合わせて文字カウントを変更したいです。
・全角英数字と日本語は2文字扱い(全て日本語で入力した場合、最大文字数が200文字)
・半角英数字と改行は1文字扱い
現状
model
1#tweet 2validates :content, length: { maximum: 400 }
###試したこと・調べたこと(1) #解決済
改行が2文字でカウントされてバリデーションが正しく動作しない件
を参考に、改行を1文字カウントになるように実装。
model
1#tweet 2class Tweet < ApplicationRecord 3 belongs_to :group 4 belongs_to :user 5 has_one_attached :image 6 7 validates :content, presence: true, unless: :was_attached? 8 validates :content, length: { maximum: 50 } 9 10 def was_attached? 11 self.image.attached? 12 end 13end
の状態でツイート投稿ページで以下のように入力したら投稿できなかった。
改行が2文字カウントされていることを確認できた。
1234567890↵ (↵ = 改行) 1234567890↵ 1234567890↵ 1234567890↵ 123456
そこで以下のように実装した。
model
1#tweet 2(省略) 3 validates :content, presence: true, unless: :was_attached? 4 validates :content, correct_line_break: { maximum: 50 } #この部分を変更 5(省略)
modelsディレクトリ内にvalidatorsディレクトリを作成しその中にcorrect_line_break_validator.rbファイルを作成し、以下を記入。
model
1#validators/correct_line_break_validator.rb 2class CorrectLineBreakValidator < ActiveModel::EachValidator 3 def validate_each(record, attribute, value) 4 text_length = value&.count("^\r\n") || 0 5 break_length = value&.scan("\r\n")&.length || 0 6 correct_text_length = text_length + break_length 7 record.errors.add(attribute, "#{options[:maximum]}文字以内で入力してください") if correct_text_length > options[:maximum] 8 end 9end
以下のエラー文が出た。
ArgumentError in TweetsController#new Unknown validator: 'CorrectLineBreakValidator'
そこでcorrect_line_break_validator.rbをmodelsディレクトリの直下に配置。
エラー文がなくなり、実装することができた。
###試したこと・調べたこと(2) #未解決
全角1文字を半角2文字としてカウントするvalidator
文字数制限を3に設定して実装。
model
1#tweet 2validates :content, correct_line_break: { maximum: 3 }
modelsディレクトリ内にlength_with_wide_char_validator.rbファイルを作成
model
1#length_with_wide_char_validator.rb 2class LengthWithWideCharValidator < ActiveModel::EachValidator 3 def validate_each(object, attribute, value) 4 count = 0 5 value.split(//).each do |v| 6 v.bytesize > 1 ? count += 2 : count += 1 7 end 8 end 9end 10 11#tweet 12class Tweet < ApplicationRecord 13 belongs_to :group 14 belongs_to :user 15 has_one_attached :image 16 17 validates :content, presence: true, unless: :was_attached? 18 validates :content, correct_line_break: { maximum: 3 } 19 validates :content, length_with_wide_char: { maximum: 3 } 20 21 def was_attached? 22 self.image.attached? 23 end 24end
以上の記述をして、以下のように入力。
1234 ※半角数字4文字は投稿できない。(maximum: 3が有効だと確認できる)
あいう ※全角3文字でも投稿できる。
以上のことから全角1文字が半角2文字扱いできていないことが確認できた。
他にも
model
1#application_record.rb 2require 'length_with_wide_char_validator' #これを記述 3 4class ApplicationRecord < ActiveRecord::Base 5 self.abstract_class = true 6end
をしたが「全角3文字」でも投稿できてしまいました。全角1文字を半角2文字扱いできるように実装したいです。
以上になります。ご助言いただけると幸いです。
回答1件
あなたの回答
tips
プレビュー