【问题标题】:UTF8 fix in Ruby On Rails - how to iverride concat method?Ruby On Rails 中的 UTF 8 修复 - 如何覆盖 concat 方法?
【发布时间】:2012-08-06 09:34:12
【问题描述】:

希望有人能帮助我:)

所以我在使用 utf8 字符时遇到了 utf8 编码问题,例如,来自 db..

我收到了这个错误:

incompatible character encodings: ASCII-8BIT and UTF-8

顺便说一句,从 db 编码不是问题.. 无论如何,我找到了解决我的问题的方法,那就是改变方法

Ruby193\lib\ruby\gems\1.9.1\gems\activesupport-3.2.6\lib\active_support\core_ext\string\output_safety.rb

我改变的方法是“concat”。所以我改变了这个方法:

def concat(value)
  if !html_safe? || value.html_safe?
    super(value)
  else
    super(ERB::Util.h(value))
  end
end
alias << concat

到这里:

def concat(value)
  value = (value).force_encoding('UTF-8')
  if !html_safe? || value.html_safe?
    super(value)
  else
    super(ERB::Util.h(value))
  end
end
alias << concat

但当然这是个坏主意,因为该应用无法在其他服务器上运行..

所以我想从我的初始化程序中重写这个方法,所以我创建了:

config/initializers/utf8_fix.rb

使用此代码:

module ActiveSupport #:nodoc:
  class SafeBuffer < String
    def self.concat(value)
      value = (value).force_encoding('UTF-8')
      puts "--------------------------------"
      puts "Loaded concat in utf8fix.rb"
      puts "--------------------------------"
      if !html_safe? || value.html_safe?
        super(value)
      else
        super(ERB::Util.h(value))
      end
    end
    alias << concat
  end
end

但它似乎并没有覆盖默认方法。那么有人可以告诉我,我做错了什么吗?

【问题讨论】:

    标签: methods overriding activesupport


    【解决方案1】:

    因为“concat”不是类方法,所以我在它之前不需要 self,所以这是我的问题..

    解决了变化:

    def self.concat(value)
    

    到:

    def concat(value)
    

    【讨论】:

      【解决方案2】:

      对上述答案的一些修复:

      module ActiveSupport #:nodoc:
          class SafeBuffer < String
              def concat(value)
                if value.is_a?String
                  value = value.dup if value.frozen?
                  value = (value).force_encoding('UTF-8')
                  puts "--------------------------------"
                  puts "Loaded concat in utf8fix.rb"
                  puts "--------------------------------"
                end
                if !html_safe? || value.html_safe?
                  super(value)
                else
                  super(ERB::Util.h(value))
                end
            end
            alias << concat
          end
        end
      

      【讨论】:

      • 欢迎您。请详细说明你的答案。说出您的建议并解释为什么它是正确的解决方案。
      • 覆盖方法可能得不到预期的字符串类型,所以我把 .is_a 放在了检测。否则,什么都没有改变。另一个问题是字符串可能会冻结,所以我创建了一个克隆来处理 UTF8 转换。
      猜你喜欢
      • 2012-07-08
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多