Поиск по этому блогу

10 августа 2011 г.

Rails UTF

очередной баг не давал мне покоя
при попытке доступа на адрес с добавленным %d0 в конце урла вызывал:
A PGError occurred in news_posts#index:

 incomplete multibyte character

 activerecord (3.0.9) lib/active_record/connection_adapters/postgresql_adapter.rb:362:in `escape_string'
 а искаверканный третьей стороной урл, приходивший, например в koi8-r вызывал
A ActionView::Template::Error occurred in news_posts#show:

 invalid byte sequence in UTF-8
 actionpack (3.0.9) lib/action_dispatch/routing/route_set.rb:418:in `split'
самое смешное, с этой проблемой сталкиваются нечасто, и я, быть может, первый, потому как любая ошибка 500 приходит мне на мыло
поэтому лекарство пришлось делать самому:
app/middleware/utf_fixer.rb
require 'rack/utils'
require 'iconv'
class UtfFixer
  def initialize(app)
    @app = app
  end

  def call(env)
    request = Rack::Request.new(env)
    env['REQUEST_URI'] = my_converter(env['REQUEST_URI'])
    env['PATH_INFO'] = my_converter(env['PATH_INFO'])
    @app.call(env)
  end
 
  def my_converter(string)
    Iconv.new('UTF-8//IGNORE', 'UTF-8').iconv(Rack::Mount::Utils.unescape_uri(string) + '  ')[0..-3]
  end
end
и где-нибудь в инициализаторах нечто вроде
Rails.application.config.middleware.insert_before(
  ActionDispatch::Session::CookieStore,
  UtfFixer)