Closed tangmaomao16 closed 7 years ago
老师,你的关于管理员登录后的网页页面的代码文件放在哪里?我找不到。
管理员代码由rails_admin库提供,这个库是直接从gem文件里打包进项目的,如果用C9是看不见的
本地Rubymine可以看见,就在Library里
https://github.com/sferik/rails_admin
源代码倒是可以看见
app/controllers/courses_controller.rb文件中的list方法,对应着,app/views/courses/list.html.erb文件吗? 我是指,写了list方法后,Ruby on Rails会自动对应到list.html.erb文件吗? 还是说两者是完全独立的。
app/models/course.rb文件内容如下
class Course < ActiveRecord::Base
has_many :grades
has_many :users, through: :grades
belongs_to :teacher, class_name: "User"
validates :name, :course_type, :course_time, :course_week,
:class_room, :credit, :teaching_type, :exam_type, presence: true, length: {maximum: 50}
end
问题1:以上是说Course是一个类,对吧?
db/seeds.rb文件中的
course_map={
1 => {course_code: "091M4001H", name: "计算机体系结构", course_type: "专业核心课", credit: "60/3.0", limit_num: "", course_week: "第2-20周", course_time: "周一(9-11)", class_room: "教1-107", teaching_type: "课堂讲授为主", exam_type: "闭卷笔试"},
2 => {course_code: "091M4002H", name: "计算机网络", course_type: "专业核心课", credit: "60/3.0", limit_num: "", course_week: "第2-20周 ", course_time: "周五(2-4)", class_room: "教1-107", teaching_type: "课堂讲授为主", exam_type: "闭卷笔试"},
...
}
问题2:为什么以上这些数据能传给Course这个类?
app/controllers/courses_controller.rb文件中的list方法中
def list
@course=Course.all
问题3:程序员在Ruby中定义的类,其实是具体的、实例化的、可操作的一个对象,对吗?比方说,这里的Course这个类,它是一个对象,这个对象是由所有courses组成的一个集合,而这个集合中的元素就是一个个的course。
若在Controller里写了一个list方法,那么rails会默认自动去找视图list.html.erb
若你在list结尾使用一句render "index"
指定渲染index.html.erb视图,那么rails会去找index.html.erb文件
那list.html.erb这个文件是程序员手动新建的,对吗?
问题1:以上就是一个类,对应的就是courses的数据库表,这个类负责与数据库进行交互
问题2:因为seed后面有相关代码来写入数据
teacher_map.keys.each do |index|
teacher=User.create!(
name: teacher_map[index][:name],
email: "teacher#{index}@test.com",
department: teacher_map[index][:department],
password: "password",
password_confirmation: "password",
teacher: true
)
teacher.teaching_courses.create!(
course_code: course_map[index][:course_code],
name: course_map[index][:name],
course_type: course_map[index][:course_type],
credit: course_map[index][:credit],
limit_num: course_map[index][:limit_num],
course_week: course_map[index][:course_week],
course_time: course_map[index][:course_time],
class_room: course_map[index][:class_room],
teaching_type: course_map[index][:teaching_type],
exam_type: course_map[index][:exam_type],
)
end
teacher.teaching_courses.create(...)
完成了数据的导入,为啥要这么用,而不直接Course.crerate(...)
呢?
因为这个课程是与某个教师关联的,首先找到这个teacher对象,调用teaching_courses转换到这个teacher对应关联的course集合,在这个集合里创建课程,那么这个课程就直接与这个teacher关联了
为啥能用teaching_courses呢?因为在User类里面有一句:
has_many :teaching_courses, class_name: "Course", foreign_key: :teacher_id
这句表明这个teacher对象(由User类实例化)通过:teacher_id
关联了课程类,调用teaching_courses
可以找到这个teacher对应关联的所有course对象集合
问题3: 在Ruby里,Everything is a object, 虽然Ruby的类也需要实例化才能用(类似java),但是Ruby的类的实现也是靠Object,至于为什么,你可以去看高级软件工程的书,介绍Ruby语言特性那节
你的理解有偏差,不能说Course类由很多course组成,Course就是一个Ruby的类,对这个类调用all
类方法(Rails实现?不太确定)能够把这个类中实例化的对象取出来放到一个集合里,是调用了这个all
方法才有的效果,并不是本身Course类就是这么构成的
当然是手工创建了,如果使用IDE比如Rubymine有快捷键帮你创建
老师,追问一下,在其它程序语言,比如C++,Java中,如果定义了Course类,那能写Course.all这样的语句吗,即直接通过类来调用方法,而无需通过类的一个实例来调用方法?
这种不实例化就能调用的方法叫做类方法,java里叫做静态方法,在调用方法前加static关键字即可。
Ruby里,要在方法前加self.
即可成为类方法,如:
class User
#类方法
def self.all
....
end
# 正常实例化才能调用的方法
def count
...
end
end
C++不太清楚
没有显示选课页面,我的课程全是空的
课程为空多半是没有执行seed文件操作...rake db:seed
没有显示选课页面
说的不清楚,给出截图或者相关代码
老师,我看你的选课系统中用管理员身份登录后,可以在搜索框中输入关键信息,然后就可以查找到课程或者用户。我想问,这是怎么实现的?能提供相关介绍的网站或者资料阅读吗?