Я хочу создать модель View
, которая создается, когда пользователь заканчивает просмотр урока. Модель должна иметь идентификатор курса и атрибут идентификатора пользователя. Но 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>
Вы не вызываете save
объект @view
. Вы только что построили представление и назначили пользователя, но не сохранили его.
Вы тоже можете сделать что-то вроде @view = current_user.views.create(lesson_id: params[:lesson_id])
@arieljuod Я пробовал. Модель представления по-прежнему не создается
Из вашего 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!
(версия взрыва вызывает ошибку, если она не может сохранить):
def create
@view = current_user.views.create!(lesson: Lesson.find(params[:lesson_id]))
end
Вы также можете показать нам результаты вашей первоначальной отладки? Одно только заявление о том, что это не работает, не дает нам многого для продолжения.