2007年7月4日 星期三

在Rails裡用AJAX Observers

Rails預設即有內建prototype.js,並提供一些語法操作prototype.js,會將rails code轉為prototype的function call。參照“Agile Web Development with Rails” ch18,有用Observer實作livesearch的例子,但這份code有點小問題。

in observe.rhtml:

<label for="search">Search term:</label> <%= text_field_tag :search %> <%= observe_field(:search, :frequency => 0.5, :update => :results, :with => 'term', :url => { :action => :search }) %> <div id="results"></div>

注意observe_field()要放在追蹤的field_id之後,observe_field()放到text_field_tag()之前會失效。

in xxx_controler.rb:

def search @phrase = request.raw_post || request.query_string ... end

這段code裡的request.raw_post會從POST取得form內的資料,但如同raw_post的名稱一般,它取得的是如同GET後附上”var=value”的內容,並且,observe_field()會把追蹤的field_id內的內容取來當做key,若使用者在text field裡輸入”hello”,raw_post內的值會是”hello=”,而不是預想的”search=hello”

因此,解決方法有兩種:

  1. 修改controller:改成request.raw_post[0,request.raw_post.length-1],去掉’=’
  2. 修改view (observe.rhtml):改成

    <%= observe_field(:search, :frequency => 0.5, :update => :results, :with => 'search', :url => { :action => :search }) %>

    參照官方文件,:with會補上key值,再將追蹤的field_id內的值填入key內。

照理說,預設把追蹤的field_id和它的值設為”field_id=value”再傳給:url指定的method才合理吧?

沒有留言:

張貼留言