Rails 4 - 如何在使用 collection_select 后在索引视图中显示记录名称而不是其 ID
Rails 4 - How to display name of record in index view instead of its id after using collection_select
我有两个模型,Subject
和 Course
。一个Course
belongs_to一个Subject
和一个Subject
has_manyCourses
。创建新课程时,我使用 collection_select 获取数据库中的所有科目,因此我可以 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>
index.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>
courses_controller.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
course.rb :
class Course < ActiveRecord::Base
# TODO: add validations
resourcify
belongs_to :grade
has_many :chapters
has_many :packages
belongs_to :subject
end
subject.rb:
class Subject < ActiveRecord::Base
has_many :courses
end
试试这个代码
<%= course.subject.name if course.subject and course.subject.name %>
由于我们在关系数据库上工作,从关系中获取数据时,我们首先需要检查 table 是否存在关系,还需要检查关系 table 中的字段是否存在不是 nil/blank。
您也可以为此使用 try
方法。
在下方结帐 link
我会说去验证而不是检查每一列是否存在;简直是多余的。
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`.
我有两个模型,Subject
和 Course
。一个Course
belongs_to一个Subject
和一个Subject
has_manyCourses
。创建新课程时,我使用 collection_select 获取数据库中的所有科目,因此我可以 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>
index.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>
courses_controller.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
course.rb :
class Course < ActiveRecord::Base
# TODO: add validations
resourcify
belongs_to :grade
has_many :chapters
has_many :packages
belongs_to :subject
end
subject.rb:
class Subject < ActiveRecord::Base
has_many :courses
end
试试这个代码
<%= course.subject.name if course.subject and course.subject.name %>
由于我们在关系数据库上工作,从关系中获取数据时,我们首先需要检查 table 是否存在关系,还需要检查关系 table 中的字段是否存在不是 nil/blank。
您也可以为此使用 try
方法。
在下方结帐 link
我会说去验证而不是检查每一列是否存在;简直是多余的。
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`.