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
。您可以做的是:
- 更改局部变量的名称
- 更改 attr_accessor
的名称
- 使用@str 代替attr_accessor。
您可以使用 @str.downcase
或 self.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"
我定义了一个 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
。您可以做的是:
- 更改局部变量的名称
- 更改 attr_accessor 的名称
- 使用@str 代替attr_accessor。
您可以使用 @str.downcase
或 self.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"