model and controller sharing across different programs

  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.
  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.

พอเขียน web app แบบ MVC ไปสักพัก.​ ผมก็พบว่ามี controller กับ model ที่ผมใช้บ่อยๆ ในหลายๆ app. ตอนจะ share กันถ้าเป็น view คงทำ helper แยกต่างหากได้. หรือถ้าเป็น controller ก็อาจจะทำ component แยกไว้. แต่นี่เป็น controller + model ที่เป็นคู่กันอย่างติดแน่น ผมเรียก controller ไม่รู้ถุกเปล่า เพราะว่า controller ตัวนี่ไม่ได้ต่อกับ view ตรงๆ (คือมีเจตนาจะแยกมันออกจาก view อย่างเด็ดขาด).

diagram: some contrllers and some models in MVC

เป็นปัญหาที่เอามาจาก Yaitron dictionary และ controller ที่เอาไว้ช่วย query dictionary ออกมา. เดิมที่ใช้ copy ไฟล์เอา. :-P ไม่ได้แยกเป็น package ต่างหาก. ถ้าจะแยกเป็น package ต่างหาก. Ruby on Rails Turbogears Django CakePHP Drupal มีท่าช่วยบ้างหรือเปล่า?

(ผมแอบลองมาท่าถึงแต่ใช้ tapestry http://gotoknow.org/blog/construction/112609 )

sirn's picture

สร้างเป็น Library ใส่ไว้ใน lib/ สิครับ

veer's picture

หมายถึง Rails? เราเอา model ไปใส่ใน lib ได้เลยใช่เปล่าครับ? Rails จะตามไป load ให้?

sirn's picture

เข้าใจว่าจะตาม load ให้ครับ (ถ้าไม่โหลดก็ไปสั่ง require ใน environment.rb ก็น่าจะได้)

แต่เท่าที่ผมเห็น Mephisto เขาใช้ เขาเขียนเป็น Library เล็กๆ ภายใต้ชื่อ Mephisto แล้วให้ Controller เรียกเอา ในนั้นมีทั้งส่วนของ Route (ยกมาจาก route.rb) หรือส่วนติดต่อกับฐานข้อมูลบางส่วนอยู่ด้วย เข้าใจว่าน่าจะกรณีคล้ายๆ กัน

ลองดูจากไฟล์ mephisto_init.rb กับใน mephisto/ ใน SVN ดูครับ

veer's picture

เฮือกเหนือจัด -_-! ขอบคุณครับสำหรับตัวอย่าง :-).

ใน code ที่ใช้ database คือ app/cachers/article_observer.rb เปล่าครับ? ที่เรียกจาก mephisto_init.rb อีกที?

ผมสรุปแบบนี้ได้หรือเปล่า? เอา model หรือ controllers ไปไว้ที่ไหนก็ได้สักที่นึง.​แล้วไป hook dispatcher ให้ไปเรียกเอา. (เข้าใจถูกปะครับ?)

sirn's picture

observer เอาไว้สำหรับทำงานประเภท before_safe, after_save ที่ควรจะอยู่ใน Controller ครับ (เช่น Clear Cache ก็ไม่ควรจะอยู่ใน Model :D) ท่ี่น่าจะใกล้เคียงที่สุดน่าจะเจ้าไฟล์ taggable_methods.rb นี่ ที่หน้าที่ของมันก็ขึ้นอยู่กับ model Tag

เอ พิมพ์ๆ ไป ชักเริ่มไม่แน่ใจเองว่าผมเข้าใจคำถามถูกหรือเปล่าในตอนแรก -_-” แต่ทางที่ผมคิดว่าน่าจะใช้ได้ก็มี

  1. แยกส่วนที่จะแชร์ออกมาเป็น Library แล้วก็เรียกใช้ Library นั้นร่วมกัน (ฟีลเหมือนประมาณสร้าง Gem แล้วก็แย่งกันเรียกใช้) อันนี้น่าจะดูสะอาดที่สุด :D
  2. แก้ environment.rb แล้วไป require ไฟล์ Model/Controller จากอีก Application นึงมาใช้โต้งๆ
veer's picture

ขอบคุณครับ ไว้ผมลองทำดู. :-)

ลองทำเป็น plugin ดูสิ
เวลาจะใช้ ก็แค่หย่อนไปไว้ใน project ที่ต้องการ
http://railsforum.com/viewtopic.php?id=682

veer's picture

น่าลองดีครับ. :-) เห็น plugin มันจะไปแก้ behavior ของ Rails แต่ยังไม่เคยเห็นคนใส่ model เข้าไปเลย. แต่ว่าไม่เคยเห็นก็ไม่ใช่ว่าจะใส่ไม่ได้ :-P.

ลองดูอันนี้สิ
http://rails-engines.rubyforge.org/rdoc/login_engine/

veer's picture

ขอบคุณมากครับ. ตรงมาก login มี model ของตัวเองด้วย.

ย้าย Codenone

ประกาศย้าย Codenone ไปใช้ Forum ของ Blognone แทนครับ ตามไปตั้งกระทู้ต่อได้ที่ Codenone Forum (รายละเอียดอ่านจากกระทู้ ย้าย Codenone ไปรวมกับ Blognone)

กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น