observe_fieldはPrototypeなのでRails3では標準でサポートしない

Ruby on Railsで大好きな機能の一つだったのに使えなくなっていた。悲しい。
 

これは解決しなかった

泣いていては解決しなのでUnobtrusive JavaScript in Rails 3を参照する

Rails2のころ

<%= text_field_tag :search %>
<%= observe_field :search, :url => live_search_path, :update => :results %>

Rails3はjQueryで何とかする

// Append the function to the "document ready" chain
jQuery(function($) {
  // when the #search field changes
  $("#search").change(function() {
    // make a POST call and replace the content
    $.post(<%= live_search_path %>, function(data) {
      $("#results").html(data);
    });
  });
})
  • ページ読み込み時に実行
  • id="search"が変わった
  • 値をコントローラーのlive_search_pathにぶん投げて
  • 帰ってきたdataをid="result"にブチ込む

日本語化すると実に簡単に思えてくるから不思議だ。
 
まったく動かないので検索して数時間が経つけど改善しないな、、般若心経を書いているような結果しか見つけられない。
 

こっちは解決できた

こんなのを見つけた。
jQueryでobserve_field的なことを。
これを参考にして作る。

app/views/hoge/new.html.erb

<%= f.autocomplete_field :member_name, autocomplete_member_member_name_requests_path, :id_element=>'#hoge_member_id' -%>
<%= f.hidden_field :member_id -%>

オートコンプリートも使っている。

app/assets/javascripts/application.js

$(document).ready(function(){
  $("#hoge_member_name").change(function(){
     var member_id = $("#hoge_member_id").val();
     $.get("live_search_member?member_id=" + member_id);
  });
});

jQueryでイベントを監視している。changeの他にblurとかfocusとか使い分けるといいかな?


app/controllers/hoge_controller.rb

def live_search_member
  @hoges = Hoge.where("member_id = ?", params[:member_id])
  render
end

name(文字列)じゃなくてid(数値)で検索している。なんとなく早そうだし。

app/views/hoge/live_search_member.js.erb

$("#member_results").html("<%= escape_javascript(render :partial=>'live_member', :member_id=>params[:member_id])%>");

javascriptでerbなファイルはescape_javascriptを使って式展開する。

app/views/hoge/_live_member.html.erb

<p>hoge</p>

「render :partial=>'live_member'」なのでファイル名の先頭に「_
」をつけること。