неопределенный метод "уроки" для истины: TrueClass - PullRequest
0 голосов
/ 02 июня 2019

Я хочу, чтобы пользователи могли просматривать кнопку отправки задания, если и только если они завершили необходимые курсы задания. Прямо сейчас я добавил строку current_user.complete (@ task.courses.all?) На мою страницу tasks / show.html.erb, которая должна позволять пользователю просматривать кнопку отправки только после завершения курсов задачи. Но эта строка выдает ошибку в методе def complete для пользователя, говоря, что уроки метода не определены для true: TrueClass.

Модель задачи:

has_many :submissions
has_and_belongs_to_many :courses

Модель представления:

belongs_to :user
belongs_to :task

Модель курса:

has_many :lessons, dependent: :destroy
has_many :users, through: :enrolments
has_and_belongs_to_many :tasks, optional: true

Модель урока:

belongs_to :course
has_many :views
has_many :users, through: :views

Модель пользователя:

has_many :courses, through: :enrolments
has_many :submissions
has_many :views
has_many :lessons, through: :views


def view(lesson)
  lessons << lesson
end

def viewed?(lesson)
  lessons.include?(lesson)
end

def complete(course)
  lessons.where(course: course).ids.sort == course.lessons.ids.sort
end

Задача / show.html.erb:

<% if current_user.complete(@task.courses.all?)%>
  <%= link_to "Submit", new_task_submission_path(@task), class: "btn btn-primary" %>
<% end %>

1 Ответ

1 голос
/ 02 июня 2019

Ваш метод complete ожидает course в качестве параметра и пытается вызвать course.lessons для него.

Вы звоните

current_user.complete(@task.courses.all?)

, что означает, что вы передаете логическое значение в complete вместо курса.

Возможно, вы имели в виду что-то вроде:

@task.courses.all? { |course| current_user.complete(course) }

Алексей Матюшкин предполагает, что было бы более эффективно использовать что-то вроде:

current_user.joins(:courses).joins(:lessons).where(complete: false).count == 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...