2017-01-02 5 views
0

Ich habe ein AtpRank Modell mit den ersten 100 Atp Tennisspieler.
Mein Ziel ist es, in der Ansicht eine Tabelle zu erstellen, die alle Tennisspieler und ihre Attribute zusammen mit einer Schaltfläche für jeden Spieler auflistet, die für den Benutzer nützlich ist, um eine Liste von Tennisspielern auszuwählen. Der home.html.erb Code ist unten:Ajax funktioniert nicht in Iteration

<% @atp_ranks.each do |tennis_player| %> 
    <tr id="tennist-<%= tennis_player.ranking %>"> 
    <td class="atpranking"> <%= tennis_player.ranking %> </td> 
    <td class="atpname"> <%= tennis_player.name %> </td> 
    <td class="atppoints"> <%= tennis_player.points %> </td> 
    <% unless Time.now.month == 12 %> 
     <td> 
     <div id="atpenlist_form"> 
      <% if current_user.atpenlisted?(tennis_player) %> 
      <%= form_for(current_user.atp_selections.find_by(atp_rank_id: tennis_player.id), 
               html: { method: :delete }, remote: true) do |f| %> 
       <%= f.submit "Dump", class: "btn btn-warning btn-sm" %> 
      <% end %> 
      <% else %> 
      <%= form_for(current_user.atp_selections.build, remote: true) do |f| %> 
       <div><%= hidden_field_tag :atp_id, tennis_player.id %></div> 
       <%= f.submit "Choose", class: "btn btn-primary btn-sm" %> 
      <% end %> 
      <% end %> 
     </div> 
     </td> 
    <% end %> 
    </tr> 
<% end %> 

Wie Sie sehen können, das Formular verwendet Ajax remote: true im form_for Helfer eingestellt zu haben. Anforderungen werden von der atp_selections Controller behandelt. Im Folgenden ein Auszug aus der Wirkung dieser Controller erstellen:

current_user.atpenlist(tennist) 
    respond_to do |format| 
     format.html { redirect_to root_url } 
     format.js 
    end 

Die destroy Aktion verwendet die atpdiscard Methode anstelle der atpenlist Methode.
In app/views/atp_selections habe ich die create.js.erb und destroy.js.erb Dateien erstellt.
Unten ist die app/views/atp_selections/create.js.erb Datei:

$("#atpenlist_form").html("<%= escape_javascript(render('users/atpdiscard')) %>"); 
$("#atp_count").html('<%= current_user.atp_ranks.count %>'); 

Jede der app/view/users/_atpenlist.html.erb und app/view/users/_atpdiscard.html.erb partials enthalten die jeweilige Form (exakt das gleiche Teil des Codes mit form_for oben beginnend).

Ich muss sagen, dass ich in den ursprünglichen Code für die Homepage nicht explizit den gesamten Code für die Formulare enthalten, aber ich habe nur die Teilzahlen gerendert. Das hat nicht funktioniert: rails hat mich gewarnt, dass es die Variable oder Methode tennis_player, die in der Iteration verwendet wurde, aus irgendeinem Grund nicht finden kann. Also musste ich auf die Darstellung der Teiltöne verzichten und entschied mich dafür, den gesamten Code einzubinden.

Das Problem ist jetzt, dass Ajax nicht funktioniert: Ich muss die Seite aktualisieren, um die Ergebnisse der Übermittlung des Formulars zu sehen. Ich habe meinen Code überprüft und konnte keine Fehler oder Erklärungen finden.

+0

tennis_player für Sie home.html eine lokale Variable ist. erb –

Antwort

1

tennis_player ist eine lokale Variable für Sie home.html.erb.
So müssen Sie es in js.erb wie

Objekt
$("#atpenlist_form").html("<%= escape_javascript(render('users/atpdiscard'), locals: {tennis_player: your_tennis_player_object}) %>"); 

Stellen Sie den Tennisspieler in Ihrem Controller & Verwendung zu übergeben, die in oben js.erb

+0

tennis_player ist die Variable der Iteration. Das Objekt der Iteration ist @atp_ranks = AtpRank.limit (100), das im Controller für die Homepage gesetzt ist (die ich static_pages controller genannt habe). Was soll ich innerhalb der js.erb als 'my_tennis_player_object' verwenden? Einheimische: {tennis_player: @atp_ranks} funktioniert nicht. – Asarluhi