2009-08-07 3 views
3

私のアプリケーションでは、ユーザはオートコンプリートテキストフィールドから駅を選びます。多くの列車駅がないので(〜100)、ユーザーが文字を入力するたびにサーバーに照会するのではなく、クライアント側配列の内容に基づいてフィールドをオートコンプリートすることをお勧めします(目的はオートコンプリートがより反応的です)。Railsでローカルデータを使用したオートコンプリート

私の質問は、これをRailsでメンテナンス可能でハッピーではない方法で行う方法です。私の現在のソリューションは、ちょうどindex.html.erbの下部に次の行を入れている:

<%= javascript_tag "var stations = #{Station.all.map {|s| s.name}.to_json}" %> 

が、これは素晴らしいではありません(私はapplication.jsに取り組んでいながら、一つには、私は「ステーション」変数名を覚えておく必要があり) 。

答えて

1

application.jsで、ドキュメントの準備ができたら、ajax呼び出しを実行してローカル配列に値を入力します。 (私は今jrailsを通じてjQueryを使用して)

document.observe("dom:loaded", function() { 
    var stations; 
    new Ajax.Request(url, { 
    method: 'get', 
    onSuccess: function(transport) { 
     stations = transport.responseText; 
    } 
    }); 
}); 

私の例では、完璧に動作しない場合がありますが、それは右の印象を与える必要があります。

2

動的に生成されるJavascriptビューファイルをhow I show hereに似せることができます。

基本的にコントローラーの操作(javascriptsコントローラーのステーションアクションなど)がある場合。このように見えるかもしれません。

# in controllers/javascripts_controller.rb 
def stations 
    @stations = Station.all 
end 

あなたは、このようなJavaScriptのビューファイルを作ることができます...

// in views/javascripts/stations.js.erb 
var stations = <%= @stations.map(&:name).to_json %>; 
// ... 

javascriptのそのファイルあなたはおそらくそこapplication.jsコードの一部を移動することができますので、あなたが好きなのjavascript含めることができます。これを他のjavascriptファイルと同様に含めることができます。

<%= javascript_include_tag 'stations' %> 

これは、あなたがJavaScriptのコントローラを持っている場合はケースであることを起こる「JavaScriptの」パスの下にあります前提としています。それ以外の場合は、完全なパスを渡す必要があります。

これは、Railsアプリケーションにもう一度リクエストすることで欠点がありますが、そのjsアクションにページキャッシュを追加して最適化することができます。

+0

この問題は、サーバー側のコードを公開されている場所に置く可能性があることが原因です。 –

+0

stations.js.erbビューファイルはパブリックディレクトリにありません。それは他のテンプレートのビューの下にあります。他のテンプレートと同じように公開する必要はありません。 – ryanb

+0

この回答はまだ有効ですか?私はそれが動作するように見えることはできません:\ – jon