2

Ruby 1.9.3 で実行されている Rails 3.2.3 アプリがあります。バックエンド フォームから送信された特定の文字を表示しようとすると、次のエラー メッセージが表示されます

ActionView::Template::Error (incompatible encoding regexp match (UTF-8 regexp with ASCII-8BIT string))

バックエンドから送信されたすべてのデータで、互換性のないエンコーディング/無効なバイト シーケンスをすべて除外するにはどうすればよいですか?

ありがとう!

4

1 に答える 1

0

before_filterインについてはどうですかApplicationController

このモジュール メソッドは、ハッシュ内のすべての値を再帰的に反復し、それらをブロックによって返された値に置き換える必要があります。

module RecurseHash
  def recurse!(&blk)
    __recurse(self, &blk) if block_given?
  end

  private
  def __recurse(obj, &blk)
    if obj.is_a? Array
      obj = obj.map { |val| __recurse(val, &blk) }
    elsif obj.is_a? Hash
      obj.each_pair { |key, val| obj[key] = __recurse(val, &blk) }
    else
      obj = blk.call(obj)
    end
    obj
  end
end

class Hash
  include RecurseHash
end



class ApplicationController < ActionController::Base
  before_filter :force_utf8

  def force_utf8
    params.recurse! do |val|
      val.force_encoding 'UTF-8'
    end
  end
end

例:

h = {:one=>1, :two=>2, :three=>[1, 2, 3, 4, 5], :four=>[6, {:a=>1, :b=>2}, 7]}

h.recurse! { |v| v * 2 }

# {:one=>2, :two=>4, :three=>[2, 4, 6, 8, 10], :four=>[12, {:a=>2, :b=>4}, 14]}

注:ブロックが何も返さない場合、値は に置き換えられnilます。これを使用して、特定のパラメータをフィルタリングできます。

于 2012-05-30T11:37:35.867 に答える