Rails1.2.1で observe_fieldが動作しなくなった

Rails 1.1.6 で動いていた observe_field が Rails1.2 で動かなくなっていたので調査。

【view】
    <div id="search_field">
        <label for="ajax_search">favorite search</label>
        <%= text_field_tag :ajax_search %>
        <%= observe_field(:ajax_search ,
                :frequency=>0.5,
                :update => :result_list,
                :url => {:controller=>'favorite',:action=>'ajax_search_favorites_by_name'})
        %>
    </div>
    <br />
    <div id="result_list"></div>

【controller】
 def ajax_search_favorites_by_name
    phrase = request.raw_post || request.query_string
    like_phrase = "%" + phrase + "%"
    @favorites = Favorite.find(:all ,:conditions=>["name like ? ",like_phrase])
    render :layout => false
  end

 これを Rails 1.2.1 上で動かすと・・・
[phrase = request.raw_post || request.query_string]の部分の後に、"="がくっついていて何もHITしないSQLが実行される。これは、observer_fieldが「value=」の形式で(下記の場合、[a=])パラメータを渡していることに起因している。

【observe_fieldに"a"を入れた場合】
 phrase = request.raw_post || request.query_string
  => "a="
  SQL[select * from favorite where name like '%a=%' ;]

対処方法:
(1) observe_field からURLのパラメータ形式を「name=value」変える。で、さらに valueUTF-8や"="の場合にも対応できるように、encodeしちゃう。

【view】
    <div id="search_field">
        <label for="ajax_search">favorite search</label>
        <%= text_field_tag :ajax_search %>
        <%= observe_field(:ajax_search ,
                :frequency=>0.5,
                :update => :result_list,
                :with => "'phrase=' +encodeURIComponent(value)", ## この行で name=value に
        :url => {:controller=>'favorite',:action=>'ajax_search_favorites_by_name'})
        %>
    </div>
    <br />
    <div id="result_list"></div>

(2) controllerの受け側でのパラメータを name=value 形式で受け取る(params[:phrase]にて参照できる)。さらに、decodeする。

【controller】
 require 'uri'    # 追加

  def ajax_search_favorites_by_name
    phrase = URI.decode(params[:phrase])   ## :params[:phrase]をuridecodeして受け取る
    like_phrase = "%" + phrase + "%"
    @favorites = Favorite.find(:all ,:conditions=>["name like ?",like_phrase])
    render :layout => false
  end

これにて、対処完了。