העוזר הקטן של הרשימה

למי שאינו מכיר, ב rails יש לנו "עוזרים" או helpers בשמם הממשי, אשר תפקידם הוא לספק לנו כלים העוזרים לנו בזמן שאנחנו יוצרים תצוגה בכך שהתצוגה שלנו תכיל כמה שפחות לוגיקה וקוד, וכמה שיותר שנתמקד בדברים שאנחנו צריכים באמת – תצוגה.

אחד הדברים הכי מעצבנים אותי (כרגע) בrails הוא שאין כלים שמטפלים ברשימה, ואני צריך ליצור קוד שלי לבד. מה הכוונה ? נגיד ויש לי תוצאה של שאילתא ואני רוצה להציג אותה בol או ul, אין לי כלי שעושה את העבודה (אם אני רוצה ב combo box או list רגיל [הרכיב של ה form] אז כן יש לי עוזרים נחמדים), ולכן התחלתי לחקור אם מישהו כבר כתב משהו בשביל זה.

רק בשביל שתבינו את הבעיה, אז ככה עושים את זה ללא העוזר:

<ol>
<% @some_result.each do |rec| -%>
<li><%= link_to h(rec.name), some_route_path -%></li>
<% end -%>
</ol>

הרבה קוד נכון ? אז התחלתי לחפש וגיליתי את הקוד הבא. הקוד יחסית טוב, אבל עדיין לא מה שהייתי צריך, אז לקחתי אותו ושיכתבתי אותו:

def list(tag, stuff, &block)
# content_tag(tag, stuff.map { |t| content_tag(:li, yield(t)) })
return "" if stuff.nil? || stuff.empty?
items = ""
stuff.each { |t| items << '<li>' + yield(t) + "</li>" }
return "" if items.empty?
"<#{tag.to_s}>#{items}</#{tag.to_s}>"
end
def ol(stuff, &block)
list(:ol, stuff, &block)
end
def ul(stuff, &block)
list(:ul, stuff, &block)
end

אם אתם שואלים מדוע הורדתי את השימוש בcontent_tag, התשובה היא פשוטה, הוא עושה יותר מידי פעולות כמו המרה ממערך למחרוזת ועוד, ככה שאם יש לי הרבה אלמנטים, הוא יהיה מאוד איטי. אין לי מושג אם הקוד שלי יהיה יותר מהיר, אבל אני משער שכן.

השימוש במה שיצרתי מאוד פשוט ד"א:

<%= ol(@some_result) { |e| link_to(h(e.name), some_route_path) } -%>

פחות קוד נכון ? וגם אפשר להתרכז במה שבאמת רוצים להתרכז בו. ד"א במידה ואתם משתמשים הרבה ב link_to או בכלים דומים, אפשר כמובן גם לכתוב כלי שיעשה את זה ולקבל רק את התוכן שצריך.

כתיבת תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s