1

誰かが私を助けてくれることを願っています:)

そのため、たとえばdbからのビューでutf8文字を使用すると、utf8エンコーディングで問題が発生していました。

このエラーが発生しました:

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

そしてところで、それはデータベースからのコーディングでは問題ではありませんでした。とにかく、私は私の問題の解決策を見つけました、そしてそれはでメソッドを変更することでした

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

しかし、それはデフォルトの方法を上書きしないようです。だから誰かが私に言うことができます、私は何が間違っているのですか?

4

2 に答える 2

1

「concat」はクラスメソッドではないので、その前に自分自身を必要としないので、それが私の問題でした。

解決された変更:

def self.concat(value)

に:

def concat(value)
于 2012-08-11T07:58:32.073 に答える
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
于 2019-06-13T09:45:35.750 に答える