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
ます。これを使用して、特定のパラメータをフィルタリングできます。