Archive for the 'Ruby และ Rails' Category

การใช้ jQuery Ajax put กับ delete ใน Ruby on Rails

สืบเนื่องมาจากไปอ่าน blog rails66 แล้วได้อ่าน entry ของ sikachu เสร็จแล้วเห็นวิธีเขียนแต่ยังมองแล้วเข้าใจรวมถึงอ่านยาก เลยพยายามหาว่ามีวิธีเขียนแบบอื่นไหมสรุปว่าก็มีจริงๆครับแล้วก็ใช้ได้ 100% เพราะทดสอบแล้ว ดังนั้นผมจะมาเขียนให้อ่านกันครับ โดยยึดหลักของ entry นี้ใน rails66 ครับ โดยเริ่มต้นนอกเหนือจากการใส่ jquery เข้าไปในระบบแล้ว ที่มีปัญหาคือเรื่อง authenticity_token ซึ่งเจ้านี้คือตัวปัญหาที่ทำให้เรา เวลาจะส่ง ajax เป็นแบบ post / put / delete ทีไรก็มีปัญหาทุกที เราเลยมีวิธีแก้มาให้ครับ โดยผมได้ดัดแปลงนิดหน่อยจาก entry rails66 โดยเริ่มแรกให้ใส่ method นี้ลงไปใน application_helper.rb ครับ

def yield_authenticity_token
if protect_against_forgery?
%Q{
<script type=’text/javascript’>
//<![CDATA[
var AUTH_TOKEN = #{form_authenticity_token.inspect};
//]]>
</script>
}
end
end

ส่วนต่อมาให้เรานำ code นี้ไปใส่ใน application.js ใน public/javascript ครับ

(function($) {
$().ajaxSend(function(event, request, settings){ //Set request headers globally
request.setRequestHeader(“Accept”, “text/javascript, text/html, application/xml, text/xml, */*”);
request.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);
if (typeof(AUTH_TOKEN) == “undefined”) return;
settings.data = settings.data || “”;
// settings.data is a serialized string like “foo=bar&baz=boink” (or null)
settings.data += ((settings.data == “”) ? “” : “&”) + “authenticity_token=” + encodeURIComponent(AUTH_TOKEN);
});
})(jQuery);

เสร็จแล้วสุดท้ายให้เรานำ code นี้ไปใส่ใน application layout หรือใน page ที่ต้องการใช้งาน

<%=yield_authenticity_token%>

ส่วนวิธีใช้ก็ประมาณนี้ครับ

$.post(“hello/10″,{_method:”delete”},function(data){
$(“h1″).html(data);
});

โดยปกติแล้วถ้าเราไม่ทำแบบนี้เราต้องทำการส่ง authenticity_token ไปทุกครั้ง

$.post(“hello/put”,{_method:”put”,authenticity_token:encodeURIComponent(AUTH_TOKEN)},function(data){
$(“h1″).html(data);
});

โดยเจ้า AUTH_TOKEN นั้นจะต้องทำการ gen มาจาก form_authenticity_token.inspect ใน rails ซึ่งยุ่งยากหลายขั้นตอนเหลือเกิน ดังนั้นเลยต้องมีการทำแบบนี้ึึขึ้นมา โดยผมนำข้อมูลมาจากแหล่งเหล่านี้ครับ

  • http://blog.lawrencepit.com/2008/09/04/unobtrusive-jquery-rails/
  • http://pastie.org/212798
  • http://www.rails66.com/blog/?p=246
  • http://henrik.nyh.se/2008/05/rails-authenticity-token-with-jquery

Simply Rails 2 ~ Book Review ~

ruby and rails

หลังจากที่ไม่ค่อยอัพบล็อค วันนี้ผมขอมา Review หนังสือที่ผมได้อ่านจบไปเมื่อวานนี้ โดยใช้เวลาอ่านตั้งแต่ช่วง Thailand Next Web Apps 2008 เป็นเวลาเดือนหนึ่งพอดีต้องขอบอกว่าพอใจกับหนังสือเล่มนี้มากเลยได้ความรู้เรื่อง Rails 2 มาเยอะรวมถึง Convention over Configuration ของมันไปเยอะพอตัวเลยทีเดียว เอาละครับผมจะสรุปให้ฟังว่าเหมาะกับใครเป็นผู้่อ่าน

หนังสือ Simply Rails 2 มีประมาณ 500 หน้าโดยผมก็ค่อยๆอ่านไปเรื่อยๆ โดยก่อนที่ผมจะมาอ่านหนังสือเล่มนี้ผมอ่านหนังสือ Ruby มาหลายเล่มเหมือนกัน ทำให้ผมข้ามเนื้อหาช่วง Ruby ไปค่อนข้างเร็วซึ่งก็ประมาณ 200 หน้าได้ โดยจริงๆแล้วเล่มนี้เหมาะสมกับ

  • คนที่มีประสบการณ์ การเขียน MVC ด้วย Framework หรือปกติมาบ้างแล้ว
  • คนที่ต้องการศึกษาว่าเร็วมี Convention อย่างไรบ้าง
  • คนที่ต้องการดูกลไกการทำงานของ Rails แบบภาพรวมไม่ใช่เชิงลึก

โดยเนื้อหาที่มีจะคลอบคลุมทั้ง Ruby และ Rails 2 โดยเล่มนี้ที่ผมตัดสินใจอ่านแล้วได้ผลดีก็คือมันทำมาเพื่อ Rails 2 ดังนั้นใครใช้ version 2 ก็จะพอทำได้ โดยที่ผมใช้ทำตามแบบฝึกหัดเล่มนี้ผมใช้ Netbeans 6.5beta (แต่หนังสือใช้แบบ console ธรรมดาเลยนะ) ซึ่งก็สะดวกดีครับ เขียนน้อยได้เยอะจริงๆ แถม code สวยและมีความหมายทั้งเรื่องครับ โดยเล่มนี้จะไม่สอนเฉพาะ code ยังไงจะรวมถึงอธิบายด้วยว่า ทำไมต้องตั้งชื่อแบบนี้เป็น Convetion หรือเป็น Best Practice ที่ควรทำ โดยต้องอาศัยอ่านไปมาเล็กน้อยสำหรับคนที่ยังใหม่กับ Ruby หรือ Rails โดยส่วนตัวเล่มนี้ผมให้ 7.5/10 ครับเขียนได้ดี เข้าใจง่ายเป็นแบบเรียนไปทำไปครับ ใครชอบอ่านอย่างเดียวเล่มนี้จะไม่เห็นภาพ ที่สำคัญ Rails 2 อันนี้พูดถึงเรื่อง Test ด้วยนะครับ จะได้รู้ว่า Rails มีดีที่ Test ด้วยเหมือนกันครับ วันนี้ลาไปก่อนสวัสดีครับ

Ruby Best Practice Patterns ฉบับสรุป

หลังจากที่ผมเคยคิดจะจด Domain เกี่ยวกับ Ruby หรือ Rails มาเฉพาะของตัวเอง สรุปว่ายังไม่พร้อมสักเท่าไรเลยมาทำใน Blog ก่อนละกันครับ แล้วเดียวค่อย Dump บทความไปยังบ้านใหม่ก็ยังไม่สาย เอาละครับมาฟังผมสรุปวีดีโออันนี้กันครับ  Ruby Hoedown 2008 : Ruby Best Practice Patterns โดยนาย Rein Henrichs คนนี้เขาพูดดีมากครับ แต่กว่าผมจะจับใจความได้เล่นเอาเหนื่อยเหมือนกัน โดยผมจะสรุปเฉพาะ 40 นาทีแรกนะครับ ซึ่งเป็นเนื้อหาของเขาโดยตรง แล้วส่วน 30 นาทีหลังมันเป็นคนถามคำถาม แล้วเขาตอบ ซึ่งผมจะไม่นำมารวมในนี้ละกันครับ มาเริ่มกันเลยครับ

  • Best Practice คือเทคนิคสุดยอดที่ยังถูกยอมรับและใช้
  • Pattern คือทางเลือกที่ดีที่สุดที่ถูกใช้แล้วใช้อีก ซึ่งช่วยในการสื่อสารระหว่างกันดีขึ้น
  • Pattern ช่วยให้คุณเขียนโค๊ดที่คนอื่นเข้าใจได้

โดยเริ่มแรกเข้าจะพูด Unfactoring from Pattern (ซึ่งเป็นสิ่งที่ไม่ควรกระทำแต่ในวีดีโอพูดว่าควรทำเพราะมัน Save Your Job) อันนี้ผมสรุปอันหลังที่เขาพูดเลยละกันครับ โดยเขาพูดถึง Best Practice ของ Ruby ดังนี้ครับ

  • DRY – Don’t Repeat Yourself (อย่าทำงานซ้ำ)
  • Local Consequences (จำกัดผลลัพธ์ ซึ่งจะช่วยให้คุณคุมงานง่ายขึ้น)
  • Optimize for Understanding (ทำให้เหมาะสมกับความเข้าใจ)
  • Accurate Domain Model (ทำต้นแบบความคิดอย่างระมัดระวัง)
  • Intention Reveling Name (เปิดเผยชื่อแบบตรงๆ)
  • Composed Method (การประพันธ์ Method)

โดยเจ้า Rein Henrichs นั้นพูดมาว่า “การทำให้งาน ตามเวลา,ต่ำกว่าทุน,ไม่มี bug เราเลือกได้แค่ 2 อย่างโดยต้องคำนึงถึงความเสี่ยง , ความสามารถในการผลิต , ความสามารถในการดูแลรักษา และการเขียน Code คือความเสี่ยง และความเสี่ยงไม่เป็นมิตรกับความสามารถในการผลิต และระบบจากรุ่นก่อนต้องการ การดูแลรักษา โค๊ดของคุณจะกลายเป็นโค๊ดรุ่นก่อนทันทีที่ถูกเขียน” ดังนั้นจุดแข็งที่ Ruby ต้องการคือ

  1. Ruby ต้องการทำให้ Code ดูแลได้ง่ายขึ้น แต่ไม่ได้เขียนเพื่อให้ระบบเร็วขึ้น
  2. Ruby ต้องการให้เขียน Code สำหรับมนุษย์อ่าน
  3. Ruby Code จะต้องบอกผู้อ่านถึงจุดประสงค์ของมัน

โดยเจ้า Best Practice Pattern ที่พูดมานั้นช่วยให้้เราเขียน code ที่คนอื่นเข้าใจได้ เพราะคุณต้องคิดมากขึ้นในการสร้างมัน จากบรรทัดไปอีกบรรทัด จาก method ไป method โดยสรุปมันทำให้โค๊ดคุณเร็วขึ้น ความเสี่ยงน้อยลง และดูแลง่ายขึ้น

Composed Method

การประพันธ์ Method ชื่อมันตามนี้จริงๆผมชอบ Concept มากโดยเขาถือว่า แต่ละ Method จะมี 2 แบบคือ Simple Method กับ Complex Method โดยแต่ละ Method จะต้องทำงาน Task ง่ายๆ 1 Task และชื่อของ Method จะต้องมีชื่อที่เข้าใจง่าย แล้ว Complex Method จะประกอบด้วย Simple Method หลายๆอันมารวมกัน โดยเจ้า Rein Henrichs เนี้ยเขาชอบเขียน 1 Method เพียง 4-5 บรรทัดเท่านั้น แล้วค่อยนำ Method มาต่อกันเป็นชั้นๆขึ้นไป

แนวทางการศึกาษาการใช้ Pattern ในการแก้ปัญหาต้องทำดังนี้

  1. Context เป็นสิ่งสำคัญมาก แต่ละ Pattern แก้ส่วนเล็กๆของปัญหา โดยการเขียน code ที่ดี โดยถ้าเราสามารถจำแนกได้ว่า pattern ไหนเหมาะกับอะไร จะแก้ปัญหาได้อย่างถูกต้อง
  2. เราต้องรู้ความต้องการของเราก่อน เพื่อที่จะเลือก Paradigm และ Pattern เพื่อทำสิ่งนั้น เช่น ทำเพื่อ Perfomance หรือ Maintainability พยายามรู้ให้ได้ว่าเราต้องการเน้นในเรื่องอะไรมีเรื่องอะไร
  3. ดู Examples ต่างๆที่อยู่ใน Ruby Libraries ที่คุณใช้ เพราะเขาเขียนไว้ดีอยู่แล้ว ต้องถามว่าทำไมเขาทำแบบนี้ ทำไมตรงนี้เขาทำด้วยวิธีอื่น แล้วเราก็หัดใช้และ apply
  4. Try Them ลองทำ แล้วเขียนด้วย Pattern ที่คุณรู้ ลองทำแล้วคิดดูกลับไปว่า ต้องทำยังไงมีวิธีอื่นที่ดีกว่านี้ไหม

นี้คือสิ่งที่ผมสรุปย่อๆมาให้ครับจริงๆแล้วคนนี้ยังพูดถึง คำถามและคำตอบที่เ้จ้า Ruby สามารถแก้ปัญหาได้ โดยวิธีง่ายแสนง่าย ตัวอย่างคำถามคือ How do i ensure that two actions happen together ? , How can I send Multiple Messages to the same object? วันนี้ผมลาไปก่อนแล้วครับ สวัสดีครับ