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) สำหรับการดำเนินการ