在Ruby On Rails中修复UTF8 - 如何覆盖concat方法?

时间:2012-08-06 09:34:13

标签: methods override activesupport

希望有人能帮助我:)。

所以当我在视图中使用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

但似乎dosnt覆盖了默认方法。那么有人能告诉我,我做错了什么?

2 个答案:

答案 0 :(得分:1)

由于“concat”不是类方法,所以我不需要自我,所以这就是我的问题..

解决了改变:

def self.concat(value)

为:

def concat(value)

答案 1 :(得分:0)

上述答案的一些解决方法:

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