เรนเดอร์อะไรใน Rails?
การแสดงผลเป็นเป้าหมายสูงสุดของแอปพลิเคชัน Ruby on Rails ของคุณ คุณแสดงมุมมอง โดยปกติ .html.erb
ไฟล์ซึ่งมีรหัส HMTL และ Ruby ผสมกัน
มุมมองคือสิ่งที่ผู้ใช้เห็น .
เป็นผลจากการทำงานทั้งหมดที่แอป Rails ของคุณต้องทำ มุมมองรวมตรรกะ ข้อมูล และดูเทมเพลตเพื่อให้บริการตามคำขอของผู้ใช้
แม้แต่การตอบกลับ JSON ก็ถือเป็นมุมมองได้
นั่นคือเหตุผลที่เรียนรู้ทุกสิ่งที่คุณทำได้ เกี่ยวกับระบบการแสดงผลใน Rails นั้น สำคัญ ถ้าคุณไม่ต้องการให้งานของคุณสูญเปล่า
การแสดงผลใน Rails สามารถสร้างพฤติกรรมที่น่าประหลาดใจได้ ยิ่งคุณรู้มากขึ้นเท่านั้น
มาเริ่มกันที่พื้นฐานกันเลย!
พื้นฐานของการแสดงภาพ
โดยค่าเริ่มต้น คุณไม่จำเป็นต้องบอกให้ Rails แสดงผลใดๆ และมุมมองจะยังคงใช้งานได้ตราบใดที่ตั้งค่าอย่างอื่นอย่างถูกต้อง
นี่เป็นส่วนหนึ่งของ “Convention over Configuration”
มันทำงานอย่างไร
Rails ตั้งสมมติฐานซึ่งคุณอาจไม่รู้
ช่วยให้คุณประหยัดเวลาในการทำงาน
แต่หากไม่รู้ว่าเกิดอะไรขึ้น อาจรู้สึกเหมือนมีเวทมนตร์
นั่นคือที่ที่คุณสร้างปัญหาได้!
ในกรณีนี้ ข้อสันนิษฐานที่ Rails สร้างขึ้นคือคุณต้องการสร้างเทมเพลตที่มีชื่อเดียวกับการดำเนินการของคอนโทรลเลอร์ที่จัดการคำขอ
ดังนั้นหากคุณเรียก BooksController#index
… Rails แสดง books/index.erb
.
ตอนนี้ :
คุณสามารถควบคุมการเรนเดอร์นี้ได้มากขึ้น
ซึ่งจะทำให้คุณสามารถแสดงมุมมองที่แตกต่างจากค่าเริ่มต้นได้
ตามนี้ :
class BooksController < ApplicationController def index render :listing end end
สิ่งนี้ทำให้ books/listing.erb
(หรือ .haml
หากคุณกำลังใช้มุมมอง HAML)
คุณสามารถใช้สตริงแทนสัญลักษณ์ได้
ถูกใจสิ่งนี้ :
render 'shared/buttons'
Rails จะแสดง shared/buttons.erb
.
สิ่งหนึ่งที่คุณต้องรู้
การแสดงผลมุมมองที่เกี่ยวข้องกับการกระทำอื่นจะไม่เรียกใช้การกระทำนั้น
กล่าวอีกนัยหนึ่งเรียก render :index
ภายใน create
จะไม่เรียกใช้ index
วิธีการ
เหตุใดจึงสำคัญ
เนื่องจากจะไม่มีการตั้งค่าตัวแปรอินสแตนซ์สำหรับมุมมองนั้น!
คุณต้องตั้งค่าเอง
ตัวอย่าง :
def index @users = User.all end # Missing `@users` here will result in an error or an empty index view # You can use `redirect_to` instead, in that case `index` will run def create render :index end
มีการเรนเดอร์มากกว่านี้อีกมาก
ไปต่อกันเถอะ!
การแสดงผลประเภทต่างๆ
นอกจากการแสดงเทมเพลตแล้ว คุณยังมีตัวเลือกอื่นๆ
คุณทำได้ :
- แสดงสตริง HTML
- แสดงสตริงข้อความธรรมดา
- แสดงผล JSON
การแสดงสตริงจะมีประโยชน์ในระหว่างการพัฒนาเพื่อแสดงข้อความแสดงข้อผิดพลาดหากคุณไม่มีเทมเพลตที่เหมาะสมในการจัดการข้อผิดพลาด
หรือหากคุณยังไม่พร้อมที่จะเขียนมุมมองสำหรับการดำเนินการของผู้ควบคุมโดยเฉพาะ
นี่คือตัวอย่าง :
if @user render :show else render plain: "User not found." end
การแสดงผล JSON สามารถใช้สร้าง API แบบง่ายได้โดยตรง ซึ่งไม่ใช่วิธีที่ดีที่สุดแต่จะช่วยให้คุณเริ่มต้นได้
ตัวอย่าง :
render json: @user
ฉันไม่ได้ใช้การเรนเดอร์ HTML แต่ถ้าคุณมีประโยชน์ให้บอกฉัน!
วิธีการแสดงบางส่วน
การแสดงผลเป็นมากกว่าตัวควบคุม
คุณยังสามารถแสดงมุมมองภายในมุมมอง .
เราเรียกว่าบางส่วน
ทำไมคุณถึงอยากทำอย่างนั้น
โค้ดสะอาดขึ้น &โค้ดใช้ซ้ำ
หากคุณใช้แบบฟอร์มเดียวกันใน 3 หน้าที่แตกต่างกัน อาจเป็นความคิดที่ดีที่จะแยกออกเป็นบางส่วน .
ตอนนี้เมื่อคุณต้องการทำการเปลี่ยนแปลง คุณต้องทำในที่เดียวเท่านั้น
นี่คือตัวอย่าง :
<%= render :form %>
เพื่อให้ใช้งานได้ คุณต้องตั้งชื่อไฟล์มุมมองที่ขึ้นต้นด้วยขีดล่าง เช่น _form.erb
แต่เมื่อคุณเรียก render
คุณไม่จำเป็นต้องมีขีดล่าง
คุณจะสามารถเข้าถึงตัวแปรอินสแตนซ์ จากบางส่วน...
แล้วตัวแปรท้องถิ่นล่ะ
คุณทำได้ :
<%= render :form, message: "Apples Are Good" %>
ซึ่งจะทำให้คุณเข้าถึงmessage
เป็นตัวแปรท้องถิ่นในส่วนของคุณ
ถัดไป :
คุณจะได้เรียนรู้วิธีแสดงหลายสิ่งด้วย render
. เดียว โทรเลย!
วิธีการแสดงคอลเล็กชัน
บางส่วนช่วยให้คุณแสดงคอลเล็กชันโดยไม่มีการวนซ้ำ
สมมติว่าคุณกำลังแสดงผล @books
.
คุณทำได้ :
<%= render @books %>
สิ่งนี้จะได้ผลถ้าคุณมี _book.erb
บางส่วน &ใช้ book
เป็นตัวแปรของคุณภายในเทมเพลตนั้น
ตัวอย่าง :
# app/views/books/_book.erb <%= image_tag(book.cover) %><%= book.title %>
<%= book.author %> <%= link_to "Read Book", book %>
หากคุณต้องการหมายเลขหนังสือปัจจุบัน (สำหรับคลาส CSS ของคุณ) คุณสามารถใช้ book_counter
.
ที่ไหน book_
เป็นชื่อรุ่นของคุณ
ฉันคิดว่าการแสดงคอลเลกชันเป็นหนึ่งในคุณสมบัติ Rails ที่ฉันโปรดปราน!
ทำความเข้าใจเค้าโครง Rails
เมื่อคุณสร้างแอป Rails ใหม่ แอปจะมาพร้อมกับโฟลเดอร์ "เลย์เอาต์" ใต้โฟลเดอร์มุมมอง
คุณจะพบ application.html.erb
ไฟล์.
นั่นคือเค้าโครงเริ่มต้น!
เลย์เอาต์คืออะไร
เลย์เอาต์ช่วยให้คุณทำให้ไซต์ของคุณมีรูปลักษณ์ที่สอดคล้องกัน
มัน :
- เมนู
- ส่วนท้าย
- กำลังโหลดไฟล์ CSS &Javascript...
ส่วนใหญ่แล้วเลย์เอาต์เริ่มต้นก็ใช้ได้
แต่ถ้าคุณต้องการรูปแบบที่แตกต่างกันสำหรับหน้าใดหน้าหนึ่ง
คุณสามารถใช้ layout
ตัวเลือก
ตัวอย่าง :
render :index, layout: 'admin'
คุณสามารถปิดการใช้งานเลย์เอาต์ :
render :index, layout: false
และคุณสามารถกำหนดเลย์เอาต์ที่ระดับคอนโทรลเลอร์ได้
ถูกใจสิ่งนี้ :
class AdminsController < ApplicationController layout 'admin' end
การแสดงผลไม่สิ้นสุดการกระทำ
จุดที่ทำให้เกิดความสับสนอย่างหนึ่งคือการคิดว่าการเรนเดอร์ (และการเปลี่ยนเส้นทาง) ภายในการทำงานของคอนโทรลเลอร์จะหยุดรันโค้ดใดๆ หลังจากนั้น
คุณสามารถติดต่อกับสิ่งนี้ได้หากคุณโทร render
หลายครั้ง
ตัวอย่าง :
def create if yellow_fruit? render :bananas end render :apples end
ซึ่งจะส่งผลให้เกิดข้อผิดพลาดเนื่องจาก render :apples
ทำงานเสมอและคุณไม่สามารถแสดงผลสองครั้งในการกระทำของตัวควบคุมเดียวกันได้
นี่คือวิธีแก้ปัญหา :
def create if yellow_fruit? render :bananas else render :apples end end
อีกทางเลือกหนึ่งคือการใช้ return
คีย์เวิร์ดหลัง render
แต่เพื่อความชัดเจน เป็นการดีที่สุดที่จะหลีกเลี่ยง return
กลางของวิธีการ คำสั่งเมื่อเป็นไปได้
สรุป
คุณได้เรียนรู้เกี่ยวกับหัวข้อสำคัญทั้งหมดของการเรนเดอร์ใน Ruby on Rails แล้ว
การแสดงผลช่วยให้คุณสามารถส่งคืนเนื้อหาไปยังผู้ใช้แอปพลิเคชันของคุณ &เป็นหนึ่งในขั้นตอนสุดท้ายภายในการดำเนินการควบคุมของคุณ การทำความเข้าใจการเรนเดอร์ช่วยให้คุณเขียนแอปพลิเคชัน Rails ได้ดีขึ้น
ตอนนี้ถึงตาคุณแล้ว เปิดโปรแกรมแก้ไขและฝึกทักษะการเขียนโค้ด
ขอบคุณสำหรับการอ่าน!