
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(บทความที่เพิ่งสร้างใหม่)
ไม่มีความคิดเห็น:
แสดงความคิดเห็น