attr_accessor 功能未按预期运行

attr_accessor feature not working as expected

我定义了一个 class,如下所示。但是当我 运行 格式函数时,我得到如下错误。谢谢!!!

class NonAccentVietnamese
  def initialize(str)
    @str = str
  end

  def format
    str = str.downcase
    str = str.gsub(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/, "a")
    str = str.gsub(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/, "e")
    str = str.gsub(/ì|í|ị|ỉ|ĩ/, "i")
    str = str.gsub(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/, "o")
    str = str.gsub(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/, "u")
    str = str.gsub(/ỳ|ý|ỵ|ỷ|ỹ/, "y")
    str = str.gsub(/đ/, "d")
    # Some system encode vietnamese combining accent as individual utf-8 characters
    str = str.gsub(/\u0300|\u0301|\u0303|\u0309|\u0323/, "") # Huyền sắc hỏi ngã nặng
    str = str.gsub(/\u02C6|\u0306|\u031B/, "") # Â, Ê, Ă, Ơ, Ư
    str
  end

  private

  attr_accessor :str
end
[2] pry(main)> NonAccentVietnamese.new("Ruby on Rails").format
NoMethodError: undefined method `downcase' for nil:NilClass
from /app-server/app/formats/non_accent_vietnamese.rb:7:in `format'
[3] pry(main)> 

enter image description here

你有局部变量名 str 和访问器方法 str,因此正在使用局部 str。您可以做的是:

  1. 更改局部变量的名称
  2. 更改 attr_accessor
  3. 的名称
  4. 使用@str 代替attr_accessor。

您可以使用 @str.downcaseself.str.downcase

也就是说,您应该使用 transliterate 方法:

https://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-transliterate

这样您就可以使用音译方法将非 ASCII 字符替换为 ASCII 字符:

I18n.transliterate("Über der Höhenstraße")
 => "Ueber der Hoehenstrasse"