日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > web前端 > htmlcss > Rails Web應用開發實戰-學生選課系統基礎版(二)

Rails Web應用開發實戰-學生選課系統基礎版(二)

來源:程序員人生   發布時間:2016-12-07 09:11:16 閱讀次數:3821次

Rails Web利用開發實戰-學生選課系統基礎版(2)

在上1篇教程中,我們在Cloud9中跑通了全部演示代碼,下面我們將從零建立1個新的Rails利用。

在我們寫代碼之前,我們先看看Rails框架的結構:

Rails框架

Rails框架最主要的特點是遵守MVC的設計模式(M:model,V:view,C:controller),也就是控制器-視圖-模型模式。Rails框架將代碼邏輯實現在控制器(controller)中,將與數據庫的操作實現在模型(model)中,將與用戶交互的網頁元素(HTML、JS、CSS)實現在視圖中。通過分離這3大部份的功能,Rails能很好的保持1個清晰的架構。

在上圖的第1步中還遺留了1個routing(路由)的進程。

我們利用1個完全的進程來論述上述進程,假定用戶在閱讀器中輸入這個網址并提交:http://whatever.com/users/index,當服務器(whatever.com)接收到這個要求,將會把要求交給控制器users_controller中的方法index處理,為何服務器知道如何把這個要求交給這個控制器和這個控制器下的index方法呢?

是由于Rails有個routes.rb文件,里面配置了要求的映照關系,因此Rails在每次處理用戶要求時,都會去這個文件里查找映照關系,再根據映照的結果交給適合的控制器和控制下的方法,在這里users叫做資源,index叫做處理資源的方法。這個進程就叫做路由。Rails在表示資源的時候利用了RESTful的理念。


1.創建新的Rails利用

1.在C9登錄后的界面中點擊創建新的項目,以下:

新的應用

以上的配置會默許創建新的Rails App

2.C9為我們生成好了1個Rails框架的文件模板,首先我們看1下文件樹:

這里寫圖片描述

  • controllers:寄存控制文件的目錄
  • models:寄存模型文件的目錄
  • views:寄存視圖文件的目錄
  • assets:寄存前端文件,如CSS,JS等
  • initializers:Rails框架在啟動前,會自動加載initializers中的文件,初始化1些外部庫的配置
  • database.yml:描寫了與數據庫連接的配置,如使用何種數據庫數據庫名和密碼等等
  • routes.rb:路由文件,描寫了如何將用戶要求交給特定的控制器處理
  • db:寄存數據庫相干文件,包括數據遷移文件和種子文件
  • gemfile:描寫了所需要的外部庫,bundle install 這個指令就是安裝所有在這個列表下的外部庫。

3.點擊Run Project,我們就能夠運行這個新的Rails App


如果理解Rails框架有困難,請先看官方指南-簡易博客


2.創建模型(Model)

Rails開發流程是先創建模型,再創建相應控制器,配置相干路由,然后在控制器下創建相應方法,最后對應每一個方法創建視圖。

模型是甚么,模型代表了1個底層數據表的類,封裝了操作這個數據表的各種方法。

1.由因而學生選課系統,我們肯定需要1個數據表來貯存用戶的信息,需要1張數據表來貯存課程的信息,那末我們運行以下指令創建用戶模型和課程模型:

pengzhaoqing:~/workspace $ rails generate model course Running via Spring preloader in process 3251 invoke active_record create db/migrate/20160920163906_create_courses.rb create app/models/course.rb invoke test_unit create test/models/course_test.rb create test/fixtures/courses.yml pengzhaoqing:~/workspace $ rails generate model user Running via Spring preloader in process 3262 invoke active_record create db/migrate/20160920163927_create_users.rb create app/models/user.rb invoke test_unit create test/models/user_test.rb create test/fixtures/users.yml
  • 我們只通過rails generate model course 指令,Rails就幫我們創建了
    db/migrate/20160920163906_create_courses.rbapp/models/course.rb、等test文件,省去了開發人員自己創建文件的麻煩。

2.現在我們到打開db/migrate/20160920163906_create_courses.rb文件,填入:

class CreateCourses < ActiveRecord::Migration def change create_table :courses do |t| t.string :name t.string :course_code t.string :course_type t.string :teaching_type t.string :exam_type t.string :credit t.integer :limit_num t.integer :student_num, default: 0 t.string :class_room t.string :course_time t.string :course_week t.belongs_to :teacher t.timestamps null: false end end end
  • 這個文件描寫了courses這個表中的字段和字段類型,Rails將會依照這個文件中描寫的進行建立數據表。這里我們并沒有配置database.yml文件,Rails默許的就是內置的Sqlite3數據庫,可以自己去看看那個文件里面的adapter是否是指定的sqlite3

3.相同地,我們打開db/migrate/20160920163927_create_users.rb,填入:

class CreateUsers < ActiveRecord::Migration def change create_table :users do |t| t.string :name t.string :email t.string :num t.string :major t.string :department t.string :password_digest t.string :remember_digest t.boolean :admin, default: false t.boolean :teacher,default: false t.timestamps null: false end add_index :users, :email, unique: true end end
  • 由于用戶可以分為學生,老師和管理員3個角色,因此在用戶的字段里,我們用 adminteacher
    布爾類型的字段來辨別3種角色。
  • add_index :users, :email, unique: true
    表示我們為users表的email字段建立索引,為以后能快速地根據用戶郵箱檢索到某個用戶。

4.在選課系統中,1個學生有多門課,1門課可以被多名學生選擇,因此學生和課程就是多對多的關系,而且,每一個學生的每門課都有1個成績。這里觸及了3個數據實體,1個是學生,1個是課程,1個是成績。所以,我們還需要創建1個關于成績的數據表,里面貯存著學生表的主鍵(user_id)和課程表的主鍵(course_id)和對應的成績。

下面,我們運行rails generate model grade 建立成績模型:

pengzhaoqing:~/workspace $ rails generate model grade Running via Spring preloader in process 1144 invoke active_record create db/migrate/20160921051153_create_grades.rb create app/models/grade.rb invoke test_unit create test/models/grade_test.rb create test/fixtures/grades.yml

進入db/migrate/20160921051153_create_grades.rb,建立相應的字段:

class CreateGrades < ActiveRecord::Migration def change create_table :grades do |t| t.belongs_to :course, index: true t.belongs_to :user, index: true t.integer :grade t.timestamps null: false end end end
  • 這里的t.belongs_to: :course 就等于 t.integer :course_id,記錄了課程表中課程的id。如此表示的意圖在于更加清晰地表達模型之間的從屬關系:

    1個課程具有多個成績,1個成績只屬于1個課程;1個學生具有多個成績,1個成績只屬于1個學生;學生和課程兩個屬性能唯1肯定成績

5.分析到這里,我們是不會遺忘了甚么,對,就是這個:1個老師上多門課,每門屬于1個老師。這里老師和課程是也是1對多的關系(為了簡化,就不再設計為多對多的關聯關系了),回顧我們在課程模型的數據遷移文件db/migrate/20160920163906_create_courses.rb 中寫的1句代碼t.belongs_to :teacher,就已將用戶(老師)的id作為外鍵貯存在課程模型的數據表中,目的就是要實現用戶(老師)與課程模型的1對多關系,即在課程模型的數據表中查找某個用戶(老師)的id,就可以將取出與這個id相干的所有課程的數據

6.我們直接畫出ER圖來看各個模型之間的關系:

ER圖

  • 理解這個圖需要1定的數據庫知識,更加詳細的在 Rails Active 關聯。

需要注意的是,上圖中,用戶模型和課程模型通過成績模型關聯起來了(由于可以根據user_id查詢所有相干的course_id,而且根據course_id也能夠反過來查詢所有的user_id),也就實現了用戶模型和課程模型多對多的關系。

7.到這里,我們已完成了模型數據字段的建立進程,下面我們要把這些字段之間的關聯關系告知Rails框架,然后Rails就可以自動幫我們組織各模型之間的關聯關系。首先打開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
  • 這里,課程模型通過has_many方法描寫與其他模型的1對多的關聯關系。through 參數描寫了:此1對多關系是通過成績模型才關聯到用戶模型的。
  • belongs_to 方法描寫了與其他模型的多對1的關聯關系,class_name 指定了用戶模型的類名,這樣Rails才能正確找到關聯的用戶模型。
  • validates 方法指定了對模型下的字段的驗證,這里1共驗證了:name, :course_type, :course_time, :course_week, :class_room, :credit, :teaching_type, :exam_type 8個字段,驗證要求是 presence: true, length: {maximum: 50},表示各個字段要存在(不為空)而且最大長度不能超過50個字符。驗證會在每次保存課程數據的時候履行

8.下1步,打開app/models/grade.rb,填入:

class Grade < ActiveRecord::Base belongs_to :course belongs_to :user end
  • 指定了與課程模型和用戶模型1對多的關系

9.接著打開app/models/user.rb,填入:

class User < ActiveRecord::Base before_save :downcase_email attr_accessor :remember_token validates :name, presence: true, length: {maximum: 50} validates :password, presence: true, length: {minimum: 6}, allow_nil: true has_many :grades has_many :courses, through: :grades has_many :teaching_courses, class_name: "Course", foreign_key: :teacher_id VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i validates :email, presence: true, length: {maximum: 255}, format: {with: VALID_EMAIL_REGEX}, uniqueness: {case_sensitive: false} #1. The ability to save a securely hashed password_digest attribute to the database #2. A pair of virtual attributes (password and password_confirmation), including presence validations upon object creation and a validation requiring that they match #3. An authenticate method that returns the user when the password is correct (and false otherwise) has_secure_password # has_secure_password automatically adds an authenticate method to the corresponding model objects. # This method determines if a given password is valid for a particular user by computing its digest and comparing the result to password_digest in the database. # Returns the hash digest of the given string. def User.digest(string) cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost BCrypt::Password.create(string, cost: cost) end def User.new_token SecureRandom.urlsafe_base64 end def user_remember self.remember_token = User.new_token update_attribute(:remember_digest, User.digest(remember_token)) end def user_forget update_attribute(:remember_digest, nil) end # Returns true if the given token matches the digest. def user_authenticated?(attribute, token) digest = self.send("#{attribute}_digest") return false if digest.nil? BCrypt::Password.new(digest).is_password?(token) end private def downcase_email self.email = email.downcase end end
  • 用戶模型里,注意:
    • has_many :courses, through: :grades
    • has_many :teaching_courses, class_name: "Course", foreign_key: :teacher_id
      –這里,兩句代碼都指定了與課程模型的1對多關聯關系,但是第1句并沒有指定課程模型的名字和課程模型中的外鍵字段,但是Rails卻能工作正常。這體現了Rails1個特性:convention over configuration (約定大于配置),意思就是說只要開發人員依照1定的約定模式寫代碼,就能夠省去很多編寫xml文件來指定文件路徑的麻煩。這里的has_many :courses, through: :grades,Rails在解釋代碼的時候就會默許去找有無叫course.rb(復數變單數)的文件,而且還會去這個course模型下找有無叫user_id的外鍵字段。但是,根據第2句代碼中的teaching_courses,Rails沒法正確找到course.rb文件(這就不是僅僅是復數變單數那末簡答了!),所以我們需要手動指定它去找1個叫做Course類的模型和關聯模型下的外鍵teacher_id
  • 后面定義的方法,例如digest,new_token,user_remember,user_forget, user_authenticated?, downcase_email都是在后面用戶登錄功能需要用到的標準功能,詳細內容請進傳送門

9.所有的模型和模型的數據遷移文件我們都建立好了,下面運行數據遷移rake db:migrate建立數據表,成功會看到以下信息:

pengzhaoqing:~/workspace $ rake db:migrate == 20160920163906 CreateCourses: migrating ==================================== -- create_table(:courses) -> 0.0079s == 20160920163906 CreateCourses: migrated (0.0080s) =========================== == 20160920163927 CreateUsers: migrating ====================================== -- create_table(:users) -> 0.0014s -- add_index(:users, :email, {:unique=>true}) -> 0.0011s == 20160920163927 CreateUsers: migrated (0.0028s) ============================= == 20160921051153 CreateGrades: migrating ===================================== -- create_table(:grades) -> 0.0039s == 20160921051153 CreateGrades: migrated (0.0042s) ============================

結束語

到此,所有關于模型(model)部份已完結了,模型部份主要是對數據進行操作,包括數據表的建立,數據表之間的關聯關系。

有困難的同學請先看看

  • Active Record 基礎
  • Active Record 數據遷移
  • Active Record 數據驗證
  • Active Record 關聯

下1章將會講授控制器(controller)部份。

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产精品一区二区久久久久 | 国产精品久久久久久一区二区三区 | 成人看片在线观看 | 亚洲字幕 | 国产做爰免费视频观看 | 国产偷国产偷av亚洲清高 | 国产精品亚洲一区二区三区在线 | 精品一区二区三区四区五区 | 亚洲免费影院 | 久久久久久久久久久国产 | 久久香视频| 日批免费看 | 午夜视频免费看 | 午夜一区二区三区 | 精品欧美一区二区三区精品久久 | 国产一区二区毛片 | 国产精品午夜视频 | 精品国产31久久久久久 | 人人操日日干 | 第一av| 黄色欧美视频 | 国产精品一二三四区 | 国内av毛片 | 亚洲欧美日韩高清 | 国产 日韩 欧美 在线 | 夜夜艹天天干 | 欧美日韩国产色综合一二三四 | 国产一区二区三区在线看 | 91麻豆精品一二三区在线 | 欧美日韩成人在线观看 | 91成人网在线播放 | 国产精品一区二区三区久久 | 亚洲午夜视频在线观看 | 免费看羞羞的视频 | 成人毛片网 | 久久国产精品免费一区二区三区 | 久久综合一区二区 | 日本成人一区 | 国产精品久久久久9999 | 爱情岛论坛首页永久网址 | 红色一级毛片 |