Ruby on Rails对于nil:NilClass的未定义方法“ course_name”

时间:2019-11-30 04:03:28

标签: ruby-on-rails ruby

我正在创建一个简单的学生计划器应用程序。如果我尝试在将作业添加到课程之前查看课程(课程#显示)作业,则会抛出错误,而不是仅在顶部打印了课程名称的空白列表。

该错误显示为: “ 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

有什么想法吗?任何建议都非常感谢!

2 个答案:

答案 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 %>