2016-04-08 5 views
2

Formumun kurulumunu yapmaya çalışıyorum, kullanıcı "konum" açılır kutusu seçimini değiştirdiğinde, bu bölümle ilişkili kayıtların bulunduğu bir kısmi güncelleyecektir. İlgili tüm kodu ilk önce gösterilen hataya eklemek için elimden gelenin en iyisini yapacağım. Herhangi bir şey eklemeyi unuttuysam lütfen bana bildirin. (... jqXHR.responseText itibaren)Raylar 4: İç içe formlarda AJAX çağrısını nasıl yaparım?

Hata

AJAX Error: NameError in Players::Reports#update_position_specifics 

Showing ../app/views/players/reports/update_position_specifics.js.erb where line #2 raised: 
undefined local variable or method `f' for #<#<Class:0x007f9b82ebdcf8>:0x007f9b82fc8030> 

reports.coffee

$(document).on 'change', '#report_position_id', (evt) -> 
    $.ajax 'update_position_specifics', 
     type: 'GET' 
     dataType: 'script' 
     data: { 
     position_graded_id: $("#report_position_id option:selected").val() 
     } 
     error: (jqXHR, textStatus, errorThrown) -> 
     console.log("AJAX Error: #{jqXHR.responseText}") 
     success: (data, textStatus, jqXHR) -> 
     console.log("Dynamic position select OK!") 

_form.html.erb

<%= simple_form_for([@player, @report], html: {id: 'report-form'}) do |f| %> 
    <%= f.association :position, selected: @position_graded.id %> 
    <div id="position_specifics"> 
    <%= render 'form_position_specifics', f: f %> 
    </div> 
<% end %> 

_form_position_specifics.html.erb

<%= f.nested_fields_for :evaluations, 
     f.object.evaluations.target.sort_by! { |a| a.skill.order_by }, 
     wrapper_tag: :tr, wrapper_options: { class: 'fields' } do |fn| %> 
    <% # Form fields here... %> 
<% end %> 

update_position_specifics.js.erb

$("#position_specifics").empty().append("<%= escape_javascript(render partial: 'form_position_specifcs', f: f") %>") 

reports_controller.rb

def update_position_specifics 
    # remove previous/existing position specific skill from evaluations 
    @report.evaluations.joins(:skill).where(skills: { type: 'position specifcs'}).delete_all 

    # add new position specifics from specified position 
    @skills = Skill.joins(:positions).where(position_id: @position_graded.id) 

    # Add new evaluations to report 
    @skills.joins(:positions).where(positions: {id: @position_graded_id}, disabled: false).each do |skill| 
    @report.evaluations << Evaluation.new(skill_id: skill.id 
    end 

end 

cevap

1

Güncelleme Cevap

/gönderiler/new.html.erb

<%= form_for(@post, id: 'myform') do |f| %> 
    <%= f.association :pictures do |ff| %> 
    <% target = "picture-#{ff.object.id}-div-that-will-updated" %> 

    <%= ff.select :category, 'data-target': target %> 
    <%= ff.file_field :file %> 

    <!-- This is the element that will be updated when <select> above is changed --> 
    <div id='<%= target %>'></div> 
    <% end %> 
<% end %> 

javascripts/mesaj/new.js bir kullanıcı bir açılır menüden seçtiğinde Özetle

$('#myform').find('select').change(function() { 
    // get the data-target of the <select>, then load that target element with the new partially loaded (current url) target element 
    $('#' + $(this).attr('data-target')) 
    .load(window.location.href + ' #' + $(this).attr('data-target')); 
    // Take note of the space in ' #' above 
} 

, ya bu tüm işlemleri tamamlar , sayfa sadece yeniden yüklenmiştir. Ancak, tüm sayfayı yeniden yüklemek yerine, yalnızca veri hedef öğesi güncellenir. Bu ayrıca sayfadaki birden çok iç içe geçmiş kayıt için de çalışır.

+0

Bu yöntem işe yarardı, ancak veritabanıma yeni bir "konum" eklemek istediğimde her zaman yeni bir durum bildirimi eklememi gerektiriyordu. Bu yüzden cevabını doğru anlıyorsam, bunun gitmek istediğim yol olduğundan emin değilim. – daveomcd

+0

Çatışmaları önlemek için birden çok iç içe geçmiş kayıtları işlemek için yanıtımı güncelledim. Ayrıca uygulamamı "views/posts/new.js.erb" için kaldırdım ve işlemi basitleştirdim. Ancak bu basitlik nedeniyle dezavantaj, özel bir JS cevabını özelleştiremeyeceğiniz, ancak her zaman sadece kısmen yüklenmiş bir HTML cevabı olacak (ki sizin istediğinizi düşündüğünüzü düşünüyorum). –

+0

Bir şeyi özlüyor muyum yoksa bu yeni yol tüm sayfayı yeniden yükler mi? Bu, eşzamansız işlevselliğini kaldırabilir mi? – daveomcd