Ajax在迭代中不起作用

时间:2017-01-02 11:18:07

标签: ruby-on-rails ajax iteration

我有一个AtpRank模型,其中包含前100名Atp网球运动员。
我的目标是在视图中创建一个表格,列出所有网球运动员及其属性,以及每个球员的按钮,用户可以选择网球运动员名单。 home.html.erb代码如下:

<% @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 %>

如您所见,表单使用在remote: true帮助器中设置form_for的Ajax。 请求由atp_selections控制器处理。下面是该控制器的创建操作的摘录:

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

destroy操作使用atpdiscard方法而不是atpenlist方法。
在app / views / atp_selections中,我创建了create.js.erbdestroy.js.erb个文件。
以下是app/views/atp_selections/create.js.erb文件:

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

app/view/users/_atpenlist.html.erbapp/view/users/_atpdiscard.html.erb部分中的每一个都包含相应的表单(上面代码与form_for开头的完全相同的部分)。

我不得不说在主页的原始代码中我没有明确地包含表单的整个代码,但我只是渲染了部分。这不起作用:rails警告我,它无法找到迭代中使用的变量或方法tennis_player,出于某种原因我不知道。所以我不得不放弃渲染部分并决定包含整个代码。

现在问题是Ajax不起作用:我必须刷新页面才能看到提交表单的结果。我检查了我的代码,无法找到错误或解释。

1 个答案:

答案 0 :(得分:1)

tennis_player是home.html.erb的局部变量。
所以你需要在js.erb中传递它,如

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

在控制器中设置网球运动员对象&amp;在js.erb上面使用它