Flash messages คืออะไร?
Flash message เป็นวิธีสื่อสารข้อมูลกับผู้ใช้ของแอปพลิเคชัน Rails ของคุณ เพื่อให้พวกเขารู้ว่าสิ่งที่เกิดขึ้นเป็นผลมาจากการกระทำของพวกเขา
ตัวอย่างข้อความ:
- "Password changed correctly" (ยืนยัน)
- "User not found" (ข้อผิดพลาด)
คุณตั้งค่า flash messages นี้ในคอนโทรลเลอร์ของคุณ แล้วเรนเดอร์ในวิวของคุณ ผู้ใช้ของคุณสามารถดำเนินการต่อได้ตามเหมาะสม
มาเรียนรู้อย่างแน่ชัดว่าสิ่งนี้ทำงานอย่างไร!
วิธีใช้ Flash Messages
คุณสามารถทำงานกับข้อความแจ้งเตือนเหล่านี้โดยใช้เมธอด helper flash
มันทำงานคล้ายแฮช (Ruby hash) มาก
ออบเจ็กต์ flash มีเมธอดเช่น keys, any? หรือ each และคุณสามารถเข้าถึงข้อความเฉพาะได้ด้วย []
คุณสามารถตั้งค่า flash messages ได้กี่ประเภท?
โดยค่าเริ่มต้นคุณมี:
- notice
- alert
ตัวอย่างวิธีใช้:
flash.alert = "User not found."
หรือหากคุณชอบ:
flash[:alert] = "User not found."
(แค่ความแตกต่างของสไตล์)
คุณสามารถใช้โค้ดนี้ภายในการกระทำคอนโทรลเลอร์ของคุณ เช่น index, create, new เป็นต้น
อีกวิธีหนึ่งคือ:
redirect_to :books_path, notice: "Book not found"
สิ่งนี้อนุญาตให้คุณ redirect และสร้าง flash message ในขั้นตอนเดียว
ดี!
Alert vs Notice
ที่ผมเข้าใจ ไม่ว่าคุณจะใช้ alert หรือ notice ก็ไม่แตกต่างกันมาก
ใช้ตัวที่รู้สึก tự nhiênกว่าสำหรับสถานการณ์ของคุณ
ผมชอบคิดว่า alert เป็นข้อความข้อผิดพลาด และ notice เป็นข้อความยืนยัน
การแยกพวกมันช่วยให้คุณจัดสไตล์ต่างกันได้
ตัวอย่าง:
คุณสามารถแสดง alerts ในสีแดง และ notices ในสีเขียว
ยังเป็นไปได้ที่จะสร้าง flash types ของคุณเอง โดยใช้เมธอดคอนโทรลเลอร์ add_flash_types
แบบนี้:
class ApplicationController add_flash_types :info, :error, :warning end
ผมชอบทำให้เรียบง่าย ดังนั้นผมจึงใช้ประเภทในตัว 🙂
การเรนเดอร์ Flash Messages
Flash messages ไม่ได้แสดงอัตโนมัติ
คุณต้องเรนเดอร์พวกมันภายในหนึ่งในวิวของคุณ เพื่อให้ผู้ใช้เห็น
พิจารณาเพิ่มสิ่งนี้ใน application layout ของคุณ
ตัวอย่างโค้ด:
<% flash.each do |type, msg| %> <%= msg %> <% end %>
วางสิ่งนี้ที่ใดก็ตามที่คุณต้องการแสดง notice โดยปกติอยู่ด้านบนของหน้า ใต้แถบเมนู
จำไว้:
เมื่อคุณเรนเดอร์ข้อความแล้ว มันจะถูกลบออกจาก flash ดังนั้นมันจะไม่แสดงซ้ำ
การจัดสไตล์ Notice และ Alert Messages ของคุณ
Flash messages ไม่มีการออกแบบหรือสไตล์ในตัว
วิธีแก้?
หากคุณใช้ Bootstrap คุณสามารถใช้คลาส CSS "alert alert-info" เพื่อให้ flash messages ดูดี
ตัวอย่าง:
<% flash.each do |type, msg| %> <%= msg %> <% end %>
มันดูแบบนี้:

หากคุณ ไม่ได้ ใช้ Bootstrap แล้วคุณสามารถเขียน CSS ของคุณเองเพื่อให้มันดูยังไงก็ได้
Flash Messages ถูกเรนเดอร์เมื่อไหร่?
Flash messages ถูกลบเฉพาะในการกระทำคอนโทรลเลอร์ถัดไป หลังจากที่คุณแสดงพวกมัน
นัยสำคัญ:
- หากคุณ
redirect_toแล้วเรนเดอร์flashmessage นั่นดี - หากคุณ
redirect_toและ ไม่ เรนเดอร์ข้อความ ข้อความจะค้างอยู่ในแฮชflash - หากคุณ
renderในการกระทำเดียวกันที่คุณตั้งค่าflashmessage ข้อความflashนั้นจะพร้อมใช้งาน แต ไม่ถูกลบ ดังนั้นจะค้างอยู่และอาจแสดงซ้ำ
ดังนั้น...
ถ้าคุณต้องการตั้ง flash message สำหรับการกระทำปัจจุบัน?
นั่นคือที่มาของ flash.now!
ตัวอย่าง:
def index
@books = Book.all
flash.now[:notice] = "We have exactly #{@books.size} books available."
end
สิ่งนี้จะเรนเดอร์วิว index
ข้อความ notice จะแสดงและถูกลบออกจาก flash ดังนั้นจะไม่แสดงซ้ำ
กล่าวอีกนัยหนึ่ง:
คุณต้องใช้ flash.now ก็ต่อเมื่อคุณจะ render แทนที่จะ redirect
สรุป
คุณได้เรียนรู้เกี่ยวกับ flash messages ใน Rails และวิธีใช้งานอย่างถูกต้องแล้ว!
Btw, flash messages ไม่เหมือนกับ validation errors Validations เกี่ยวข้องกับออบเจ็กต์โมเดล และคุณเข้าถึงข้อความการตรวจสอบได้ด้วยเมธอด errors เช่น @user.errors
ตอนนี้ถึงคุณนำไปปฏิบัติจริงโดยเขียนโค้ดบ้าง
ขอบคุณที่อ่าน!