javascript - 模型不是由 AJAX 创建的
问题描述
我想创建一个View
在用户完成观看课程时创建的模型。该模型应该有一个课程 ID 和一个用户 ID 属性。但是 Ajax 不会在观看完一堂课后创建视图模型:
应用程序.js:
$('#video').onended(function() {
$.ajax({
url: '/views/new'
type: 'post'
});
});
视图控制器:
def create
@view = current_user.views.build
@view.lesson = Lesson.find(params[:lesson_id])
end
查看迁移:
def change
create_table :views do |t|
t.integer :lesson_id
t.integer :user_id
t.timestamps
end
end
查看型号:
belongs_to :user
belongs_to :lesson
用户模型:
has_many :views
课程模式:
has_many :views
路线:
post 'views/new' => 'views#create'
课程/show.html.erb:
<h2><%= @lesson.name %></h2>
<video id="video" controls="true" width="auto"
height="auto">
<source src="<%= url_for(@lesson.file) %>"
type='video/mp4'>
</video>
解决方案
从您的 AJAX 中您不会params[:lesson_id]
以任何方式传递,因此在控制器中它最终是Lesson.find(nil)
,这会引发ActiveRecord::RecordNotFound
并且控制器呈现错误 404(请检查浏览器的控制台)。
<video id="video" data-id="<%= @lesson.id %>" controls="true" width="auto" height="auto">
$('#video').onended(function() {
var id = $(this).data('id');
$.ajax({
url: '/views/new'
type: 'post',
data: {
lesson_id: id
}
});
});
另外,您不保存构建对象,请使用create!
(如果无法保存,bang 版本会引发错误):
def create
@view = current_user.views.create!(lesson: Lesson.find(params[:lesson_id]))
end
推荐阅读
- java - 如何在 Android 中通过 MediaStore API 检索和打开保存到下载的 PDF 文件?
- python - 使用 Apriori 算法没有输出
- git - IntelliJ 2020.3 旧版 Git 本地更改视图
- php - 如何获得无税 WooCommerce 订单的总销售额?
- c++ - 使用命名空间 C++ 的未定义引用
- entity-framework - 如何在两端使用 FK 在 EF Core 中配置一对一关系
- c# - 在另一个表达式中使用保存的表达式
- c++ - 为什么 const int 需要 extern 而 const char* 不需要
- javascript - 无法在页面加载事件(纯 JS)上将焦点设置为输入文本字段
- c# - 无法让 ASP.NET Web api 使用未指定的内容类型