ניסוי ריילס - שימוש ב Vue בלי Build Step
אחד הטרנדים של ריילס היום הוא לוותר על ה Build Step ולהשתמש רק ב JavaScript. בניסוי היום כתבתי פרויקט ריילס שמשלב את vue כדי לראות איך זה עובד ובמה זה שונה מפרויקט צד-לקוח רגיל.
טיפים קצרים וחדשות למתכנתים
אחד הטרנדים של ריילס היום הוא לוותר על ה Build Step ולהשתמש רק ב JavaScript. בניסוי היום כתבתי פרויקט ריילס שמשלב את vue כדי לראות איך זה עובד ובמה זה שונה מפרויקט צד-לקוח רגיל.
אחד הרעיונות היפים בריילס, ואחד הרעיונות שלקח לי הכי הרבה זמן להבין, הוא ה Active Record Validations. הסיפור בקצרה הוא שלפעמים יש לנו באפליקציה טפסים שמטרתם ליצור או לעדכן מידע בבסיס הנתונים. המידע בבסיס הנתונים בריילס מיוצג על ידי קלאס שנקרא Active Record, ולכן כשצריך לעשות וולידציה על המידע בטפסים אותם Active Records יהיו המקום האידאלי. בפוסט זה אראה בקצרה איך להשתמש ב Active Record Validations ביישום ולאחר מכן אמשיך למספר טיפים לשימוש נכון בהם.
גירסא חדשה של רובי יוצאת כל שנה בערך, עם רובי 2.5 שיצאה במרץ 2018 ואחריה בדצמבר יצאה 2.6. התוכנית היא לשחרר את 2.7 בדצמבר השנה, מה שנותן לנו כמה חודשים להנות משתי הגירסאות האחרונות של 2018. נעבור לראות כמה יכולות חדשות שלהן כדי שגם לכם יהיה חשק לשדרג.
הבעיה עם רובי היא שבדיוק כשאתה חושב שאתה מבין מה קורה היא מצליחה להפתיע ולעקוף את ההגנות של עצמה. כך הסיפור עם תבנית ה Singleton.
מימוש סינגלטון ברובי הוא דבר די פשוט - מאחר ויש מקום לכתוב קוד איתחול שייקרא בעת טעינת הקלאס, נוכל להגדיר משתנה סטטי ולאתחל אותו בזמן הטעינה:
class Critter
@@instance = Critter.new
def self.instance
@@instance
end
def val
5
end
end
ואכן יש לנו מחלקה Critter עם מתודה בשם instance שמחזירה תמיד את אותו אוביקט:
c = Critter.instance
d = Critter.instance
puts c == d # true
רובי אפילו הלכה צעד אחד קדימה ונתנה קיצור דרך לתבנית הזאת בדמות מודול בשם singleton שבנוי כבר בשפה. הקוד הבא עושה בדיוק את אותו הדבר:
require 'singleton'
class Critter
include Singleton
def val
5
end
end
c = Critter.instance
d = Critter.instance
puts c.val
puts d == c
הבעיות מתחילות כשננסה להסתיר את הפונקציה new. כאן לרובי יש סוג של פיתרון באמצעות הפונקציה private_class_method
. כך נראה Critter שמסתיר את פונקציית new שלו:
class Critter
include Singleton
def val
5
end
private_class_method :new
end
ובאמת מי שינסה לקרוא עכשיו ל Critter.new יקבל את השגיאה:
NoMethodError: private method `new' called for Critter:Class
הבעיה שרובי מספקת עוד כמה דרכים להפעיל פונקציות, לדוגמא באמצעות הפקודה send. הקוד הבא עובד ומדפיס false:
require 'singleton'
class Critter
include Singleton
def val
5
end
private_class_method :new
end
c = Critter.instance
d = Critter.send(:new)
puts d.val # print 5
puts d == c # false
צריך לזכור שהמעבר לשפה דינמית כרוך בשינויי תפיסה מסוימים, המרכזי שבהם הוא אובדן תחושת השליטה. אנחנו לא אומרים למתכנתים אחרים שהם לא יכולים לקרוא לפונקציה מסוימת, כי תמיד תימצא דרך. במקום זה נגיד שאנחנו ממליצים לא להפעיל את זה, או שאם תיצור עוד מופע מ Singleton דברים כנראה יישברו ואתה תצטרך לתקן את זה. זאת המשמעות האמיתית של private ב Ruby ולכן גם של private_class_method
.
ל Bash יש פיצ'ר מדליק שמחליף במהירות את הסוף של מילה, מה שעוזר לנו לכתוב סקריפטים שמשנים שמות של קבצים. הקוד הבא ב Bash יחליף במהירות את כל הקבצים שמסתיימים ב old לסיומת new:
for fname in *.old
do
mv "$fname" "${fname%old}new"
done
מסתבר שלרובי יש טריק דומה עם הפקודה chomp. פקודה זו בדרך כלל חותכת את התו האחרון במחרוזת, אבל אם נעביר לה מחרוזת היא תחתוך את המחרוזת שהעברנו מסוף המחרוזת המקורית.
בקוד זה נראה כך:
glob("*.old").each do |fname|
File.rename(fname, fname.chomp("old") + "new")
end
קסם נוסף שיש ל Bash בשרוול הוא מחיקת קטע מהתחלה של מחרוזת עם סימן הסולמית - אבל לא הצלחתי למצוא מקבילה טובה ברובי אליו.
ברובי יש פעולה ייחודית של העברת בלוק לפונקציה, ועוד הם הוסיפו שתי דרכים לעשות את זה עם הבדל קטן ביניהן. בואו נראה למה צריך להעביר בלוקים לפונקציות ומה ההבדל בין שתי הדרכים.
ספריית Rails מגיעה עם מנגנון לבניה אוטומטית של טפסים חכמים. שני המנגנונים המרכזיים שטפסים אלה מייצרים הם הגנה מפני CSRF ויצירת שמות לשדות באופן אוטומטי. בניה של מנגנון דומה ב React תעזור לנו להבין את ה Context API של ריאקט וגם לקבל קוד נקי יותר.
ביום חמישי בבוקר אעביר וובינר של שעה על הספריה Ruby On Rails: ספריה לפיתוח יישומי Web מלאים. בשעה אני מתכנן לכתוב אתכם Web Application מלא בו משתמשים יוכלו לפרסם לינקים לדברים שאהבו ומשתמשים אחרים יוכלו לעשות "לייק" על הלינקים.
רוצים לבוא? זה קישור להרשמה:
אליקסיר היא אחת השפות המדליקות ביותר שאתם לא כותבים בהן וחבל. ואני יודע שבטח תשאלו תכף למה צריך בכלל עוד שפה ומה אליקסיר עושה טוב יותר משפות אחרות, אבל אלה לא השאלות החשובות. כי לאליקסיר שתי תכונות שמייחדות אותה משאר העולם: היא פונקציונאלית והמידע בה לא משתנה לעולם מרגע שנוצר, מה שנקרא Immutable. כתיבה באליקסיר עוזרת לתרגל תבניות שמקבלות מקום צדדי בשפות אחרות.
שפת רובי היא השפה הכי מדליקה שאתם לא כותבים בה. מי שקורא רובי בפעם הראשונה עלול להרגיש שהכל נשמע כמו יפנית. ובצדק. כי מי שהמציא את רובי הוא יפני בשם יוקישירו משצימוטו, אבל כולם קוראים לו מץ. מץ בכל מקרה חשב ששפות תכנות צריכות לעבוד בשבילנו ולא אנחנו בשבילן ולכן הכניס לרובי את כל היכולות שיכל לחשוב עליהן כדי שלמתכנתים יהיה כיף. אני מקווה שעד סוף המדריך תשתכנעו שהוא הצליח.