Ruby on Rails - คอนโทรลเลอร์
ตัวควบคุม Rails เป็นศูนย์กลางทางตรรกะของแอปพลิเคชันของคุณ ประสานการโต้ตอบระหว่างผู้ใช้มุมมองและโมเดล คอนโทรลเลอร์ยังเป็นที่ตั้งของบริการเสริมที่สำคัญหลายอย่าง
มีหน้าที่กำหนดเส้นทางคำขอภายนอกไปยังการดำเนินการภายใน จัดการ URL ที่เป็นมิตรกับผู้คนได้เป็นอย่างดี
จัดการแคชซึ่งสามารถเพิ่มประสิทธิภาพการทำงานตามลำดับขนาดของแอปพลิเคชันได้
จัดการโมดูลตัวช่วยซึ่งขยายความสามารถของเทมเพลตมุมมองโดยไม่ต้องพะวงรหัส
จัดการเซสชันทำให้ผู้ใช้ประทับใจในการโต้ตอบกับแอปพลิเคชันของเราอย่างต่อเนื่อง
กระบวนการสร้างคอนโทรลเลอร์นั้นง่ายมากและคล้ายกับกระบวนการที่เราใช้ในการสร้างโมเดลแล้ว เราจะสร้างคอนโทรลเลอร์เพียงตัวเดียวที่นี่ -
library\> rails generate controller Book
สังเกตว่าคุณใช้ตัวพิมพ์ใหญ่หนังสือและใช้รูปแบบเอกพจน์ นี่คือกระบวนทัศน์ของ Rails ที่คุณควรทำตามทุกครั้งที่คุณสร้างคอนโทรลเลอร์
คำสั่งนี้ทำงานหลายอย่างให้สำเร็จซึ่งสิ่งต่อไปนี้เกี่ยวข้องที่นี่ -
มันสร้างไฟล์ชื่อ app/controllers/book_controller.rb
หากคุณดู book_controller.rb คุณจะพบดังนี้ -
class BookController < ApplicationController
end
คลาสคอนโทรลเลอร์สืบทอดมาจากApplicationControllerซึ่งเป็นไฟล์อื่นในโฟลเดอร์คอนโทรลเลอร์:application.rb.
ApplicationControllerมีโค้ดที่สามารถทำงานในการควบคุมทั้งหมดของคุณและจะสืบทอดจาก Rails ActionController :: ฐานชั้น
คุณไม่จำเป็นต้องกังวลกับApplicationControllerในตอนนี้ดังนั้นเรามากำหนดวิธีการเพียงไม่กี่วิธีในbook_controller.rb. ตามความต้องการของคุณคุณสามารถกำหนดฟังก์ชันจำนวนเท่าใดก็ได้ในไฟล์นี้
แก้ไขไฟล์ให้มีลักษณะดังต่อไปนี้และบันทึกการเปลี่ยนแปลงของคุณ โปรดทราบว่าขึ้นอยู่กับคุณว่าคุณต้องการตั้งชื่ออะไรให้กับวิธีการเหล่านี้ แต่ควรระบุชื่อที่เกี่ยวข้อง
class BookController < ApplicationController
def list
end
def show
end
def new
end
def create
end
def edit
end
def update
end
def delete
end
end
ตอนนี้ให้เราใช้วิธีการทั้งหมดทีละวิธี
การใช้วิธีการรายการ
วิธีการรายการจะให้รายชื่อหนังสือทั้งหมดในฐานข้อมูล ฟังก์ชันนี้จะทำได้โดยใช้โค้ดบรรทัดต่อไปนี้ แก้ไขบรรทัดต่อไปนี้ในไฟล์ book_controller.rb
def list
@books = Book.all
end
@books = Book.allบรรทัดในรายการวิธีการบอกทางรถไฟเพื่อค้นหาตารางหนังสือและจัดเก็บแต่ละแถวที่พบในวัตถุ @books อินสแตนซ์
การใช้วิธีการแสดง
วิธีการแสดงจะแสดงเฉพาะรายละเอียดเพิ่มเติมในหนังสือเล่มเดียว ฟังก์ชันนี้จะทำได้โดยใช้โค้ดบรรทัดต่อไปนี้
def show
@book = Book.find(params[:id])
end
บรรทัด @book = Book.find (params [: id])ของวิธีการแสดงจะบอกให้ Rails ค้นหาเฉพาะหนังสือที่มี id ที่กำหนดไว้ใน params [: id]
วัตถุ params เป็นคอนเทนเนอร์ที่ช่วยให้คุณสามารถส่งผ่านค่าระหว่างการเรียกใช้เมธอด ตัวอย่างเช่นเมื่อคุณอยู่ในหน้าที่เรียกโดยวิธีการรายการคุณสามารถคลิกลิงก์สำหรับหนังสือเล่มใดเล่มหนึ่งและส่งรหัสของหนังสือเล่มนั้นผ่านออบเจ็กต์ params เพื่อให้รายการสามารถค้นหาหนังสือที่ต้องการได้
การใช้วิธีการใหม่
วิธีการใหม่ทำให้ Rails รู้ว่าคุณจะสร้างวัตถุใหม่ ดังนั้นเพียงแค่เพิ่มรหัสต่อไปนี้ในวิธีนี้
def new
@book = Book.new
@subjects = Subject.all
end
วิธีการข้างต้นจะถูกเรียกเมื่อคุณจะแสดงเพจให้ผู้ใช้รับข้อมูลเข้าของผู้ใช้ บรรทัดที่สองจะจับหัวเรื่องทั้งหมดจากฐานข้อมูลและวางไว้ในอาร์เรย์ที่เรียกว่า @subjects
การใช้งานวิธีการสร้าง
เมื่อคุณป้อนข้อมูลผู้ใช้โดยใช้รูปแบบ HTML แล้วก็ถึงเวลาสร้างเรกคอร์ดลงในฐานข้อมูล เพื่อให้บรรลุสิ่งนี้แก้ไขวิธีการสร้างใน book_controller.rb เพื่อให้ตรงกับสิ่งต่อไปนี้ -
def create
@book = Book.new(book_params)
if @book.save
redirect_to :action => 'list'
else
@subjects = Subject.all
render :action => 'new'
end
end
def book_params
params.require(:books).permit(:title, :price, :subject_id, :description)
end
บรรทัดแรกจะสร้างตัวแปรอินสแตนซ์ใหม่ที่เรียกว่า @book ที่เก็บอ็อบเจ็กต์ Book ที่สร้างจากข้อมูลที่ผู้ใช้ส่งมา book_params วิธีการใช้เพื่อรวบรวมฟิลด์ทั้งหมดจากวัตถุ :books. ข้อมูลถูกส่งผ่านจากวิธีการใหม่เพื่อสร้างโดยใช้ออบเจ็กต์ params
บรรทัดถัดไปคือคำสั่งเงื่อนไขที่เปลี่ยนเส้นทางผู้ใช้ไปยังไฟล์ listวิธีการถ้าวัตถุบันทึกอย่างถูกต้องไปยังฐานข้อมูล หากไม่บันทึกผู้ใช้จะถูกส่งกลับไปยังวิธีการใหม่ เมธอด redirect_to คล้ายกับการรีเฟรชเมตาบนหน้าเว็บโดยจะส่งต่อคุณไปยังปลายทางของคุณโดยอัตโนมัติโดยไม่ต้องโต้ตอบกับผู้ใช้
จากนั้น@subjects = Subject.allเป็นสิ่งจำเป็นในกรณีที่บันทึกข้อมูลไม่สำเร็จและจะกลายเป็นกรณีเดียวกันกับตัวเลือกใหม่
การใช้วิธีการแก้ไข
วิธีการแก้ไขมีลักษณะเกือบเหมือนกับวิธีการแสดง วิธีการทั้งสองใช้เพื่อดึงอ็อบเจ็กต์เดียวตาม id และแสดงบนเพจ ข้อแตกต่างเพียงอย่างเดียวคือวิธีการแสดงไม่สามารถแก้ไขได้
def edit
@book = Book.find(params[:id])
@subjects = Subject.all
end
วิธีนี้จะถูกเรียกใช้เพื่อแสดงข้อมูลบนหน้าจอที่จะแก้ไขโดยผู้ใช้ บรรทัดที่สองจะจับหัวเรื่องทั้งหมดจากฐานข้อมูลและวางไว้ในอาร์เรย์ที่เรียกว่า @subjects
การใช้งานวิธีการอัปเดต
เมธอดนี้จะถูกเรียกใช้หลังเมธอดแก้ไขเมื่อผู้ใช้แก้ไขข้อมูลและต้องการอัปเดตการเปลี่ยนแปลงลงในฐานข้อมูล วิธีการอัปเดตคล้ายกับวิธีการสร้างและจะใช้เพื่ออัปเดตหนังสือที่มีอยู่ในฐานข้อมูล
def update
@book = Book.find(params[:id])
if @book.update_attributes(book_param)
redirect_to :action => 'show', :id => @book
else
@subjects = Subject.all
render :action => 'edit'
end
end
def book_param
params.require(:book).permit(:title, :price, :subject_id, :description)
end
เมธอด update_attributes คล้ายกับวิธีการบันทึกที่ใช้โดย create แต่แทนที่จะสร้างแถวใหม่ในฐานข้อมูลจะเขียนทับแอตทริบิวต์ของแถวที่มีอยู่
จากนั้น@subjects = Subject.allบรรทัดเป็นสิ่งจำเป็นในกรณีที่บันทึกข้อมูลไม่สำเร็จมันจะคล้ายกับตัวเลือกแก้ไข
การใช้งานวิธีการลบ
หากคุณต้องการลบบันทึกออกจากฐานข้อมูลคุณจะใช้วิธีนี้ ใช้วิธีนี้ดังนี้
def delete
Book.find(params[:id]).destroy
redirect_to :action => 'list'
end
บรรทัดแรกจะค้นหาการจัดประเภทตามพารามิเตอร์ที่ส่งผ่านออบเจ็กต์ params แล้วลบออกโดยใช้เมธอดทำลาย บรรทัดที่สองเปลี่ยนเส้นทางผู้ใช้ไปยังเมธอดรายการโดยใช้การเรียก redirect_to
วิธีการเพิ่มเติมในการแสดงหัวเรื่อง
สมมติว่าคุณต้องการให้สิ่งอำนวยความสะดวกแก่ผู้ใช้ของคุณในการเรียกดูหนังสือทั้งหมดตามหัวข้อที่กำหนด ดังนั้นคุณสามารถสร้างวิธีการภายใน book_controller.rb เพื่อแสดงหัวเรื่องทั้งหมด สมมติว่าชื่อวิธีการคือshow_subjects -
def show_subjects
@subject = Subject.find(params[:id])
end
ในที่สุด book_controller.rb ไฟล์จะมีลักษณะดังนี้ -
class BooksController < ApplicationController
def list
@books = Book.all
end
def show
@book = Book.find(params[:id])
end
def new
@book = Book.new
@subjects = Subject.all
end
def book_params
params.require(:books).permit(:title, :price, :subject_id, :description)
end
def create
@book = Book.new(book_params)
if @book.save
redirect_to :action => 'list'
else
@subjects = Subject.all
render :action => 'new'
end
end
def edit
@book = Book.find(params[:id])
@subjects = Subject.all
end
def book_param
params.require(:book).permit(:title, :price, :subject_id, :description)
end
def update
@book = Book.find(params[:id])
if @book.update_attributes(book_param)
redirect_to :action => 'show', :id => @book
else
@subjects = Subject.all
render :action => 'edit'
end
end
def delete
Book.find(params[:id]).destroy
redirect_to :action => 'list'
end
def show_subjects
@subject = Subject.find(params[:id])
end
end
ตอนนี้บันทึกไฟล์คอนโทรลเลอร์ของคุณ
Next คืออะไร?
คุณได้สร้างเมธอดเกือบทั้งหมดซึ่งจะใช้ได้กับแบ็กเอนด์ ต่อไปเราจะกำหนดเส้นทาง (URL) สำหรับการดำเนินการ