บอกว่าฉันมี Rails Model ชื่อ Thing สิ่งที่มีแอตทริบิวต์ URL ที่สามารถเลือกที่จะกำหนดให้อยู่ที่ไหนสักแห่ง URL บนอินเทอร์เน็ต ในมุมมองรหัสฉันต้องการตรรกะที่ทำต่อไปนี้:
<% if thing.url.blank? %>
<%= link_to('Text', thing_path(thing)) %>
<% else %>
<%= link_to('Text', thing.url) %>
<% end %>
ตรรกะตามเงื่อนไขนี้ในมุมมองน่าเกลียด แน่นอนฉันสามารถสร้างฟังก์ชันผู้ช่วยซึ่งจะเปลี่ยนมุมมองเป็น:
<%= thing_link('Text', thing) %>
นั่นแก้ปัญหาการฟุ่มเฟื่อย แต่ฉันชอบที่จะมีฟังก์ชั่นการใช้งานในรูปแบบของตัวเอง ในกรณีนี้รหัสการดูจะเป็น:
<%= link_to('Text', thing.link) %>
เห็นได้ชัดว่านี่จะต้องมีวิธีการเชื่อมโยงในรูปแบบ นี่คือสิ่งที่จะต้องมี:
def link
(self.url.blank?) ? thing_path(self) : self.url
end
ถึงจุดของคำถาม, thing_path () เป็นวิธีที่ไม่ได้กำหนดไว้ในรหัสรุ่น ฉันสมมติว่าเป็นไปได้ที่จะ "ดึง" วิธีการช่วยเหลือบางอย่างลงในโมเดล แต่อย่างไร มีเหตุผลจริงหรือไม่ที่การกำหนดเส้นทางทำงานที่คอนโทรลเลอร์และดูเลเยอร์ของแอปเท่านั้น? ฉันสามารถคิดถึงหลายกรณีที่รหัสรุ่นอาจต้องจัดการกับ URL (การรวมเข้ากับระบบภายนอก ฯลฯ )