r66  2021/05/12更新

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!によって、[\[\]\"]を""に変更

結果:月,火,水
タイトルとURLをコピーしました