Экранирование обратного слэша в регулярном выражении

Я хочу заменить строку в заголовке с «T8/2024» на «T9/2024»

из темы How to replace a string/character in topic title? - #11 by pfaffman

Topic.where("title LIKE '%T8/2024%'").find_each do |topic|
  topic.title.gsub!(/T8\/2024/, "T9\/2024")
  topic.fancy_title.gsub!(/T8\/2024/, "T9\/2024")
  topic.slug.gsub!(/T8\/2024/, "T9\/2024")
  puts topic.title
  begin
    topic.save!
  rescue
    puts "ой, что-то сломалось."
  end
end

Но я получаю ошибку:

SyntaxError: unexpected integer literal, expecting ')'
  topic.title.gsub!(/T8/2024/, "T9/2024")
                        ^~~~

Если слово, которое нужно заменить, содержит символ «/», как нам следует поступить?

Я не знаю наверняка, сработает это или нет.

Так как вы хотите заменить только “T8” на “T9”, может быть, стоит убрать все слэши и проверить?

В вашей ошибке синтаксиса видно, что не хватает кавычек:

SyntaxError: unexpected integer literal, expecting ')'
  topic.title.gsub!(/T8/2024/,"T9/2024")
                        ^~~~

Попробуйте этот вариант с исправленными кавычками:

Topic.where("title LIKE '%T8/2024%'").find_each do |topic|
  topic.title.gsub!("T8/2024","T9/2024")
  topic.fancy_title.gsub!("T8/2024","T9/2024")
  topic.slug.gsub!("T8/2024","T9/2024")
  puts topic.title
  begin
    topic.save!
  rescue
    puts "oops, something broke."
  end
end

Также я убрал лишний “/”.

Экранируйте его с помощью \:

[1] pry(main)> 'A title covering T8/2024'.gsub(/T8\/2024/, 'T9/2024')
=> "A title covering T9/2024"

Всё прошло гладко. Большое спасибо, :slight_smile:

Topic.where("title LIKE '%T8/2024%'").find_each do |topic|
  topic.title.gsub!(/T8\/2024/,"T9/2024")
  topic.fancy_title.gsub!(/T8\/2024/,"T9/2024")
  topic.slug.gsub!(/T8\/2024/,"T9/2024")
  puts topic.title
  begin
    topic.save!
  rescue
    puts "ой, что-то пошло не так."
  end
end