0

Ruby 2 と Rails 4 を実行する Web アプリケーションと、非常に複雑なフォームがあります。私がやろうとしているのは、ネストされたフォームとチェーンされた選択を組み合わせることです。問題は、ネストされたリソースのフィールドがその場で作成され、日付と時刻の一意の組み合わせが与えられることですが、私の JavaScript では、どの選択が他のどの選択にチェーンされているかを定義する必要があります。

私のコンセプトに使用した 2 つのチュートリアルは次のとおりです http://homeonrails.blogspot.de/2012/01/rails-31-linked-dropdown-cascading.html モデルフォーム改訂

しかし、重要なコードは基本的に 3 つの異なるファイルにあります。

  $(document).ready(function(){
    $('select#device_name').chainedTo('select#room_name');
  });

これは、1 つの選択を別の選択に連結し、フォーム テンプレートまたは field_partial でレンダリングできます。

ヘルパー メソッドは次のようになります。

  def link_to_add_fields(name, f, association)
    new_object = f.object.send(association).klass.new
    id = new_object.object_id
    fields = f.fields_for(association, new_object, child_index: id) do |builder|
      render(association.to_s.singularize + "_fields", f: builder)
    end
    link_to(name, '#', class: "add_fields", data: {id: id, fields: fields.gsub("\n", "")})
  end

そして最後になりましたが、コーヒー スクリプトは次のとおりです。

jQuery ->
  $('form').on 'click', '.remove_fields', (event) ->
    $(this).prev('input[type=hidden]').val('1')
    $(this).closest('fieldset').hide()
    event.preventDefault()

  $('form').on 'click', '.add_fields', (event) ->
    time = new Date().getTime()
    regexp = new RegExp($(this).data('id'), 'g')
    $(this).before($(this).data('fields').replace(regexp, time))
    event.preventDefault()

したがって、これがどのように機能するかについての私の理解は、ボタンをクリックすると、ヘルパー メソッドが新しい関連付けを作成し、ID を取得し、パーシャルから html をレンダリングし、コーヒー スクリプトがオブジェクトの ID を現在の日時に置き換えるだけです。そのため、同じ ID を持たなくても複数の関連付けを追加できます。

問題は、チェインされた関数の JavaScript を変更して、選択ボックスの ID を取得する方法です。現在、コフェスクリプトから日時を受け入れる動的な JavaScript を作成する方法や、それらをJavaScriptで検索し、自分自身を変更します。

ヘルプやヒントをいただければ幸いです。

4

1 に答える 1

0

ええ、解決策は予想通り簡単でした。次のコマンドを使用すると、ネストされたリソースの子インデックスを取得できます。

<%= f.object_name.gsub(/[^0-9]+/,'') %>

そして、このインデックスを JavaScript に渡して、2 つの選択を互いに連鎖させることができます。

  $(document).ready(function(){
    $('select#device_attributes_<%= f.object_name.gsub(/[^0-9]+/,'') %>_name').chainedTo('select#room_attributes_<%= f.object_name.gsub(/[^0-9]+/,'') %>_name');
  });
于 2013-11-22T13:45:46.233 に答える