warning: regexp match /.../n against to UTF-8 string

Ruby 1.9.2-p0 + Rails3.0.0 で rake spec や rake cucumber したときに大量に Warning が出る。

/path/to/gems/rack-1.2.1/lib/rack/utils.rb:16: warning: regexp match /.../n against to UTF-8 string

$VERBOSE=nil とすることでも抑止できるけど、ここでは escape_utils を使った。

Gemfile に追加:

gem "escape_utils", ">= 0.2.1"


追記:escape_utils は 0.2.0 以前のバージョンは問題が発生する可能性があるので、0.2.1 以降を使うようにします。

bundle install して、あとはどこかに以下の行を。(自分は config/initializers/escape_utils.rb に)

require 'escape_utils/url/rack'

Rails3 で jquery-ujs だと IE で :disable_with が効かないよって話

jquery-ujs は、jQueryRailsJavaScript の機能を使うモノ。

Rails では二重クリック防止のために、クリックしたら disabled になるようにこんなオプションがある。

<%= submit_tag '送信', :disable_with => '送信中…' %>

だが jquery-ujs を利用した環境でこう書くと、IE ではサブミットボタンが「送信中…」になるだけで、リクエストは送信されない。
これは jquery-ujs でも jQuery でもチケット登録されてる。

追記: 精査しましたが↓のパッチはまずいですね。いろいろ副作用がありすぎます。結局 :disable_with じゃなく :confirm にしてしまいました。 prototype.js にできればその方がいいかも。


現状ではパッチを書いた人がいて、この人のツリーの jQuery を使えばとりあえず IE でも動く。

今後の本家の対応に期待(?)

devise のパッチを当てるなどした

devise の挙動追ってたらこれアレがソレだよなー、ってんで github の方あたったらちょうど commit されてたのでそこだけ当てた。

https://github.com/plataformatec/devise/commit/71450998c54c9258db3fa89e212c0ad0c2f6e32a

1.1.4 まだかなー。

でも正直 devise きつい。ライトに使うにはいいかもしれんのだけども、今のプロジェクトだと warden 素で使う方がいいかもって勢い。

UTF-8 以外のエンコーディングで render

Rails3 は基本 UTF-8 縛り。だけど、外部との通信が絡むページとかだと cp932 とかで出力しないといけなかったりする。

そこで ApplicationController あたりに対応コードを追加する。

  def render_with_encoding(*options)
    if options[-1].is_a?(Hash) && (encoding = options[-1][:encoding])
      headers["Content-Type"] = "text/html; charset=#{encoding}"
      render_without_encoding :text => render_to_string.encode(encoding, :invalid => :replace)
    end
  end
  alias_method_chain :render, :encoding

これで普通の HTML に関しては下のようにしていけるんだけど、Content-Type 決め打ちなんで他のフォーマットに適用するのが難しい。

  render :action => 'new', :encoding => 'cp932'

まあ今の用途には十分すぎるんでいいか。