The Mystery Of The Disappearing Checkmarks
Solution 1:
Ok, tracked this nasty one down!
The problem lays in your HTML generated. It turns out, that the problematic ones end up performing AJAX calls to... invalid URLs (causing 404
's)!
In your show view, you have code like:
<% if @habit.current_level_strike %>
<divclass="btn"id="red"><labelid="<%= @habit.id %>"class="habit-id">Strikes:</label>
<% else %>
<divclass="btn"id="gold"><labelid="<%= @habit.id %>"class="habit-id-two">Strikes:</label>
<% end %>
<!-- [...] -->
<% if @habit.current_level_strike %>
<labelid="<%= level.id %>"class="level-id">Level <%= index + 1 %>:</label>
<% else %>
<labelid="<%= level.id %>"class="level-id-two">Level <%= index + 1 %>:</label>
<% end %>
Why is it problematic? Well, in your JavaScript, you're relying on exact classes of .habit-id
and .level-id
:
habit = $(this).parent().siblings(".habit-id").first().attr("id");level = $(this).siblings(".level-id").first().attr("id");
While according to HTML from show view, sometimes the proper classes are generated, and sometimes there are classes with appendix of *-two
(habit-id-two
and level-id-two
).
If you try fixing the class names, so all are of the same form expected by your JavaScript (.siblings(".habit-id")
and .siblings(".level-id")
), the problem disappears.
Better solution (yes, it is possible to simplify it a bit ;))
What if we pregenerate urls, and set them in HTML like so:
<divclass="strikes"><!-- [...] -->
<% @habit.levels.each_with_index do |level, index| %>
<% if @habit.current_level >= (index + 1) %>
<pdata-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>
Then, your JavaScript can be simplified to:
$(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"
});
}
});
});
Please, be warned, that when generating delete-url, I've used hardcoded value of id
, which is 1
(trying to reproduce your original behaviour), in:
data-delete-url="<%= habit_level_days_missed_path({ habit_id: @habit.id, level_id: level.id, id: 1 }) %>"
which corresponds to:
url:"/habits/" + habit + "/levels/" + level + "/days_missed/1"
in your code. Are you 100% sure this is what you want?
Hope that helps! If you have any questions - I'm more than happy to help/explain!
Good luck!
Post a Comment for "The Mystery Of The Disappearing Checkmarks"