Ruby mechanizeのtextareaの扱いでハマった

textareaを含む編集フォームで、何もいじっていないのに勝手に行頭に改行が追加されていく現象が発生したので調べてみた。

原因としては、

<textarea>
hoge
</textarea>

みたいなHTMLが帰ってきた場合に、Mechanize::Form::Textarea#value が返す値として期待していたのは、"hoge"なんだけど、実際には"\r\nhoge\r\n"が返ってきたよという話。タチが悪いことにこのままPOSTしたりすると、先頭に改行の入るデータがPOSTされてしまうという。。。

今回は対象HTMLが皆上記のようなtextareaの書き方だったので、下記の様なモンキーパッチあてて対応した。 混在している場合はどうするのが正解なのかわからない。。。Webブラウザの挙動を見る限り、"タグ直後の改行は無視する"のが鉄板のようなので、下記のコードでいいっぽいけど。

class Mechanize::Form::Textarea < Mechanize::Form::Field
  def initialize node, value = node['value']
    super
    @value.gsub!(/\r\n/, "\n")
    if @value[0] && @value[0] == "\n"
      @value.slice!(0, 1)
    end
  end
end

APIが無いWebアプリをゴニョゴニョするのは辛いねぇ。。。