0

私の質問の言い回しではこれは不可能だと思いますが、探している結果を得る方法はありますか。

Rails 3.2 アプリには、City フィールドと Location フィールドを含むフォームがあります。

<%= f.select :city, City.all, :prompt => "Select..." %>
<%= f.input :location_name, :input_html => {    data:{ autocomplete_source: Location.order(:name).map(&:name) } } %>

場所フィールドは、Twitter Bootstrap の先行入力機能を使用して、エントリのオートコンプリート リストを表示します。

ロケーションは都市に属します。ユーザーが選択した都市の値に基づいて、オートコンプリート エントリのリストをフィルター処理したいと考えています。

基本的に、動的に変更する必要があります

... autocomplete_source: Location.order(:name).map(&:name) ...

... autocomplete_source: Location.where('city_id => ?', '@myform.city.id').order(:name).map(&:name) ...

coffeescript では、次のようなことができます。

jQuery -> 
  $('#myform_city_id').change ->
    $('#myform_location_name').attr('data-autocomplete-source','#{Location.where(city_id: @myform.city_id).order(:name).map(&:name)}')

ただし、アクティブ レコード クエリは呼び出されず、単に文字列として渡されます。

この autocomplete-source 属性を新しいクエリで動的に変更する最良の方法は何ですか?

4

2 に答える 2

1

Javascript はクライアント側にあり、Ruby はサーバー側で実行されているため、これを行うことはできません。このため、Javascript は Ruby を「認識」しません (ERB は少し異なります。クライアントが受け取る前に HTML に変換されます)。Ajax solicitationを通じてこれを行うことをお勧めします。

より良い説明: 必要なものの JSON 表現を提供するコントローラーからアクションを作成します (既存のコントローラーでもかまいませんが、JSON として送信します)。このコントローラーを Ajax 経由で呼び出し:remote => trueます (リンクで使用)。次のように、そのリンクから ajax:complete 応答イベントを関数にバインドします。

$("#link_id").bind "ajax:complete", (e, xhr, settings) ->
    #TODO function body goes here

またはこれ:

$("#link_id").bind "ajax:complete", functionName

この関数内で JSON を解析し、jQuery.parseJSON(xhr.responseText)このデータで必要なことを行います。複雑に見えますが、実は単純です。

于 2012-06-30T16:13:11.057 に答える
0

Coffeescriptの名前をfilename.js.coffeeからfilename.js.coffee.erbに変更します。次に、次のようなことを行うことができます。

jQuery -> 
  $('#myform_city_id').change ->
    $('#myform_location_name').attr('data-autocomplete-source','<%= Location.where(city_id: @myform.city_id).order(:name).map(&:name) %>')
于 2012-07-21T06:00:37.763 に答える