Railsでform_with
のテキストエリアに入力された値の前後の改行や空白を削除したい。
実装
特に難しい内容でもないので実コードを書きます。
post.rb
class Post < ApplicationRecord
validates :content, presence: true
before_save :trim_content
private
def trim_content
content.strip!
end
end
strip!
メソッドで前後の改行や空白を削除できます。
form_with
から入力した値を加工するチャンスはその他にもJavaScript
やController
内などありますが、Model
内でやるのが一番管理しやすいかと思います。
全角スペースの削除対応
ちなみに、strip
やstrip!
メソッドですが、全角スペースは対応していません。
そのため、下記のような文字列の場合は不完全な結果になってしまいます。
# 先頭に「半角スペース」「全角スペース」がある
> " あい うえaお".strip
=> " あい うえaお"
# 「半角スペース」は消えるが「全角スペース」は消えない
ので、別のメソッドを作成しました。
config/initializers/string_extension.rb
class String
# 全角スペースを含むstripメソッド
#
# @return [String] 短縮された文字列
def strip_zenkaku
gsub(/\A[ \t\r\n\f\v]*|[ \t\r\n\f\v\0]*\Z/, '')
end
# 全角スペースを含むstrip!メソッド(破壊的)
#
# @return [String] 短縮された文字列
def strip_zenkaku!
gsub!(/\A[ \t\r\n\f\v]*|[ \t\r\n\f\v\0]*\Z/, '')
end
end
やっていることはほぼstrip
メソッドと同じで、先頭または最後にある特定の文字列を削除しています。
特定の文字列と後ろの方だけ\0
があるのはリファレンスを参考にしています。
String#strip (Ruby 3.1 リファレンスマニュアル)
空白文字の定義は " \t\r\n\f\v" です。また、文字列右側からは "\0" も取り除きますが、左側の "\0" は取り除きません。
railsのinitializers
の中に定義しておけばいつでも利用できるので、参考にしてみてください。