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」変える。で、さらに value がUTF-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
これにて、対処完了。