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
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
Ç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). –
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