質問編集履歴

1

解決したいことを(1)(2)に分けて、実装内容とその結果を記述

2021/01/04 07:56

投稿

shawn_709
shawn_709

スコア13

test CHANGED
File without changes
test CHANGED
@@ -28,15 +28,227 @@
28
28
 
29
29
 
30
30
 
31
- ###試したこと・調べたこと
31
+ ###試したこと・調べたこと(1) #解決済
32
32
 
33
33
  [改行が2文字でカウントされてバリデーションが正しく動作しない件](https://qiita.com/yosaprog/items/08ff851bb12bca9536fa)
34
34
 
35
+ を参考に、改行を1文字カウントになるように実装。
36
+
37
+
38
+
39
+ ```model
40
+
41
+ #tweet
42
+
43
+ class Tweet < ApplicationRecord
44
+
45
+ belongs_to :group
46
+
47
+ belongs_to :user
48
+
49
+ has_one_attached :image
50
+
51
+
52
+
53
+ validates :content, presence: true, unless: :was_attached?
54
+
55
+ validates :content, length: { maximum: 50 }
56
+
57
+
58
+
59
+ def was_attached?
60
+
61
+ self.image.attached?
62
+
63
+ end
64
+
65
+ end
66
+
67
+ ```
68
+
69
+ の状態でツイート投稿ページで以下のように入力したら投稿できなかった。
70
+
71
+ **改行が2文字カウントされていることを確認できた。**
72
+
73
+ ```
74
+
75
+ 1234567890↵ (↵ = 改行)
76
+
77
+ 1234567890↵
78
+
79
+ 1234567890↵
80
+
81
+ 1234567890↵
82
+
83
+ 123456
84
+
85
+ ```
86
+
87
+ そこで以下のように実装した。
88
+
89
+ ```model
90
+
91
+ #tweet
92
+
93
+ (省略)
94
+
95
+ validates :content, presence: true, unless: :was_attached?
96
+
97
+ validates :content, correct_line_break: { maximum: 50 } #この部分を変更
98
+
99
+ (省略)
100
+
101
+ ```
102
+
103
+ modelsディレクトリ内にvalidatorsディレクトリを作成しその中にcorrect_line_break_validator.rbファイルを作成し、以下を記入。
104
+
105
+ ```model
106
+
107
+ #validators/correct_line_break_validator.rb
108
+
109
+ class CorrectLineBreakValidator < ActiveModel::EachValidator
110
+
111
+ def validate_each(record, attribute, value)
112
+
113
+ text_length = value&.count("^\r\n") || 0
114
+
115
+ break_length = value&.scan("\r\n")&.length || 0
116
+
117
+ correct_text_length = text_length + break_length
118
+
119
+ record.errors.add(attribute, "#{options[:maximum]}文字以内で入力してください") if correct_text_length > options[:maximum]
120
+
121
+ end
122
+
123
+ end
124
+
125
+ ```
126
+
127
+ 以下のエラー文が出た。
128
+
129
+ ```
130
+
131
+ ArgumentError in TweetsController#new
132
+
133
+ Unknown validator: 'CorrectLineBreakValidator'
134
+
135
+ ```
136
+
137
+ そこで**correct_line_break_validator.rbをmodelsディレクトリの直下に配置**。
138
+
139
+ エラー文がなくなり、実装することができた。
140
+
141
+
142
+
143
+ ###試したこと・調べたこと(2) #未解決
144
+
35
- [全角文字を文字として文字数をカウントする](https://www.d-wood.com/blog/2017/05/11_8932.html)
145
+ [全角1文字を半角2文字としてカウントするvalidator](https://nkmrshn.hatenablog.com/entry/20110704/1309775411)
146
+
36
-
147
+ 文字数制限を3に設定して実装。
148
+
149
+ ```model
150
+
151
+ #tweet
152
+
153
+ validates :content, correct_line_break: { maximum: 3 }
154
+
155
+ ```
156
+
157
+
158
+
159
+ modelsディレクトリ内にlength_with_wide_char_validator.rbファイルを作成
160
+
161
+ ```model
162
+
163
+ #length_with_wide_char_validator.rb
164
+
165
+ class LengthWithWideCharValidator < ActiveModel::EachValidator
166
+
167
+ def validate_each(object, attribute, value)
168
+
169
+ count = 0
170
+
171
+ value.split(//).each do |v|
172
+
173
+ v.bytesize > 1 ? count += 2 : count += 1
174
+
175
+ end
176
+
177
+ end
178
+
179
+ end
180
+
181
+
182
+
183
+ #tweet
184
+
185
+ class Tweet < ApplicationRecord
186
+
187
+ belongs_to :group
188
+
189
+ belongs_to :user
190
+
191
+ has_one_attached :image
192
+
193
+
194
+
195
+ validates :content, presence: true, unless: :was_attached?
196
+
197
+ validates :content, correct_line_break: { maximum: 3 }
198
+
199
+ validates :content, length_with_wide_char: { maximum: 3 }
200
+
201
+
202
+
203
+ def was_attached?
204
+
205
+ self.image.attached?
206
+
207
+ end
208
+
209
+ end
210
+
211
+ ```
212
+
213
+ 以上の記述をして、以下のように入力。
214
+
215
+ ```
216
+
217
+ 1234
218
+
219
+ ※半角数字4文字は投稿できない。(maximum: 3が有効だと確認できる)
220
+
221
+ ```
222
+
223
+ ```
224
+
225
+ あいう
226
+
227
+ ※全角3文字でも投稿できる。
228
+
229
+ ```
230
+
37
- 以上の2つを見実装してみました、よく理解できませんでした。
231
+ 以上のことから全角1文字が半角文字扱いできいないこと確認できた。
232
+
38
-
233
+ 他にも
234
+
235
+ ```model
236
+
237
+ #application_record.rb
238
+
239
+ require 'length_with_wide_char_validator' #これを記述
240
+
241
+
242
+
243
+ class ApplicationRecord < ActiveRecord::Base
244
+
39
- 全く違う形のやり方があればそちらでも構いません。
245
+ self.abstract_class = true
246
+
247
+ end
248
+
249
+ ```
250
+
251
+ をしたが「全角3文字」でも投稿できてしまいました。全角1文字を半角2文字扱いできるように実装したいです。
40
252
 
41
253
 
42
254