首页 > 解决方案 > Ajax 不更新数据库中的属性

问题描述

Ajax 不会在完整观看课程后更新查看的属性。

应用程序.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>

配置/路由.rb:

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

add_view_to_lessons 迁移:

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

标签: javascripthtmlruby-on-railsrubyajax

解决方案


我会做这样的事情:

路线.rb

resources :lessons do
  member do
    patch :viewed
  end
end
  • 使用 rails helpers,它将帮助您在段、变量、named_routes 等的顺序上保持一致

显示.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元素的数据属性传递,所以我不必用 javascript 来处理 URL,让 rails 处理这些事情,它真的很擅长

js

$('#video').onended(function() {
  $.ajax({
    url: this.dataset.viewedUrl,
    type: 'patch'
 });
});
  • 从元素的数据属性中获取 URL

推荐阅读