การใช้ 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
เนื้อหาคล้ายกันที่น่าสนใจ


