【问题标题】:How do I remove invalid byte sequences from ALL data submitted to Rails?如何从提交给 Rails 的所有数据中删除无效字节序列?
【发布时间】:2026-01-04 14:15:04
【问题描述】:

我有一个在 Ruby 1.9.3 上运行的 Rails 3.2.3 应用程序。 当我尝试显示通过后端表单提交的某些字符时收到以下错误消息

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

如何过滤掉通过后端提交的所有数据上的所有不兼容的编码/无效字节序列?

谢谢!

【问题讨论】:

    标签: ruby ruby-on-rails-3 encoding


    【解决方案1】:

    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。您可以使用它来过滤某些参数。

    【讨论】: