MVC

Rails нь MVC framework буюу тогтолцоо юм. Rails нь browser - ѳѳс ирэх хүсэлтүүдийг хүлээн авч controller-т ирсэн хүсэлтүүдийг декод (тайлж унших) хийх бѳгѳѳд уг болж байгаа процессыг action method гэж нэрлэдэг.

Rails - аас авах нэг сайн тал гэвэл дотоод холболтууд нь цэгцтэй, дэс дараалалтай ер нь хамгийн сайн бүтэцтэй. “Hello World” - энгийн апплкейшн бичихийн тулд Controller, View шинээр үүсгэж кодлоно. Мэдээж энэ хоёрыг холбож ѳгсѳн холбоос, зам (route) хэрэгтэй. Нэг зүйл дутаагаад байна уу даа, гэж бодож байж магадгүй. Model - ыг яагаад бичихгүй юм бэ гэж гайхаж байгаа байх, хариулт нь, бидний одоо бичиж энэхүү апплкейшн нь ямар нэг байдлаар Data ч юм уу ѳгѳгдлийн сантай холбогдохгүй болохоор Model-ыг шууд алгасая. Эхлээд Controller - оос эхэлцгээе. Шинээр апплейкшн үүсгэж байсан райлс командыг ашиглан одоогийн бяцхан тѳсѳл дотроо controller үүсгэх юм. rails generate - гэх энэ райлс командыг ашиглах ба цаашид бид rails g гэж товчилж бичиж явна шүү. Controller үүсгэж байгаа rails g - араас script бичиж ѳгѳх байгаа. За, “Say” гэсэн controller үүсгэцгээе.

demo> rails g controller Say hello goodbye
create app/controllers/say_controller.rb
 route  get "say/goodbye"
 route  get "say/hello"
invoke  erb
create    app/views/say
create    app/views/say/hello.html.erb
create    app/views/say/goodbye.html.erb
invoke  test_unit
create    test/controllers/say_controller_test.rb
invoke  helper
create    app/helpers/say_helper.rb
invoke    test_unit
create      test/helpers/say_helper_test.rb
invoke  assets
invoke    coffee
create      app/assets/javascripts/say.js.coffee
invoke    scss
create      app/assets/stylesheets/say.css.scss

За terminal доошоогоо бас л баахан шинэ файл, directories үүсчихлээ дээ. Удахгүй эдгээр файлууд нь ямар учиртай болохыг зах зухаас нь онгичож үзэцгээнэ. Ямартай ч эхлээд чухлаас нь:

class SayController < ApplicationController
  def hello
  end

  def goodbye
  end
end

Хоосон, ил хул, код байхгүй юм шиг санагдаж байна уу? Нѳгѳѳ гоё удамшил ороод ирсэн байгаа юм л даа. Энгийнээр бол SayController гэсэн class нь ApplicationController - оос удамшчихлаа гэж. Нэг ёсондоо автомотоор бүхий л default утгуудыг нь ѳѳртѳѳ авчихлаа гэсэн үг л дээ. Тэхээр дээр байгаа код юу хийж болох, эсвэл яг одоогоор ямар үүрэг гүйцэтгэж байна гэж хэдүүлээ ѳѳрсѳддѳѳ асуулт тавиад үзэцгээе. Одоогоор бол дээрх код юу ч хийхгүй, ямар ч үүрэггүй байгаа л гэсэн үг. Маш энгийн, бидэнд hello() бас goodbye() гэсэн хоёр хоосон (empty) action method - ууд л байна. Яагаад бас hello(), goodbye() гэсэн method гараад ирэв ээ, гэж гайхаж байгаа байх. Энэ хэсгийг ойлгохын тулд ѳѳр нэг хэсэг үрүү ѳндийж харахгүй бол болохгүй нь дээ. Rails Handles requests буюу ирж байгаа хүсэлтүүдийг зохицуулагч.

Rails болон Request URLs

Яг л бусад веб апплкейшнуудын адил, Rails application - ын URL хаягийг хэрэглэгчтэй холбож ѳгч байгаа холболт юм. Тухайн URL - руу хандах хүсэлт browser - ээс явуулахад ар талд нь мэдээж тухайн хүсэлтийг боловсруулан (апп кодууд), эргүүлэн хэрэглэгч рүү хүргэх юм. Туршаад үзье. http://localhost:3000/say/hello - энэ хаяг руу хандалт хийгээд үзэцгээе.

Action

Дараагийн алхам маань дэлгэцэнд юу харуулах вэ гэх асуулт. Энэ хэсгээс л View орж ирж байгаа юм даа. Controller - шинээр үүсгэж байхдаа бид бүхэн ямар script ашиглаж байсныг санаж байна уу? Санахгүй байгаа бол эргүүлэн нэг хараарай. Тэр командаар терминал доошоо олон файл, directory үүссэн байхаа. Тэр дунд template файл буюу controller-ын views - үүссэн байгаа.. Үүннээс үзэхэд бид Say нэртэй controller үүсгэсэн. Тэгэхээр views маань app/view/say - directory-д байгаа юм.

<h1>Hello from Rails!</h1>

hello.html.erb - файлаа хадаглаад, browser - оо refresh хийгээд үзээрэй. Одоо ойлгосон байх, тийм үү.

Дүгнээд нэг харахад, бид Rails Application Tree - гээс хоёр файлын утга, арга, үүрэг зэргийг судлаад эзэмшчихлээ. Controller гэж юу болох талаар мэдэж авлаа, browser дээр template - modify хийж үзлээ. За тэгээд, Rails-ын шатлалыг харвал: controller нь app/controller дотор, views нь app/views гэсэн subdirectories дотор байрлаж байна.

Dynamic

Апп гэж хэлэхэд хэцүү нэг энгийн static page ямартай ч хийчихлээ. Бага зэрэг Dynamic болговол ямарав, орох болгонд хэдэн цаг болж байгааг харуулдаг хэсэг нэмж ѳгцгѳѳе. Нэмэхийн тулд views-д байгаа template файлыг ѳѳрчлѳх хэрэгтэй. Цаг (Time) - харуулах string хэрэг болох юм. Үүнээс улбаалаад хоёр асуулт үүснэ. Нэгт, хэрхэн яаж Dynamic Content - оо одоо байгаа template - дээ нэмэх вэ? Хоёрт, цагаа хаанаа авах юм бэ?

Dynamic Content

Райлс дотор Dynamic загвар оруулах олон арга бий. Хамгийн ѳргѳн ашигладдаг нь за одоо заагаад ѳгье. Ruby кодыг Template - тэйгээ embed (зарим энэ мэт үгийг орчуулахгүйгээр шууд хэрэглээд явна, угаасаа ч орчуулдахааргүй үг) хийх юм. Тиймээс л бид template файлаа show.html.erb гэж хадагалсан юм. Html.erb гэсэн формат залгаж бичсэн шалтгаан нь ERB гэсэн системыг Rails ѳрѳгжүүлэн дэмжээд явна. ERB нь Ruby - ын нэгэн хэсэг болж суудаг ба суулгах энэ тэрээ зүйл дээр санаа зовоод байх хэрэггүй. Erb нь output - үүдыг хувирган юу ч хамаагүй болгож болдог. Энгийнээр бол <%= and %> - гэх код нь Рубю кодоор танигдах хэдий ч үр дүнд нь string болон хѳрвүүлэгдэж байгаад л онцлог юм. Тэхээр <% … %> уг кодын дотор л утга аа оруулаад ѳгѳхѳд л үр дүн нь хэвлэгдэх юм. Жишээ нь:

<h1>Hello from Rails!</h1>
<p>
	Одоо цаг <%= Time.now %> болж байна.
</p>

Одоо browser - оо refresh хийгээд үз. Харагдаж байгаа цаг бол Ruby - ын standard format - аар харагдаж байгаа.

Цаг нэмэх

Ерѳнхийдѳѳ applcation - оо Dynamic болгох ганц хоёр алхамтай танилцлаа.. Дараагийн алхам бол одоо харагдаж байгаа цаг нь хаанаас дамжин харагдаж байгааг тогтоон address хийж ѳгѳх юм.

Ruby-гын Time.now() method нь embed хийж hello.html.erb загварт дуудан ѳгч ажиллаж байна. Хэрэглэгч, хандагч, уг page руу хандах бүр хэдэн цаг болж байгааг яг таг харуулж байна. Жижиг хэмжээний ѳѳрчлѳлт оруулж үзэцгээе. Одоо харагдаж байгаа view хэсгийг энэ чигт нь үлдээж controller хэсэгт цагийг байрлуулах шаардлагатай гэж үзээд Controller хэсэгт action method - ыг @time гэсэн хувьсагчид орлуулна. 

class SayController < ApplicationController
  def hello
	@time = Time.now
  end

  def goodbye
  end
end

.html.erb - загвар дотор, controller хэсэгт оруулж ѳгсѳн хувьсагчаа орлуулж бичнэ.

<h1>Hello from Rails!</h1>
<p> 
  It is now <%= @time %>
</p> 

Browser - ѳѳ refresh хийгээд харвал controller дээр нэмсэн хувьсагч маань views хэсэгт буюу энэ хоёрын хооронд утга дамжин амжилттайгаар дэлгэцэд хэвлэн харуулж байна. 

Яагаад заавал controller - оос харуулж байгаа зүйлийг views - дээр зарлан, хоёр гурван юм нэмж хийж, ажил удаад байгаа юм гэж гайхаж магадгүй. Уг Application - дотор бол ингэж хийсэн хийгээгүй нээх ѳѳрчлѳлт гарахгүй. Гэхдээ логикоор харвал ингэж хийх нь бидэнд ашигтай юм. Жишээ нь:  Application - оо цаашид хѳгжүүлж олон орны хэрэглэгч хандалт хийх боломжтой болгоё гэж тѳсѳѳлье. Үүн дээр үндэслэхэд, тухайн орны цагын бүсээс хамааран дэлгэцэнд хэдэн цаг болж байгааг харуулах нь чухал. Ингэж харуулахад хангалттай хэмжээний код нэмж бичих хэрэг болно. Харин энэ их хэмжээний код нь views - д тийм тохиромжтой шийдэл болж чадахгүй л болох уу! Харин controller - т цагийг харуулахаар шийдэж ѳгснѳѳр уг application - ыг илүү уян хатан боглож ѳгч байгаа ба controller хэсгээс ѳѳрчлѳсѳн цагын бүс нь views хэсэгт мѳн time object - ыг update хийгээд байх шаардлага байхгүй гэсэн үг юм. Цагыг Data гэж үз, тэгвэл заавал view болон controller - тэй холбогдсон байх шаардлагтай. Цаашид Model гэж судлаад ирэхээр бид энэ тухай илүү ихийг сурах болно.

Дүгнээд нэг харвал

  • Хэрэглэгч уг application-нд хандалтыг local-оос http://localhost:3000/say/hello - URL хаягаар хандан орсон..
  • Rails - routes - ыг тааруулж ѳгсѳн. 2 хэсэгт хуваан авч үзвэл, say хэсэг нь controller хэсгийг авч, ингэснээр Rails нь шинээр Ruby-гын SayController хэсгийг дуурайлган буюу удамшуулан үүсгэх боломжтой болсон. (app/controllers/say_controller.rb - гэх дарааллаар олж болно)
  • Дараагийн хэсэгт нь hello - ыг action - гэдгийг тодорхойлсон. Rails нь тухайн нэрийн дагуу controller - оос method - ыг дуудсан. Энэхүү action method нь time object - ыг үүсгэж, @time гэсэн хувьсагч болгосон.
  • Rails нь загвар ашиглан үр дүнг дэлгэцэд хэвлэдэг болсон. App/view directory -> subdirectory нь controller-ын (say) - тэй адил нэрээр, тэрхүү subdirectory дотор hello.html.erb.
  • Rails нь уг файлыг ERB templating system - руу боловсруулан, controller хэсэгт утгыг (value) заан Ruby - д оруулж (embed) ѳгсѳн.
  • Үр дүнг browser дээрээс харахад, Rails хүсэлтүүдийг боловсруулан, ажиллаж байсан.

Pages - үүдыг холбох

Нэг хуудастай Web Application гэж ч бас хаана байхав. Энэ удаа бид applicaiton - доо энгийн веб загвар хийж үзэцгээе.

2 action - доо нэг controller ашиглана. Яагаад гэвэл бидэнд одоо шинээр controller - үүсгээд байх шаардлага гараагүй болохоор.

Goodbye action - г controller - т define хийгээд ѳгчихсѳн болохоор одоо app/views/say дотор шинэ template үүсгэж ѳгѳх юм. Goodbye.html.erb гэж байгаа учир нь action нь default template загвар авах үедээ action - ын нэртэй холбогдож байдаг болохоор гэж ойлгож болно. 

<h1>Goodbye!</h1>
<p> 
	Энд байх сайхан байна.
</p> 

Browser - рүүгээ ороод энэ удаа URL хаягаа ѳѳрчлѳѳд хандалт хийнэ. http://localhost:3000/say/goodbye

Харин одоо хоёр page - ээ хооронд нь холболт хийх хэрэгтэй. Hello page - ыг Goodbye page - тэй холбоно. Цаашид application хийхдээ хоорондын холболтыг button ашиглаж хийнэ, энэ удаа зүгээр hyperlink - ашиглаад хийчихье.

hello.html.erb - иймэрхүү байдлаар:

<p>

	Say <a href="/say/goodbye">Goodbye</a>! 
</p> 

Харин goodbye.html.erb:

<p>

	Say <a href="/say/hello">Hello</a>! 
</p> 

Дээрx аргаар бичиж болно, асуудалгүй ажиллана. Нѳгѳѳ талаас жаахан эмзэг л болох юм даа. Уг Application - ынхаа web server - ыг ѳѳрчлѳѳд үзьѳ гэж бодоход URL - ууд шууд танихаа болино.  Тийм болохоор, бид иймэрхүү эрсдэл хүлээх хэрэг байхгүй. Rails цаанаасаа маш олон helper, methods байдаг болохоор ур аргуудыг views, template - д ашиглаж болно. Жишээл нь: link_to() - энэ method нь action - нд hyperlink үүсгэж ѳгдѳг жишээтэй. Басаж болохгүй, энэ method - ын хийж чадах зүйл их шүү.  hello.html.erb - дээ link_to() - ашиглаад үзье:

<h1>Hello from Rails!</h1>
<p>
	It is now <%= @time %>
</p>
<p>
	Time to say
	<%= link_to "Goodbye", say_goodbye_path %>!
</p>

Түр зогсоод энэ мѳрийг сайн харьцгаая:

<%= link_to "Goodbye", say_goodbye_path %>

Link_to - оор дуудах үйлдэл хийгдэж байна. (Rails-д method-ыг templates, helpers- ыг бичихид илүү хялбар болгож ѳгсѳн) say_goodbye_path нь зам гээд ойлгоход болно доо.

Goodbye.html.erb - мѳн адил аргаар:

<h1>Goodbye!</h1>
<p>
	It was nice having you here.
</p>
<p>
	Say <%= link_to "Hello", say_hello_path %> again.
</p>

За энэ хүрээд энгийн туршилтын application маань дуусаж байна. Дараагийн хичээлээр бид жинхэнэ application хийхэд суралцах болно. 

Юу хийсэн бэ?

  • Rails application хэрхэн шинээр үүсгэх, үүсгэсэн application - доо controller шинээр үүсгэж сурлаа.
  • Хэрхэн Dynamic контентыг controller дээр үүсгэх, үүсгэсэн контентоо view - ыг ашиглан харуулахад суралцсан.
  • Хэрхэн page хооронд холбох талаар үзлээ.