我正在创建一个简单的学生规划器应用程序。如果我尝试在向课程添加作业之前查看课程(课程#显示(作业,我会收到一个错误,而不是一个空列表,顶部只打印了course_name。
错误如下: "undefined 方法 'course_name' for nil:NilClass">
我的课程#显示页面是在第 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
对正在发生的事情有什么想法吗?任何建议都非常感谢!
@course
来自您的show
控制器操作,您尝试通过其 ID 查找它,但您没有检查是否找到了它。
如果Course
对于Student
是必需的,请在Student
模型上添加:course_id
状态验证,并且在创建学生时,如果未分配课程,则会收到错误。
如果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 %>
还要按如下方式修改您的 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 %>