我有一个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.erb
和destroy.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.erb
和app/view/users/_atpdiscard.html.erb
部分中的每一个都包含相应的表单(上面代码与form_for
开头的完全相同的部分)。
我不得不说在主页的原始代码中我没有明确地包含表单的整个代码,但我只是渲染了部分。这不起作用:rails警告我,它无法找到迭代中使用的变量或方法tennis_player
,出于某种原因我不知道。所以我不得不放弃渲染部分并决定包含整个代码。
现在问题是Ajax不起作用:我必须刷新页面才能看到提交表单的结果。我检查了我的代码,无法找到错误或解释。
答案 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上面使用它