gsubメソッド
gsubメソッドとは
対象の文字列にマッチした全ての箇所を指定の文字列に変更する
ex
num = "1-2-3" # 置き換え前 p num.gsub(/-/,"") # 置き換え後 結果:123
gsub!もある
変数に格納された文字列などのオブジェクトを変更できる
ex
num = "1-2-3" # 置き換え前 p num.gsub(/-/,"") # 置き換え後 結果:123
何が違うの?
gsubは一時的にしか変更できない。
num = "1-2-3" # 置き換え前 p num.gsub(/-/,"") # 置き換え後 p num # 置き換え後 結果:123 :1-2-3
gsub!は破壊的メソッドなのでレシーバー自体を変更できる
num = "1-2-3" # 置き換え前 p num.gsub(/-/,"") # 置き換え後 p num # 置き換え後 結果:123 :123
私が使用した例
カラム
add_column :users, :week, :string, array: true
controller
def edit $days_of_the_week = %w{月 火 水 木 金 土 日 祝 長期休み } @week_day = $days_of_the_week end private def care_user_params params.require(:user).permit(week:[]) end
erb
<%= f.label :week, class: "label-user-edit" %> <% @week.each do |week| %> <%= f.check_box :week,{ multiple: true,checked: @user.week.present? ? @user.week.include?(week) : false }, week, nil %> <span><%= week %></span> <% end %>
複数チェックボックスを更新する際に配列故に下記のように保存されてしまう。。。
[["week", "[\"月\", \"火\", \"水\"]"] 結果:["月","火","水"]
gusb!使用
model
before_save do self.week.gsub!(/[\[\]\"]/, "") if attribute_present?("week") end セーブ前にgusb!によって、[\[\]\"]を""に変更 結果:月,火,水