0

我有两个模型,SubjectCourse。一个Coursebelongs_to aSubject和一个Subjecthas_many Courses。创建新课程时,我使用 collection_select 来获取数据库中的所有主题,以便选择课程所属的主题。这工作正常,但是我在从课程 index.html 页面中显示获取 subject.name 时遇到问题,而我只能让其 id 出现。我试过做 <%= course.subject.name %> 这给了我一个错误:nil:NilClass 的未定义方法“名称”。我应该怎么做才能在课程视图页面中显示 subject.name?

这是我的代码:

课程形式:

  <div class="field">
    <%= f.label "Subject" %>
    <%= collection_select :course, :subject_id, Subject.all, :id, :name %>
  </div>

索引.html:

<div class="courses">
  <div class="semesters">
    <h3>Courses</h3>
    <% @grade.courses.each do |course| %>
    <div class="course_group">
      <div class="course_list">
        <h3><%= course.subject.name %></h3>
        <p><%= course.title %></p>
        <%= link_to "View Course", [@grade, course], :class => "button button_orange" %>
        <div class="course_links">
        <% if can? :update, @course %>
          <%= link_to 'Edit', edit_grade_course_path(@grade, course) %> |
        <% end %>
        <% if can? :destroy, @course %>
          <%= link_to 'Destroy', [@grade, course], method: :delete, data: { confirm: 'Are you sure?' } %>
        <% end %>
        </div>
      </div>
      </div>
    <% end %>
  </div>
  <div class="create_course">
    <% if can? :create, @course %>
    <%= link_to 'Add New Course', new_grade_course_path(@grade, @course), :class => "button button_orange" %>
    <% end %>
  </div>
</div>

课程控制器.rb:

class CoursesController < ApplicationController
  before_action :set_course, only: [:show, :edit, :update, :destroy]
  before_action :set_grade
  load_and_authorize_resource
  respond_to :html

  def index
   @grade = Grade.find(params[:grade_id])
   @subjects = Subject.all
   @courses = @grade.courses.all
   # respond_with(@course)
  end
.
.
.
  def course_params
      params.require(:course).permit(:title, :period, :description, :semester, :grade, :grade_id, :video_url, :chapter_id, :subject_id)
  end
end

课程.rb:

class Course < ActiveRecord::Base
    # TODO: add validations
    resourcify
    belongs_to :grade
    has_many :chapters
    has_many :packages
    belongs_to :subject
end

主题.rb:

class Subject < ActiveRecord::Base
    has_many :courses
end
4

2 回答 2

1

试试这个代码

<%= course.subject.name if course.subject and course.subject.name %>

由于我们正在研究关系数据库,在从关系中获取数据时,我们首先需要检查与该表的关系是否存在,还需要检查该关系表中的字段是否为 nil/blank。您也可以try为此使用方法。

结帐以下链接

http://www.rubydoc.info/docs/rails/Object%3Atry

于 2016-03-03T11:02:21.013 回答
1

我会说去验证而不是检查每一列的存在;这简直是​​多余的。

class Subject < ActiveRecord::Base
  validates :name, presence: true
end

这样,一个主题在有名称之前不能保存在数据库中,然后在您的视图中您不需要检查name字段是否存在。

或者,如果您想进行存在性检查,Rails 也提供了一种方法。就是这样:

course.try(:subject).try(:name) # this code won't crash even if the `name` or `subject` is `nil`.
于 2016-03-03T11:19:55.037 回答