Модель не создается AJAX

Я хочу создать модель 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>

Вы также можете показать нам результаты вашей первоначальной отладки? Одно только заявление о том, что это не работает, не дает нам многого для продолжения.

Andrew Lohr 28.05.2019 16:45

Вы не вызываете save объект @view. Вы только что построили представление и назначили пользователя, но не сохранили его.

arieljuod 28.05.2019 16:46

Вы тоже можете сделать что-то вроде @view = current_user.views.create(lesson_id: params[:lesson_id])

arieljuod 28.05.2019 16:47

@arieljuod Я пробовал. Модель представления по-прежнему не создается

Railsdeveloperbeginner2002 28.05.2019 16:50
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из вашего 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

Другие вопросы по теме