ค้นหาบล็อกนี้

วันเสาร์ที่ 15 พฤษภาคม พ.ศ. 2553

Rails practice I:: ลองเขียน blog โง่ๆ อันนึง

ได้ลอง สร้าง blog กากๆ จาก rails อยาก บอกว่าลักไก่มากๆ เนื่องจากเพิ่งเริ่มทำเป็นอันเแรก มาเริ่มกันเลยดีกว่าิเริ่มจากสิ่งที่จะทำคือ สร้าง blog ขึ้นมา อันนึงให้สร้าง account ของ คนเขียน บทความคือ author โดยคนเขียน หนึ่งคนสามารถสร้าง article ได้หลายarticle ...ดังนั้น ความสัีมพันธ์ระหว่าง author กับ article จึงเป็น แบบ one to many (author has many articles and article belongs_to author)
1. rails -d mysql myblog
2.cd myblog
3.สร้าง database myblog_development ใน mysql //ใช้ภาษาำไทย ไม่ได้เป็นไรไม่รุ ไว้ก่อนแล้วกัน
4.ruby script/generate scaffold author name:string surname:string
5.ruby script/generate scaffold article title:string content:text author_id:integer
6.rake db:migrate
7.ไปที่ models (/app/models)
ใน article.rb
class Article
belong_to:author
ใน author.rb
class Author
has_many :articles
8.ไปที่ routes.rb (/config/routes.rb) ให้เพิ่มดังนี้
map.resources :articles
map.resources :authors ,:has_many=>:articles//เพื่อสร้างsub route

เนื่องจากจะช่วยมากเลยในการเขียนเชื่อมระหว่างauthorกับ articleด้วยhelper tag path
เช่น author_articles_path,:method=>:post//จะลิงค์ไปยัง:action=>:createของ:controller=>:articlesแล้วที่สำคัญสามารถส่งauthor_idผ่านrequestได้อีกด้วยเจ๋งโคตร
ทำให้ได้routeไปarticles/id

จากนั้น ดู routes ทั้งหมด
rake routes >temp.txt //เพื่อจะได้ ใช้ helper tag เพื่อลิงค์ไปยัง :action ,:controllerได้อย่างถูกต้อง
9. ทดสอบความถูกต้อง ruby script/server
http://localhost/articles
http://localhost/authors

10.เนื่องจากเราต้องการให้มีการสร้าง author ก่อน แล้วจึงให้มีการเขียน blog ได้ ให้เราแก้ไขดังนี้

- ไปที่ show.html.erb (/app/views/authors/show.html.erb)ให้เพิ่ม link "write blog" ไว้โดยเราจะส่ง id ไปยัง action "new" ใน articles controller
<%=link_to 'Write Blog',new_author_article_path(@author_id),:method=>:get %>
// new_author_article GET /authors/:author_id/articles/new {:controller=>"articles", :action=>"new"} ดูจาก temp.txt

-ไปที่ articles_controller .rbให้เพิ่ม @author=Author.find(params[:author_id])และ@article=Article.new ใน action new เพื่อ รับ :author_id จากการ link ใน show.html.erb

-ไปที่ new.html.erb เราจะส่งค่าของtitle,contentของinstanceของArticleไปยังaction"create"ผ่านrequest keyที่ชื่อ":article"โดยใช้
form_for ดังนี้

<%form_for :article,@article,:url=>author_articles_path do |f|%>
<%=f.text_field :title%>
<%=f.text_area :content%>
<%=f.submit "create"%>
<%end%>
ด้วยการroutingแบบส่งidไปตามrequestด้วย หากต้องการเพิ่ม article เราจำเป็นต้องเข้าไปยังauthorก่อน เราำไม่อาจเข้าไปยังarticleแล้วเพิ่มarticleได้โดยตรง
คำอธิบาย
เนื่องจากform_forเป็นการส่งข้อมูลผ่านทางrequestเำพื่อเป็นการสร้างinstanceของclassในรูปแบบของformกรอกข้อมูลจากตัวอย่างอธิบายได้คือเราจะสร้างformกรอกข้อมูลให้กับบทความที่จะสร้าง
โดยที่

:articleคือparams[key]คือhashนั่นเองที่เราจะส่งผ่านrequestดังนั้นค่าของ
params[:article]={:title=>".......",:content=>"........."}

@articleเป็นinstanceของclassArticleในmodelโดยที่เราจะต้องสร้า่งinstanceในcontroller articles action"new"ก่อน@article=Article.new

:url=>author_articles_pathเป็นhelper tagในการrouteไปตามpathที่ได้ทำการmap.resourceดูได้จากrake routes>tmp.txt ในที่นี้จะส่งไปยัง createเพื่อสร้างบทความเนื่องจากinstanceยังไม่มีค่าแต่ถ้ามีค่าจะเป็นการupdate

f.text_fieldเป็นการสร้างtext filedในการรับค่าจากuserเพื่อส่งไปยังproperty":title"
ดังนั้นหลังmethods"tex_field" จึงต้องเป็น property ของ instance@articleเท่านั้น

โดยform_forทั้งหมดส่งไปตามurlที่ระบุไปที่actionหรือcontrollerโดยจะส่ง:author_idผ่านrequestไปด้วย
ดังนั้น:actionปลายทางจะรับauthor_idดังกล่าวแล้วเราสามารถนำไปใช้ต่อได้
เ่ช่น @article=Atricle.new(params[:article])
@author=Author.find_by_id(params[:author_id])
@author.articles<<@article //เท่ากับบอกว่าauthorมีarticle@article(บทความที่เพิ่งสร้างใหม่)


ไม่มีความคิดเห็น:

แสดงความคิดเห็น