Rails' Batteries-included Approach เป็นหนึ่งใน Greatest Assets ไม่ Framework ไหนทำให้ Start Application ได้ง่ายและรวดเร็วขนาดนี้ ส่วนหนึ่งมาจาก Rails Generators
ถ้าใช้ Rails มาสักพัก คุณคงเจอ Generators ต้องการสร้าง App ใหม่? รัน rails new ต้องการ Scaffold Models และ Views ใหม่เยอะ? รัน rails generate scaffold มีอีกหลายโหลช่วยเริ่มต้นรวดเร็วหรือ Streamline Workflow
แต่บางครั้ง Generators แค่พอไม่พอ คุณอาจอยาก Customize Behavior ของ Commands นี้ หรือแม้แต่สร้างของตัวเอง ในบทความนี้ เราจะมอง Generators ใกล้ชิด — โดยเฉพาะวิธีสร้าง Custom Rails Application ด้วย Templates
เริ่มกันเลย!
Rails Generators คืออะไร?
别混淆กับ Generator Functions (ที่คุณคุ้นเคยจาก Python หรือ Javascript) Rails Generators คือ Custom Thor Commands ที่ Focus บน Generation
มีตัวอย่างเยอะ คุณคงคุ้น Model Generator (rails generate model) สร้าง ActiveRecord Models ใหม่ หรือ Migration Generator (rails generate migration) สร้าง Migrations ใหม่ มี rails generate generator ซึ่ง — คุณเดาถูก — สร้าง Generator ใหม่!
Generators เรียกกันได้ — เช่น rails scaffold จะเรียก Generators อื่นเยอะ — และ Provide Methods สร้าง/Modify Files, Install Gems, รัน Rake Tasks เฉพาะ และมากมาย มาสร้าง Simple Model Spec Generator เข้าใจการทำงาน
สร้าง Generator ของคุณเองใน Ruby on Rails
รันคำสั่งนี้:
จะสร้าง Files ใหม่หลายตัวใน /lib/generators/model_spec เราสามารถ Modify model_spec_generator.rb ใน Folder lib/generators/model_spec/ เพื่อสร้าง Model Spec File ใน Directory ที่ถูกต้อง:
Command template จะหา Template File ใน lib/generators/model_spec/templates และ Render ไป Location ที่ระบุ — Directory spec/models Command จะ Replace ERB-style Variables ที่เจอใน Template File
ด้วยการ Set source_root เราแจ้ง Generator ว่าหา Referenced Template Files ได้ที่ไหน Template model_spec.rb ใน Folder lib/generators/model_spec/templates/ อาจเป็นแบบนี้:
เมื่อสร้าง File นั้นแล้ว คุณรัน Generator สร้าง Spec File ใหม่ได้
Gems หลายตัว Ship Generators แบบนี้ จริงๆ เราสร้าง Simplified Version ของ Generator ที่ Rspec Ship ไป FactoryBot มี Generator สำหรับ Factories มีอีกมาก
Generators ใน Gems ต่างๆ Sophisticated กว่าที่เราสร้าง เราสามารถทำให้ Generator รับ Arguments หรือ Hook เข้า Generators ที่มีอยู่ เช่น rails scaffold อ้างอิง Rails Generators Documentation หากอยากเรียนรู้เพิ่ม
Generators มี Potential ลดความซับซ้อน Workflow ใน Existing App แตเราสามารถใช้ Generators Customize Setup App ใหม่ได้ไหม?
เข้าสู่ Templates!
Templates ใน Ruby on Rails
正如名字所示 Templates คือ Files สำหรับ Customize Application Setup อย่าสับสนกับ Template Files ที่พูดไปก่อนหน้า! Under the hood พวกมันคือ Generators ด้วย Purpose เฉพาะ ตาม Template API แม้ไม่ Identical กับ Generators แตคล้ายมาก
ถ้าคุณมี Template File อยู่แล้ว ใช้ได้แบบนี้:
แทนที่จะระบุ Local File คุณอาจระบุ URL ได้ด้วย นี่มีประโยชน์มากเพราะ Share Application Templates ได้
คุณไม่จำกัดแค่ใช้ Templates ตอน rails new หาก Setup App แล้ว คุณ Apply Templates หลังจากนั้นได้โดย Execute:
Templates มีประโยชน์มาก ใครไม่อยาก Automate การเพิ่ม Gems เดียวกันและ Config Changes เดียวกันทุกครั้งที่สร้าง App ใหม่? สร้าง Application Template เองสนุก — แม้ไม่ Save Time มากใน Long Run
สร้าง Template ของคุณเองใน Rails
ตอนนี้เรารู้ Generators และใช้ Templates มาสร้าง Simple Application Template Automate Setup Steps
การ Setup Rails App ขึ้นกับ Personal Preference มาก แต่นี่คือตัวอย่าง:
- Install Gem dotenv
- สร้าง File
.env.developmentสำหรับ Development Environment - ปรับ Database Config File ให้ใช้ Environment Variables
- Optional: Install และ Setup Rspec
มาสร้าง Local File — mytemplate.rb — และเพิ่ม dotenv ด้วย Command gem
เพิ่งเพิ่ม dotenv Gem มา มาสร้าง File .env.development สำหรับ Database Config
คุณสร้าง File ใหม่ด้วย Content เฉพาะได้ด้วย create_file คุณไม่พบใน Template หรือ Generator Documentation เพราะ Method นี้ Supplied by Thor คุณอาจพบ Alias file Application Templates Evaluate ใน Context ของ Rails::Generators::AppGenerator และนั่นคือที่ที่ Alias file Defined
Variable app_name มี Argument แรกของ rails new ใช้ Variable นี้ Ensure Config File Match Generated Application
ต่อมา ใช้ Environment Variables Connect Database เราอาจ Overwrite config/database.yml ทั้งหมดด้วย create_file แต่มา Modify แทนด้วย inject_into_file
เราใช้ Strings หรือ Regex กับ Argument after ระบุ Inject Content ที่ไหน
แน่นอน Config แบบนี้ทำ Sense ก็ต่อเมื่อ User ไม่สร้าง App ด้วย SQLite คุณ Check Presence ของ Arguments ด้วย Variable options ดีกว่าอ่าน Source Code ของ Rails App Generator ดู Options ที่ Available
สุดท้าย ให้ User Install Rspec หากต้องการ มี Methods ต่างๆ สำหรับ User Input และ Interactive Templates Method yes? ถาม User Confirmation:
เรารู้ gem Method แล้ว แต generate และ after_bundle ใหม่
Rspec เพิ่ม Generators ของตัวเอง และคุณเรียก Generators นี้ (หรือตัวอื่นๆ) จาก Template ได้โดยตรง แต่มี Catch — Gems ที่ Specified ด้วย gem Method Install ที่สิ้นสุด Template การเรียก generate ด้วย Generator จาก Gem เหล่านี้จะ Fail — เพราะฉะนั้น Register Command เป็น Callback ด้วย after_bundle
Note: ก่อน Wrap Up คำเตือนเล็กน้อยเกี่ยว Create/Modify Files เราใช้ create_file และ inject_into_file แต่มี Options อื่นเยอะ คุณอาจพบ copy_file หรือ template อ่าน Templates ต่างๆ ไม่ได้กล่าวถึงเพื่อ Keep Things Simple หากอยากสร้าง Advanced Templates ควรรู้ Methods อื่นสำหรับ Deal กับ Files
ผลลัพธ์: Template สุดท้ายใน Rails
Template สุดท้ายควรเป็นแบบนี้:
คุณ Test Template นี้ได้โดยรัน:
หรือ:
เพื่อใช้ Custom Database Configuration
เหมือนที่กล่าว File นี้เหมาะสำหรับ Share เป็น GitHub Gist ปรับให้เหมาะความต้องการ Upload แล้ว Share ให้เพื่อนร่วมงาน เพื่อน และใครสนใจ Custom App Template 😉
เรียนรู้เพิ่มเติมเกี่ยว Rails Generators และ Templates
ไม่ต้องพูด เราเพิ่ง Scratch Surface เท่านั้น
ทุกคนมี Preference ต่างกันเขียนและ Develop Rails Apps จึงมี Generators และ Application Templates มากมาย คุณเรียนรู้ได้เยอะจากการอ่านเกี่ยวพวกเขา แนะนำ Chris Oliver's Jumpstart และ RailsBytes ซึ่งเป็น Community-curated Collection of Templates
มี Thoughtbot's Suspenders ซึ่ง Inspire ผมขุดลึก Rails Generators และ Templates ผมเขียน Application Template เอง — Schienenzeppelin — ซึ่งแม้ไม่ Up-to-date อาจให้ Inspiration บ้าง
สรุป: เริ่มต้นกับ Ruby on Rails Generators และ Templates
ในบทความนี้ เรา看 Basics ของ Rails Generators และการใช้งาน เราสร้าง Generators เองลดความซับซ้อนเขียน Model Specs ใหม่
เราแล้วเจาะลึก Templates และเรียนรู้วิธีสร้าง Simple Template Customize Application Setup นี่อาจใช้เวลาสักหน่อย แต่ Rewarding ถ้าการเขียน Template เองไม่ใช่ของคุณ มี Existing Ones มากออนไลน์ให้เลือก!
Happy Templating!
P.S. หากต้องการอ่านบทความ Ruby Magic ทันทีที่เผยแพร่ สมัคร Newsletter Ruby Magic ของเราและจะไม่พลาดบทความเด็ดๆ ไป!
Hans-Jörg Schnedlitz
ผู้เขียน אורח Hans เป็น Rails Engineer จาก Vienna, Austria เขาใช้เวลาส่วนใหญ่ Coding หรืออ่านเกี่ยว Coding และบางครั้งเขียนเกี่ยวกับมันบนบล็อก! ตอนไม่ได้นั่งหน้าจอ คุณคงหาเขาได้ข้างนอก ปีนเขาบางลูก
บทความทั้งหมดโดย Hans-Jörg Schnedlitz