Сначала давайте исправим маршрут:
path "/lessons/:id/viewed" => "lessons#viewed", as: :lesson_viewed
Нам не нужен идентификатор курса, если это именованный маршрут, если мы на самом деле не делаем что-то полезное с этой информацией.
Я бы порекомендовал вам добавить атрибут data
в ваш erb, чтобы указать маршрут для вызова
<h2><%= @lesson.name %></h2>
<div id="video" data-lesson-viewed-url="<%= lesson_viewed_url(@lesson.id) %>">
<video controls="true" width="auto" height="auto">
<source src="<%= url_for(@lesson.file) %>" type='video/mp4'>
</video>
</div>
Обратите внимание на изменение в строке <div id="video" data-lesson-viewed-url="<%= lesson_viewed_url(@lesson.id) %>">
.
Теперь Ajax может просто вызвать этот маршрут:
$('#video').onended(function() {
$.ajax({
url: $('#video').data("lesson-viewed-url"),
type: 'patch' // Can move the HTTP verb to data attribute as well, leaving this upto the implementor for now
});
});