如果所有子模块都标记为完成轨道5,则自动将课程标记为完成 [英] Marking a course as complete automatically if all sub modules are marked as complete rails 5

查看:23
本文介绍了如果所有子模块都标记为完成轨道5,则自动将课程标记为完成的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

编辑#1

这是我现在拥有的

<% if course.complete? %>
  <%= link_to "Completed", course, class: "block text-lg w-full text-center text-white px-4 py-2 bg-green hover:bg-green-dark border-2 border-green-dark leading-none no-underline" %>
<% else %>
  <%= link_to "View Modules", course, class: "block text-lg w-full text-center text-grey-dark hover:text-darker px-4 py-2 border-2 border-grey leading-none no-underline hover:border-2 hover:border-grey-dark" %>
<% end %>

Course_Mode.rb

class CourseModule < ApplicationRecord
  extend FriendlyId
  friendly_id :title, use: :slugged

  belongs_to :course
  has_many :course_exercises

  validates :title, :course_id, presence: true

  scope :completed, -> { where(complete: true) }

  after_save :course_completed

  private

  def course_completed
    course = course_module.course
    course.update(complete: true) if course.course_modules.all?(&:complete?)
  end
end

名称匹配,因此没有问题,但是,我应该如何开始调用模型方法?

原始问题

目前我有课程,在课程中我有模块都有完整的列,都是布尔型的,目前学生可以像这样点击勾号来完成模块

我有这样的课程数据库

和模块表如下

但我希望该功能正常工作,因此当最后一个模块标记为已完成时,课程本身将在数据库中标记为已完成,当前在course_modules_controller.rb我有

def complete
  @course_module = CourseModule.friendly.find(params[:id])
  @course_module.complete = true
  @course_module.save
  redirect_to courses_path, notice: 'Module completed, congratulations!'
end

这适用于模块,但如果最后一项任务已标记为已完成,则我要将课程标记为已完成。

推荐答案

您可以在您的控制器或模型中的after_save中执行此操作,但它将如下所示:

course = course_module.course
course.update(complete: true) if course.course_modules.all?(&:complete?)

如果名称与您的架构不完全匹配,则可能需要进行少量编辑。

这篇关于如果所有子模块都标记为完成轨道5,则自动将课程标记为完成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆