我正在创建一个简单的学生计划器应用程序。如果我尝试在将作业添加到课程之前查看课程(课程#显示)作业,则会抛出错误,而不是仅在顶部打印了课程名称的空白列表。
该错误显示为: “ nil:NilClass的未定义方法“ course_name””
我的course#show页面是在第2行上引发错误的地方:
<div class='container text-center'>
<h2> <%= @course.course_name %> </h2>
<% @course.assignments.all.each do |assignment| %>
<%= assignment.title %>, <%= assignment.course.course_name %>, <%= assignment.due_date %>
<br>
<% end %>
</div>
我的courses_controller:
class CoursesController < ApplicationController
def new
@course = Course.new
end
def create
@course = Course.create(course_params)
if @course.save
redirect_to student_courses_path(@student)
else
render :new
end
end
def index
student = Student.find_by(id: params[:student_id])
@courses = Course.all
end
def show
student = Student.find_by(id: params[:student_id])
@course = student.courses.find_by(id: params[:id])
end
def edit
end
def update
end
private
def course_params
params.require(:course).permit(:course_name)
end
end
课程模式:
class Course < ActiveRecord::Base
has_many :assignments
has_many :students, through: :assignments
validates :course_name, presence: true
end
有什么想法吗?任何建议都非常感谢!
答案 0 :(得分:1)
@course
来自您的show
控制器操作,您尝试在其中按其ID查找它,但不检查是否已找到它。
如果Course
对于Student
是必需的,请在:course_id
模型上的Student
上添加在场验证,然后在创建学生时,您会如果未分配任何课程,则会出现错误。
如果Course
对于Student
不是必需的,则可以在视图文件中的<% if @course %>
部分中显示一个<% else %>
块,以显示一条消息。例如:
<% if @course %>
<div class='container text-center'>
<h2><%= @course.course_name %></h2>
<% @course.assignments.all.each do |assignment| %>
<%= assignment.title %>, <%= assignment.course.course_name %>, <%= assignment.due_date %>
<br>
<% end %>
</div>
<% else %>
<div class='container text-center'>
<p>This student has no course yet.</p>
</div>
<% end %>
答案 1 :(得分:1)
还如下修改您的html代码,并仅在存在分配时显示分配。
也无需在关联的对象上编写 .all 。
<% if @course %>
<div class='container text-center'>
<h2><%= @course.course_name %></h2>
<% if @course.assignment.any? %>
<% @course.assignments.each do |assignment| %>
<%= assignment.title %>, <%= assignment.course.course_name %>, <%= assignment.due_date %>
<br>
<% end %>
<% end %>
</div>
<% else %>
<div class='container text-center'>
<p>This student has no course yet.</p>
</div>
<% end %>