1
Help us understand the problem. What are the problem?

posted at

updated at

【Rails】フォーム送信した値の前後空白改行を削除する(全角スペース削除対応)

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から入力した値を加工するチャンスはその他にもJavaScriptController内などありますが、Model内でやるのが一番管理しやすいかと思います。

全角スペースの削除対応

ちなみに、stripstrip!メソッドですが、全角スペースは対応していません。
そのため、下記のような文字列の場合は不完全な結果になってしまいます。

# 先頭に「半角スペース」「全角スペース」がある
> "  あい  うえ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の中に定義しておけばいつでも利用できるので、参考にしてみてください。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
1
Help us understand the problem. What are the problem?