Ajax не обновляет атрибут в базе данных - PullRequest
0 голосов
/ 27 мая 2019

Ajax не обновляет атрибут просматриваемого после полного просмотра урока.

application.js:

$('#video').onended(function() {
  $.ajax({
    url: '/courses/:id/lessons/:id/viewed',
    type: 'patch'
 });
});

урок контроллер;

def viewed
  @lesson = Lesson.find(params[:id])
  @lesson.update_attribute(:viewed, true)
end

уроки/show.html.erb:

<h2><%= @lesson.name %></h2>
<div id="video">
<video controls="true" width="auto" height="auto">
  <source src="<%= url_for(@lesson.file) %>" type='video/mp4'>
</video>
</div>

config / rout.rb:

patch 'courses/:id/lessons/:id/viewed' => 'lessons#viewed'

add_view_to_lessons миграция:

def change
  add_column :lessons, :viewed, :boolean
end

Ответы [ 3 ]

0 голосов
/ 27 мая 2019

Я бы сделал что-то вроде этого:

routes.rb

resources :lessons do
  member do
    patch :viewed
  end
end
  • используйте помощников рельсов, это поможет вам согласовать порядок сегментов, переменных, named_routes и т. Д.

show.html

<h2><%= @lesson.name %></h2>
<div id="video" data-viewed-url="<%= viewed_lesson_path(@lesson) %>">
  <video controls="true" width="auto" height="auto">
    <source src="<%= url_for(@lesson.file) %>" type='video/mp4'>
  </video>
</div>
  • Я передаю URL как атрибут данных элемента #video, поэтому мне не нужно связываться с URL с помощью javascript, пусть rails справится с этим, это действительно хорошо

JS

$('#video').onended(function() {
  $.ajax({
    url: this.dataset.viewedUrl,
    type: 'patch'
 });
});
  • получить URL из атрибута данных элемента
0 голосов
/ 27 мая 2019

Сначала давайте исправим маршрут:

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
 });
});
0 голосов
/ 27 мая 2019

новообращенный

patch 'courses/:id/lessons/:id/viewed' => 'lessons#viewed'

до

patch 'courses/:course_id/lessons/:id/viewed' => 'lessons#viewed'

и

$('#video').onended(function() {
  $.ajax({
    url: '/courses/:id/lessons/:id/viewed',
    type: 'patch'
 });
});

до

const data = { course_id: "", lesson_id: "" }

$('#video').onended(function() {

  $.ajax({
    url: '/courses/:course_id/lessons/:id/viewed',
    type: 'patch',
    data: data
 });
});

и

def viewed
  @lesson = Lesson.find(params[:id])
  @lesson.update_attribute(:viewed, true)
end

до

def viewed
  @lesson = Lesson.find(params[:data][:lesson_id])
  @lesson.update_attribute(:viewed, true)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...