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'
config/deploy/production.rb
シェルのヒストリでうっかり cap production deploy
と実行してしまう時があるので、 production 環境だけプロンプト出すことにした。
config/deploy/production.rb の先頭にこれを挿入。
require 'thor' exit unless Thor::Shell::Basic.new.yes? "This is production, are you ready? (y/N) >"
tail -f しながらエラーを探す
いつも忘れるのでメモ。
tail -f messages | sed "s/.*Error.*/i`echo -e '\e[1;31m&\e[0m'`/" | sed "s/^[^ ]*$/`echo -e '\e[1;32m&\e[0m'`/"
Rails3 で jquery-ujs だと IE で :disable_with が効かないよって話
jquery-ujs は、jQuery で Rails の JavaScript の機能を使うモノ。
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'
まあ今の用途には十分すぎるんでいいか。