好吧,追踪到这个讨厌的人!
问题出在您生成的HTML中。事实证明,有问题的最终以AJAX调用…无效的URL(导致
404)!
在 show视图中 ,您具有以下代码:
<% if @habit.current_level_strike %> <div id="red"> <label id="<%= @habit.id %>" >Strikes:</label><% else %> <div id="gold"> <label id="<%= @habit.id %>" >Strikes:</label><% end %><!-- [...] --><% if @habit.current_level_strike %> <label id="<%= level.id %>" >Level <%= index + 1 %>:</label> <% else %> <label id="<%= level.id %>" >Level <%= index + 1 %>:</label> <% end %>
为什么会有问题?那么,在你的Javascript,你依靠的确切类
.habit-id和
.level-id:
habit = $(this).parent().siblings(".habit-id").first().attr("id");level = $(this).siblings(".level-id").first().attr("id");虽然根据 show view的 HTML 来看 ,有时会生成适当的类,有时会有些带有
*-two(
habit-id-two和
level-id-two)附录的类。
如果您尝试固定类名,那么它们的格式都与您的Javascript(
.siblings(".habit-id")和.siblings(".level-id"))期望的形式相同,则问题将消失。更好的解决方案 (是的,可以稍微简化一下;))
如果我们 预先生成 网址,并以如下方式在HTML中进行设置,该怎么办:
<div > <!-- [...] --> <% @habit.levels.each_with_index do |level, index| %> <% if @habit.current_level >= (index + 1) %> <p data-submit-url="<%= habit_level_days_missed_index_path({ habit_id: @habit.id, level_id: level.id }) %>"data-delete-url="<%= habit_level_days_missed_path({ habit_id: @habit.id, level_id: level.id, id: 1 }) %>"> <!-- [...] --> </p> <% end %> <% end %> </div></div>然后,您的Javascript可以简化为:
$(document).on("page:change", function() { $(".habit-check").change(function() { var submitUrl = $(this).parents("p").data("submit-url"); var deleteUrl = $(this).parents("p").data("delete-url"); if($(this).is(":checked")) { $.ajax( { url: submitUrl, method: "POST" }); } else { $.ajax( { url: deleteUrl, method: "DELETE" }); } });});请注意,在生成 delete-url时 ,我在中使用了的硬编码值
id,该值是
1(试图重现您的原始行为):
data-delete-url="<%= habit_level_days_missed_path({ habit_id: @habit.id, level_id: level.id, id: 1 }) %>"对应于:
url: "/habits/" + habit + "/levels/" + level + "/days_missed/1"
在您的代码中。您是否 100% 确定这就是您想要的?
希望有帮助!如果您有任何疑问,我们非常乐于提供帮助/解释!
祝好运!



