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_filterApplicationController

这个模块方法应该递归地遍历哈希中的所有值,并将它们替换为块返回的值。

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 回答