በዚህ ምዕራፍ ውስጥ፣ በቀሪው በዚህ ስልጠና በሙሉ፣ እንደ ምሳሌነት የሚያገለግለንን፣ ሞያዊ ደረጃ ያለው የማሳያ አፕልኬሽንን በማበልጸግ እንጀምራለን፡፡ ምንም እንኳን የማሳያ አፕልኬሽኑ በመጨረሻ የተጠቃሚዎች፣ የአጪርጽሑፎች እና አንድ የተሟላ የመግቢያ እና የማረጋገጫ መዋቅር ቢኖረውም፣ እኛ ግን አንድ ቀለል ባለ ርዕስ እንጀምራለን፤ የምንጀምረውም በቛሚ ገጾች አፈጣጠር ይሆናል። ይህም ለጨቅላው አፕልኬሽናችን አንድ ጥሩ ጅማሬ ይሆናል። ምንም እንኳ ቛሚ ገጾችን መፍጠሩ ቀላል ቢመስልም፣ እነሱን መስራቱ ግን እጅግ አስተማሪ የሆነ መልመጃ ይሆናል።
ሬይልስ በመሰረቱ የተነደፈው፣ በውሂበጎታ-የተደገፉ የሚቀያየሩ ድረ-ጣባዎችን ለመስራት ቢሆንም፤ በጥሬ የሃ.ጽ.መ.ቋ ፋይሎች፣ መፍጠር የምንችለውን ቛሚ ገጾች በመስራትም ትልቅ ሚና ይጫወታል። በእርግጥም፣ ሬይልስን ለቛሚ ገጾች መጠቀም፣ አንድ የተለየ ጥቅምን ያስገኛል፡- ይህም ጥቂት መቀያየር የሚችሉ ይዞታዎችን፣ በቀላሉ መጨመር ማስቻሉ ነው። በዚህ ምዕራፍ ይህን እንዴት ማድረግ እንደምንችል እንማራለን። በጉዟችንም፣ የመጀመርያችንን ራስ ፈትኔ የተባለውን ፈታና እንቋደሳለን፣ ይህም የኛ ኮድ ትክክል እንደሆነ፣ የበለጠ እርግጠኞች እንድንሆን ይረዳናል። ከዚህም በላይ፣ አንድ ጥሩ የፈተና ስብስብ መኖሩ፣ የኮዳችን ሥልትን ሳይቀይር ቅርጸቱን ብቻ እንደሚለውጠው በመተማመን ኮዱን እንድናጣራ ያስችለናል።
ልክ እንደ ምዕራፍ 2 ስራ ከመጀመራችን በፊት አንድ አዲስ የሬይልስ ፕሮጀክትን መፍጠር ይኖርብናል። በዚህ ጊዜም ማሳያ (masaya
) በመባል ይታወቃል። ይህም በዝርዝር 3.1 ውስጥ ይታያል። 1
$ cd ~/አካባቢ
$ rails _6.1.4.1_ new masaya
$ cd masaya/
(የደመና ቅ.ማ.አ ተጠቃሚዎች ይህንን ፕሮጀክት፣ ከዚህ በፊት ለነበሩት ለሁለቱ ምዕራፎች አፕልኬሽኖች መፍጠሪያ የተጠቀሙበትን አካባቢ መጠቀም ይችላሉ። አዲስ አካባቢ መፍጠር አስፈላጊ አይደለም። (ክፍል 2.1))
ማሳሰቢያ:- ሁኔታወችን የበለጠ ምቹ ለማድረግ፣ የማሳያ አፕልኬሽኑ የትግበራ ማጣቀሻ በጊትሃብ2 ላይ ይገኛል፣ ለእያንዳንዱ የስልጠናው ምዕራፍም የየራሱ ቅርንጫፍ ተሰቶታል፡፡
ልክ እንደ ክፍል 2.1 ቀጣዩ ሂደታችን በአፕልኬሽናችን በሚፈለጉ እንቁወች የ‘እንቁፋይል‘ን (Gemfile
) ለማዘመን አንድ የጽሑፍ አርታኢን መጠቀም ነው፡፡ በ‘ፈተና (test
) ስብስብ ውስጥ ካሉት በስተቀር፣ ዝርዝር 3.2 ከዝርዝር 1.9 እና ከዝርዝር 2.1 ጋር ፍጹም አንድ ዓይነት ነው። እነዚህ የፈተና ስብስቦች፣ ለላቀ የመፈተኛ ውቅረት እንደ አማራጪ የሚፈለጉ ናቸው (ክፍል 3.6)። ማሳሰቢያ:- በዚህ ጊዜ፣ ለማሳያ አፕልኬሽኑ የሚያስፈለጉትን ሁሉንም እንቁወች መጫን ከፈለጋችሁ፣ በዝርዝር 13.76 ውስጥ ያለውን ኮድ መጠቀም ይኖርባችኋል።
ጠቃሚ ማሳሰቢያ፡- በዚህ መጽሐፍ ውስጥ ላሉት እንቁዎች ሁሉ፣ ከዚህ በታች ከተዘረዘሩት እንቁዎች ይልቅ፣ በ gemfiles-6th-ed.railstutorial.org ላይ የተዘረዘሩትን እንቁዎች መጠቀም ይኖርባችኋል (ምንም እንኳን ተመሳሳይ እንቁዎች ቢመስሉም)፡፡
Gemfile
)።
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
gem 'rails', '6.1.4.1'
gem 'puma', '5.3.1'
gem 'sass-rails', '6.0.0'
gem 'webpacker', '5.4.0'
gem 'turbolinks', '5.2.1'
gem 'jbuilder', '2.10.0'
gem 'bootsnap', '1.7.2', require: false
group :development, :test do
gem 'sqlite3', '1.4.2'
gem 'byebug', '11.1.3', platforms: [:mri, :mingw, :x64_mingw]
end
group :development do
gem 'web-console', '4.1.0'
gem 'listen', '3.4.1'
gem 'spring', '2.1.1'
gem 'spring-watcher-listen', '2.0.1'
end
group :test do
gem 'capybara', '3.35.3'
gem 'selenium-webdriver', '3.142.7'
gem 'webdrivers', '4.6.0'
gem 'rails-controller-testing', '1.0.5'
gem 'minitest', '5.11.3'
gem 'minitest-reporters', '1.3.8'
gem 'guard', '2.16.2'
gem 'guard-minitest', '2.4.6'
end
group :production do
gem 'pg', '1.2.3'
end
# ዊንዶውስ የዞን መረጃ ፋይሎችን አያካትትም፤ ስለሆነም፣ በአንድ የቤተኛ የዊንዶውስ ስርዓት
# ላይ፣ ሬይንስን የምታካሂዱ ከሆነ፣ የሚከተለው እንቁ ላይ ያለውን የአስተያየት ምልክት ማስወገድ
# ይኖርባችኋል:-
# gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
ልክ እንደበፊቶቹ ሁለት ምዕራፎች፣ የምርት እንቁወች መጫንን ለማስወገድ፣ ጠቅል ሰፈርን ያለ ‘ምርት’ በ‘ማዘጋጀት አዋቅር‘ን (bundle config set –local without 'production'
) በመጠቀም እና በ‘እንቁፋይል (Gemfile
) ውስጥ በግልጽ የተዘረዘሩትን እንቁወች ለማካተት እና ለመጫን ጠቅል ጫን‘ን (bundle install
) እናስኬዳለን:-3
$ bundle _2.2.17_ config set --local without 'production'
$ bundle _2.2.17_ install
ይህም የ‘ፖስትግሬስተ.መ.ቋ (PostgreSQL) የ‘ፒጅ (pg)
እንቁን በማበልጸጊያ ላይ እንዳይጫን እና አፕልኬሽኑ ለማበልጸጊያ እና ለፈተና የቀ.መ.ቋ ውሂብ ጎታን እንዲጠቀም ያዘጋጃል። ሃረኩ፣ በማበልጸግ እና በምርት ላይ የተለያዩ ውሂበጎታዎችን መጠቀምን አይመክርም፤ ይህ ማለት በሁለቱም አካባቢ ፖስትግሬስተ.መ.ቋን መጠቀም ይገባን ነበረ ማለት ነው፤ ነገር ግን ለማሳያ አፕልኬሽኑ ምንም ዓይነት ለውጥ አያመጣበትም፤ እናም ተ.መ.ቋን በሰፈር ላይ መጫኑ እና ማዋቀሩ ከፖስትግሬስተ.መ.ቋ በጣም የቀለለ ነው።4 በክፍል 1.2.1 ላይ እንደተገለጸው፣ ሬይልስን በአንድ ቤተኛ የዊንዶውስ ስርዓት የምታካሂዱ ከሆነ፣ በዝርዝር 3.2 መጨረሻ ላይ ያለውን የአስተያየት ምልክት ማስወገድ እንዳለባችሁ ልትገነዘቡ ይገባል፡፡
እንደ አጋጣሚ በ‘እንቁፋይል ( Gemfile
) ውስጥ ከተወሰኑት እንቁወች ውጪ፣ አንድ የተለየ ስሪት ያለው እንቁን (ሬይልስንም ጨምሮ) ጪናችሁ ከሆነ፣ ስሪቶቹ እንደተዛመዱ እርግጠኛ ለመሆን፣ እንቁወቹን በ‘ጠቅል አዘምን (bundle update
) ትእዛዝ ማዘመኑ አንድ ጥሩ ሃሳብ ነው፡-
$ bundle _2.2.17_ update
አሁን የቀረን ነገር ቢኖር የጊቲ ማከማቻን ማስጀመር ነው:-
$ git init
$ git add -A
$ git commit -m "ማከማቻ ማስጀመር"
ልክ እንደመጀመሪያው አፕልኬሽን፣ የ‘አንብበኝ (README
) ፋይል በደንብ የሚረዳ እና የሚገልጽ ይሆን ዘንድ ነባሪ ይዞታውን፣ በዝርዝር 3.3 ላይ የሚታየውን ማርክዳውን በመጠቀም፣ ይዞታውን እንድታዘምኑት እመክራችኋለሁ። የአንብቡኝ ፋይሉ የአፕልኬሽኑን ስራ ለመጀመር የሚያገለግሉ መመሪያዎችን ያካትታል፡፡5(በውነቱ እስከ ምዕራፍ 6 ድረስ የ‘ሬይልስ ውጎ:አፍልስ (rails db:migrate
) ትእዛዝን ማስኬድ አያስፈልገንም፣ አሁን እሱን አንብበኝ ፋይል ውስጥ ብናካትተው ግን ምንም ጉዳት አያመጣም፡፡)
ማሳሰቢያ:- ሁኔታወችን ምቹ ለማድረግ፣ የተሟላው የአፕልኬሽኑ ማጣቀሻ የአንብቡኝ ፋይል በዝርዝር 3.3 ውስጥ የለሉ ተጨማሪ የላቁ መረጃወችን ያካትታል።
README.md
# የሩቢ ኦንሬይልስ ስልጠና የማሳያ አፕልኬሽን
ይህ [በማይክል ሃርትል](https://www.michaelhartl.com/)ለተደረሰው [*የሩቢ ኦንሬይልስ
ስልጠና፤ ድር ማበልጸግን በሬይልስ ተማር*](https://www.railstutorial.org/)
(ስድስተኛ ስሪት) የቀረበ የማሳያ አፕልኬሽን ነው፡፡
## ፈቃድ
ሁሉም [የሩቢ ኦንሬይልስ ስልጠና](https://www.railstutorial.org/)
ውስጥ ያሉት የኮድ ምንጮች በ`ማ.ቴ.ተ ፈቃድ እና በ`ቢራጋብዘኝ ፈቃድ ጥምረት ስምምነት መሰረት፣
ሁሉንም የኮዶ ምንጮች ማግኘት ይቻላል። የበለጠ ለመረዳት [ይህንን](LICENSE.md) አገናኝ ጎብኙ፡፡
## ስራ መጀመር
የአፕልኬሽኑን ለማስጀመር፣ ማከማቻውን መሰል አድርጉ እና ከዚያ አስፈላጊዎቹን እንቁወች ጫኑ:-
```
$ gem install bundler -v 2.2.17
$ bundle _2.2.17_ config set --local without 'production'
$ bundle _2.2.17_ install
```
በመቀጠል፣ ውሂበጎታውን አፍልሱ:-
```
$ rails db:migrate
```
በመጨረሻ፣ ሁሉ ነገር በትክክል እየሰራ መሆኑን ለማረጋገጥ፣ የፈተና ስብስቡን አስኪዱ:-
```
$ rails test
```
የፈተና ስብስቡ ካለፈ፣ አፕልኬሽኑን በአንድ የሰፈር አገልጋይ ላይ ለማስኬድ ዝግጁዎች ናችሁ ማለት ነው:-
```
$ rails server
```
የበለጠ መረጃ ለማግኘት
[*የሩቢ ኦንሬይልስ ስልጠና* መጽሐፍን](https://www.railstutorial.org/book) ተመልከቱ፡፡
ከዚያ ለውጦቹን እንደሚከተለው አድርጋችሁ ቀላቅሉ:-
$ git commit -am "አንብበኝ ፋይልን ማሻሻል"
በክፍል 1.3.4 ላይ የተማርነውን የምስታውሱ ከሆነ፣ ለ “ሁሉ ለውጦች (all changes)” የ‘-ኤ (-a
) ባንዲራን እና ለመልእክት ደግሞ የ‘-ኤም (-m
) ባንዲራን ከዚህ:- git commit -a -m "Message"
የጊት ትእዛዝ ጋር ተጠቅመን ነበር። ከዚህ በላይ እንደምትመለከቱት ጊት ሁለተኛው ትእዛዝ ላይ፣ git commit -am "Message"
ብለን በመጠቀም ሁለቱን ባንዲራወች ወደ አንድ እንድንቀይራቸው ያስችለናል።
በክፍል 1.3.3 ውስጥ ያሉ ሂደቶች ጋር አንድ አይነት የሆኑ ሂደቶችን በመከተል፣ በጊትሃብ ላይ አንድ አዲስ ማከማቻን መፍጠር ይኖራችሁኋል (በምስል 3.1 ውስጥ እንደተመለከተው፣ ማከማቻውን የግል ማድረጋችሁን አትዘንጉ)፤ እና ከዚያ ወደ ሩቁ ማከማቻ ግፉት:-
$ git remote add origin https://github.com/<username>/masaya.git
$ git push -u origin main
የደመና ቅ.ማ.አን እየተጠቀማችሁ ከሆነ፣ አፕልኬሽኑ በሰፈር የድር አገልጋይ ላይ ይስተናገድ ዘንድ፣ እንደቀድሞዎቹ ሁለት ምዕራፎች ሁሉ የ‘ምርት.አርቢ (development.rb
) ፋይሉን በማረም አፕልኬሽኑን ማዘጋጀት ይኖርባችኋል (ዝርዝር 3.4)፡፡
config/environments/development.rb
Rails.application.configure do
.
.
.
# ከሰፈር አገልጋይ ጋር ግንኙነቶችን መፍቀድ።
config.hosts.clear
end
ማሳሰቢያ:- የክላውድ9 አካባቢዎች በቂ የዲስክ ቦታ እንደማይኖራቸው አንዳንድ ዘገባወች ደርሰውኛል። በቂ የዲስክ ቦታ እንደለለ የሚያመለክት አንድ የስህተት መልእክት ካገኛችሁ፣ በአካባቢያችሁ ላይ ተጨማሪ ቦታ ለማከል፣ በዝርዝር 1.5 ውስጥ የተመለከተውን ትእዛዝ እንድታስኬዱ ሀሳቤን አቀርባለሁ፡፡
በኋላ የሚመጣውን የአፕልኬሽን ውህደት አለመጣጣምን ለመከላከል ያህል፣ በዚህ ገና በሆነ ደረጃም ቢሆን፣ አፕልኬሽኑን ወደ ሃረኩ ማሰማራቱ አንድ ጥሩ ሃሳብ ነው። ልክ እንደ ምዕራፍ 1 እና ምዕራፍ 2 በዝርዝር 1.13 እና ዝርዝር 1.14 ውስጥ የ “ዓለም እንዴት ነሽ!” ሂደቶችን እንድትከተሉ አሳስባለሁ። (ለዚህ ዋነኛው ምክንያት፣ ነባሪው የሬይልስ ገጽ በተለምዶ በሃረኩ ላይ ስለሚሰበር ነው፤ ይህም አፕልኬሽኑን ማሰማራቱ የተሳካ እና ያልተሳካ መሆኑን ለማወቅ አዳጋች ያደርገዋል፡፡)
selamta
) ተግባርን ማከል። app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
def selamta
render html: "ዓለም እንዴት ነሽ!"
end
end
config/routes.rb
Rails.application.routes.draw do
root 'application#selamta'
end
ከዚያም ለውጦቹን በመቀላቀል ወደ ጊትሃብ እና ሃረኩ ግፉ፡-
$ git commit -am "ሰላምታን ማከል"
$ git push
$ heroku create
$ git push heroku main
ልክ እንደ ክፍል 1.4 አንዳንድ የማስጠንቀቂያ መልእክቶችን ልታዩ ትችላላችሁ፤ እነዚህንም ለአሁኑ ችላ ልትሏቸው ይገባል። በክፍል 7.5 ውስጥ እንቋቋማቸዋለን፡፡ ከሃረኩ አፕልኬሽን አድራሻ በስተቀር፣ ውጤቱ ከምስል 1.31 ጋር አንድ ዓይነት መሆን አለበት።
ከዚህ በኋላ ከዚህ መጽሐፍ ጋር ስልጠናውን በምትቀጥሉበት ጊዜ፣ አፕልኬሽኑን ዘወትር እንድትገፉ እና እንድታሰማሩት እመክራችኋለሁ፣ ይህም የርቀት መጠባበቂያዎችን በራስሰር ስለሚያደርግ፣ በተቻለ መጠን ማንኛውንም በምርት ላይ ሊከሰት የሚችል ስህተትን ከወዲሁ እንድትገቱ ያስችላችኋል። በሃረኩ ውስጥ ችግር ካጋጠማችሁ፣ ለችግሩ መፍትሔ ታገኙ ዘንድ፣ የምርት ዘጋቢዎች ፋይሉን እንደሚከተለው አድርጋችሁ መመርመራችሁን አረጋግጡ:-
$ heroku logs # ወቅታዊዎቹን ክስተቶች መመልከት
$ heroku logs --tail # ክስተቶቹ በሚከሰቱበት ጊዜ ማየት፤ ለማቆም ``ተቆር-ሲን (Ctrl-C)'' ተጠቀሙ
ማሳሰቢያ:- አንድ እውነተኛ አፕልኬሽንን ለማሰማራት፣ ሃረኩን ለመጠቀም ከወሰናችሁ፣ በክፍል 7.5 ውስጥ ለምርት ድርአገልጋይ መደረግ የሚገባውን መዋቅር መከተላችሁን አረጋግጡ።
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
ከክፍል 3.1 ሁሉ ዝግጅት መጠናቅቅ በኋላ፣ አሁን አፕልኬሽኑን የማበልጸግ ስራን ለመጀመር ዝግጁ ነን። በዚህ ክፍል ውስጥ ቛሚ ሃ.ጽ.መ.ቋን ብቻ የያዙ፣ አንድ የሬይልስ የተግባሮች እና የትይታወች ስብስብን በመፍጠር፣ ተለዋዋጪ ገጾችን ለመስራት ወደ መጀመሪያው ሂደት እናመራለን።6 የሬይልስ ተግባሮች በመቆጣጠሪያወች (Controllers) (“መ‘ው (C)” በክፍል 1.2.3 ውስጥ የተመላከተውን ማለት በ ቅ.ት.መ (MVC) ውስጥ ያለውን “መ‘ን (C)” ያመለክታል) ውስጥ በአንድነት ተጠቃለው ይመጣሉ፤ እነሱም በአንድ የጋራ ስራ የተዛመዱ የተግባሮች ስብስብን የያዙ ናቸው። በምዕራፍ 2 ውስጥ የተቆጣጣሪዎችን አሰራር በጥቂቱ አይተናል፤ እና አንዴ የው.ሁ.ማ መዋቅርን ከዳሰስን በኋላ፣ ጥልቅ የሆነ ርዴት ይኖረናል (ከምዕራፍ 6 ጀምሮ)፡፡ አካሄዳችንን ለማሳመር፣ የሬይልስ የማውጫ መዋቅርን ከክፍል 1.2 ላይ ማስታወስ አስፈላጊ ነው (ምስል 1.11)። ስለሆነም በዚህ ክፍል ውስጥ አብዛኛውን ጊዜ የምናሳልፈው፣ በ‘አፕ/መቆጣጠሪያዎች (app/controllers
) እና በ‘አፕ/ትይታዎች (app/views
) ማውጫወች ውስጥ ላይ በመስራት ይሆናል።
ጊትን በምንጠቀምበት ጊዜ፣ ዋና ቅርንጫፉ ላይ ከመስራት ይልቅ፣ አንድ የተለየ የርእስ ቅርንጫፍ ላይ መስራቱ ሊለመድ የሚገባው አንድ ጥሩ ባህሪ ነው፤ ይህንንም በክፍል 1.3.4 ውስጥ አስተውላችኋል፡፡ ለስሪት መቆጣጠሪያ ጊትን እየተጠቀማችሁ ከሆነ፣ ለቋሚ ገጾች አንድ የርእስ ቅርንጫፍን ለማውጣት የሚከተለውን ትእዛዝ ማስኬድ ይኖርባችኋል፡-
$ git checkout -b ቛሚ-ገጾች
በክፍል 2.3.5 ላይ በአጪሩ እንደተመለከተው፣ የስሪት ቁጥጥርን በምትጠቀሙበት ጊዜ በርካታ ማቀላቀሎችን ማድረጉ አንድ ጥሩ ሀሳብ እንደሆነ ነው፡፡ ገለጻው አሰልቺ እንዳይሆን ለማድረግ፣ ጽሑፉ ራሱ በእያንዳንዱ ምዕራፍ መጨረሻ ላይ አንድ ማቀላቀልን ብቻ ያካትታል፣ ጥሩው መመሪያ ግን በአብዛኛዎቹ ክፍሎች (ወይም በአብዛኛዎቹ ንዑስ-ክፍሎች) መጨረሻ ላይ ማቀላቀሎችን ማድረግ ይሆናል፡፡
የቛሚ ገጾች ስራን ለመጀመር፣ በመጀመሪያ በምዕራፍ 2 ላይ መወጣጫን ለማመንጨት የተጠቀምንበትን፣ የሬይልስ የ‘አመንጪ (generate
) ትእዛዝን በመጠቀም፣ አንድ መቆጣጠሪያን እናመነጫለን፡፡ ቛሚ ገጾችን ለማስተናገድ አንድ መቆጣጠሪያ ስለምንሰራ Quami Getss Controller ብለን እንጠራዋለን፤ ይህ ቋሚገጾችም (QuamiGetss
) ቅርጸ-ግመል (CamelCase) ተብሎ በሚጠራው የአጻጻፍ ዘዴ የተዘጋጀ ስም ነው (ለበለጠ መረጃ በምስል 3.3 ላይ የተሰጠውን ስእላዊ መግለጫ ተመልከቱ)። በተጨማሪም በንዑስ ፊደላት የተዘጋጁ፣ ሶስት ተግባሮችን አብረን እናካትታለን፣ እነሱም:- ለመነሻ ገጹ የ‘መነሻ (menesha
) ተግባር፣ ለእርዳታ ገጹ የ‘እርዳታ (erdata
) ተግባር እና ለስለኛ ገጹ ደግሞ የ‘ስለኛ (silegna
) ተግባር ይሆናሉ። የሬይልስ የ‘አመንጪ (generate
) ትእዛዝ፣ አንድ የተግባሮች ዝርዝር አማራጪን ይወስዳል፤ ስለዚህ የመነሻ ገጽን እና የእርዳታ ገጽ ተግባሮችን ለመስራት፣ እነሱን በማዘዥያ መስመሩ ላይ በቀጥታ እናካትት እና ስለኛ ገጽን ግን ሆን ብለን እንተወዋለን፤ ስለሆነም በክፍል 3.3 ላይ እሱን እንዴት አድርገን ማካተት እንደምንችል ለማየት ይረዳናል። የቋሚ ገጾች መቆጣጠሪያውን የሚያመነጨው ትእዛዝ፣ በዝርዝር 3.7 ላይ ተመልክቷል።
$ rails generate controller QuamiGetss menesha erdata
create app/controllers/quami_getss_controller.rb
route get 'quami_getss/menesha'
get 'quami_getss/erdata'
invoke erb
create app/views/quami_getss
create app/views/quami_getss/menesha.html.erb
create app/views/quami_getss/erdata.html.erb
invoke test_unit
create test/controllers/quami_getss_controller_test.rb
invoke helper
create app/helpers/quami_getss_helper.rb
invoke test_unit
invoke assets
invoke scss
create app/assets/stylesheets/quami_getss.scss
በነገራችን ላይ ሬይልስ አ (rails g
) የ‘ሬይልስ አመንጪ (rails generate
) አቋራጪ እንደሆነ ማወቁ አስፈላጊ ነው፤ ይህም በሬይልስ ከተደገፉት ብዙ አቋራጮች ውስጥ አንዱ ነው (ሰንጠረዥ 3.1)። ነገሮችን ግልጽ ለማድረግ፣ ይህ ስልጠና ሁልጊዜ ሙሉውን ትእዛዝ ይጠቀማል፤ ነገር ግን አብዛኞቹ የሬይልስ አበልጻጊወች በግላቸው በሚሰሩበት ጊዜ፣ በሰንጠረዥ 3.17 ውስጥ ከሚታዩት አቋራጮች መካከል አንዱን ወይም ከዚያ በላይ ይጠቀማሉ።
ሙሉ ትእዛዝ | አቋራጪ |
$ rails server |
$ rails s |
$ rails console |
$ rails c |
$ rails generate |
$ rails g |
$ rails test |
$ rails t |
$ bundle install |
$ bundle |
ከመቀጠላችን በፊት፣ ጊትን እየተጠቀማችሁ ከሆነ፣ የቋሚ ገጾች መቆጣጠሪያውን ወደ ሩቁ ማከማቻ ማከሉ አንድ ጥሩ ሃሳብ ነው፡-
$ git add -A
$ git commit -m "አንድ የቋሚ ገጾች መቆጣጠሪያ ማከል"
$ git push -u origin ቛሚ-ገጾች
የመጨረሻው ትእዛዝ የ‘ ቛሚ-ገጾች
ርዕስ ቅርንጫፍን ወደ ጊትሃብ ለመግፋት ያመቻቻል፡፡ ከዚያ በኋላ ለሚደረጉ ተከታታይ ግፊቶች ሌሎች ነጋሪአሴቶቻቸውን በመተው፣ ይህንን የመሰለ አጪር ትእዛዝ መጻፍ ይችላል፡-
$ git push
ከላይ ያሉት የማቀላቀል እና የመግፋት ቅደም ተከተሎች፣ በእለተለት የብልጸጋ ስራየ ላይ የምከተላቸውን ዓይነት ልማዳዊ የአሰራር ንድፍን ያሳያሉ፤ ነገር ግን ከአሁን በኋላ እንደዚህ ዓይነት ልማዳዊ እና የበለጸገ የማቀላቀል ስልት መጠቀሙን አቆመዋለሁ። (ይህን ስልጠና በምትከታተሉበት ጊዜ የሚመከረው በእያንዳንዱ ክፍል መጨረሻ ላይ፣ አንድ የጊት ማቀላቀልን እንዳታደርጉ ነው።)
በዝርዝር 3.7 ውስጥ የመቆጣጠሪያውን ስም አንድ የቅርጸ-ግመል የአጻጻፍ ስልትን በመጠቀም እንደጻፍን አስተውሉ (እንዲህ ተብሎ የተጠራበት ምክንያት፣ የአጻጻፍ ስልቱ የሞንጎልያ ግመል ሻኛን ስለሚመስል ነው።) ይህም ቅርጸ-እባብ (Snake Case) ተብሎ በሚጠራው የአጻጻፍ ስልት የተጻፈ አንድ የመቆጣጠሪያ ፋይል እንዲፈጠር ያደርጋል። ስለዚህ QuamiGetss የተባለ መቆጣጠሪያ አንድ ቋሚ_ገጾች_መቆጣጠሪያ.አርቢ (quami_getss_controller.rb
) የተባለ ፋይል እንዲፈጠር ያደርጋል ማለት ነው። ይህ አንድ የተለመደ አሰራር ስለሆነ ነው እንጅ፣ በእርግጥም በማዘዥያ መስመር ላይ ቅርጸ-እባብን እንዲህ አድርገን ብንጠቀምም አንድ ዓይነት ውጤትን ይሰጠናል (ምስል 3.3):-
$ rails generate controller quami_getss ...
ይህ ትእዛዝም አንድ ቋሚ_ገጾች_መቆጣጠሪያ.አርቢ (quami_getss_controller.rb
) የተባለ መቆጣጠሪያን ያመነጫል። ሩቢ የክፍል ስሞችን ለመሰየም ቅርጸ-ግመልን ስለሚጠቀም (ክፍል 4.4) የኔም ምርጫ እንደዛው ቅርጸ-ግመልን በመጠቀም መቆጣጠሪያወችን መሰየም ነው፤ ነገር ግን ይሄ የምርጫ ጉዳይ ነው። (የሩቢ ፋይል ስሞች ቅርጸ-እባብን ብቻ ስለሚጠቀሙ፣ የሬይልስ ኮድ ማመንጫ ኮዱን በሚያመነጪበት ጊዜ፣ በቅርጸ-ግመል የተጻፈውን ጽሑፍ የ‘ታች-ሰረዝ (underscore)
ዘዴን በመጠቀም ወደ ቅርጸ-እባብ ይቀይረዋል።)
በነገራችን ላይ የሆነ ኮድን በምታመነጩበት ጊዜ፣ አንድ ስህተት ብትፈጽሙ፣ ሂደቱን እንዴት መቀልበስ እንደምትችሉ ማወቁ ጠቃሚ ነው፡፡ በሬይልስ ውስጥ ነገሮችን እንዴት መቀልበስ እንደሚቻል የሚያሳዩ አንዳንድ ስልቶችን በሳጥን 3.1 ላይ ተመልከቱ፡፡
የሬይልስ አፕልኬሽንን ስታበለጽጉ፣ በጣም በምትጠነቀቁበት ጊዜም እንኳ፣ አንዳንድ ጊዜ ነገሮች ሊበላሹ ይችላሉ። ደስ የሚለው ግን፣ ሬይልስ የተበላሸውን ወደነበረበት ለመመለስ የሚረዱ መገልገያወች አሉት።
በጣም የተለመደው ሁኔታ፣ የመነጨውን ኮድ ለመቀልበስ መፈለግ ነው፤ ለምሳሌ:- የአንድ መቆጣጠሪያ ስምን ለመቀየር የመነጩትን ፋይሎች ለማስወገድ ፈለጋችሁ እንበል፤ ይሄ ደግሞ ራሱ የመቆጣጠሪያውን ፋይል የማስወገድ ያህል ቀላል አይደለም፤ ምክንያቱም አንድ መቆጣጠሪያን በምናመነጪበት ጊዜ፣ ሬይልስ ከመቆጣጠሪያው ጋር የተያያዙ ብዙ ተጨማሪ ረዳት ፋይሎችን በብዛት ስለሚፈጥር (በዝርዝር 3.7) ነው፤ ይህንን ግኝት መቀልበስ ማለት በዋናነት የመነጨውን ፋይል ማስወገድ ብቻ አይደለም፤ ነገር ግን ሁሉንም ጠቃሚ ፋይሎችንም ጪምር ነው። (በእርግጥም፣ በክፍል 2.2 እና በክፍል 2.3 ላይ የሬይልስ አመንጪ (rails generate)
ትእዛዝ የ‘ማዘዋወርያወች.አርቢ (routes.rb)
ፋይል ይዞታ ላይ ተጨማሪ ኮድ በራስሰር እንደሚጽፍ አይተናል፤ እናም እኛ አሁን ይህንን በራስሰር መቀልበስ ፈልገናል።) ይሄ በሬይልስ አውድ ውስጥ የመነጨው ነገር ስምን ከ‘ሬይልስ አጥፋ (rails destroy)
ትእዛዝ ፊት በማስቀመጥ ሊከናወን ይችላል። በተለይም፣ እነዚህ ሁለት ትእዛዞች እርስ በርሳቸው ይሰራረዛሉ:-
$ rails generate controller QuamiGetss menesha erdata $ rails destroy controller QuamiGetss menesha erdata
በተመሳሳይ መልኩ በምዕራፍ 6 ውስጥ እንደሚከተለው አድርገን አንድ ቅርጸትን እናመነጫለን፡-
$ rails generate model User name:string email:string
ይህንንም ይህን በመጠቀም መቀልበስ እንችላለን:-
$ rails destroy model User
(በዚህ ጊዜ፣ ሌላውን የማዘዥያ መስመር ነጋሪአሴት መተው እንችላለን። እስኪ ምዕራፍ 6 ላይ ስንደርስ ምክንያቱ ምን እንደሆነ ማወቅ ከቻላችሁ ገምቱ።)
ከቅርጸቶች ጋር የተዛመደው፣ ሌላው ዘዴ ደግሞ ፍልሰቶችን መቀልበስን ያሳትፋል፤ ይህንንም በምዕራፍ 2 ውስጥ ባጪሩ አይተናል፤ በተጨማሪም ከምዕራፍ 6 ጀምረን በደንብ እናየዋለን። ፍልሰቶች የውሂበጎታውን ሁኔታ ይህን ትእዛዝ በመጠቀም ይቀይራሉ:-
$ rails db:migrate
አንድ ነጠላ የፍልሰት ደረጃን፣ በዚህ ትእዛዝ መቀልበስ እንችላለን:-
$ rails db:rollback
ሁሉንም ፍልሰቶች መጀመሪያ ላይ ወደነበሩበት ለመቀልበስ፣ ይህንን መጠቀም እንችላለን:-
$ rails db:migrate VERSION=0
(ይህ ትእዛዝ የተዘገበው ፍልሰቶቹ በተሰጣቸው የቅደም ተከተል ቁጥር ነው፣ ስለሆነም ከ0
ውጪ ያሉ የስሪት ቁጥሮችም እንዲሁ ይሰራሉ። አሁን ግን ፍልሰቶቹ በተፈጠሩበት ጊዜ ላይ በመመሰረት ቁጥር ተሰቷቸዋል፣ ሆኖም ግን አሁንም የሚደገፈው VERSION=0
ብቻ ነው።)
አሁን እነዚህን ዘዴዎች ስለሰነቅን፣ ከማይቀረው የብልጸጋ ቀውስ ለመዳን በሚገባ ታጥቀናል ማለት ነው፡፡
በዝርዝር 3.7 ውስጥ የመነጨው የቋሚ ገጾች መቆጣጠሪያ የማዘዋወርያ ፋይሉን (ማለት አዋቅር/ማዘዋወርያወች/አርቢ‘ን (config/routes.rb
)) በራስሰር ያዘምነዋል፣ ይህንን ፋይልም መጀመሪያ በክፍል 1.2.4 ውስጥ ለሰላምታ አፕልኬሽኑ (ዝርዝር 1.15) የስር ማዘዋወርያ ስናዘጋጅ ተመልክተነዋል፣ እና በቅርብ ጊዜም በዝርዝር 3.6 ውስጥ አይተነዋል። የማዘዋወርያዎች ፋይሉ፣ በዓ.አ.ሃ.አወች እና በድረ-ገጾች መካከል ያለውን ዝምድና የሚበይነውን ማዘዋወርያ፣ የመተግበር ሃላፊነት አለበት (በምስል 2.12 ውስጥ ተመልክቷል)። የማዘዋወርያዎቹ ፋይል በ‘አዋቅር (config
) ማውጫ ውስጥ ይገኛል፣ ይህም ሬይልስ ለአፕልኬሽኑ ማዋቀሪያ የሚያስፈልገኡትን ፋይሎች የሚያስቀምጥበት ቦታ ነው (ምስል 3.4)።
በዝርዝር 3.7 ውስጥ የ‘መነሻ (menesha
) እና የ‘እርዳታ (erdata
) ተግባሮችን ስላካተትን፣ በዝርዝር 3.8 ውስጥ እንደሚታየው፣ የማዘዋወርያዎች ፋይል ቀድሞውኑ ለእያንዳንዱ ማዘዋወሪያ አንድ ደንብን ይዟል።
menesha
) እና ለ‘እርዳታ (erdata
) ተግባሮች ማዘዋወርያዎች። config/routes.rb
Rails.application.routes.draw do
get 'quami_getss/menesha'
get 'quami_getss/erdata'
root 'application#selamta'
end
ይሄ ደንብ:-
get 'quami_getss/menesha'
ቋሚ ገጾች መቆጣጠሪያ ውስጥ የ‘/ቋሚ_ገጾች/መነሻ (/quami_getss/menesha) ዓ.አ.ሃ.አ መጠይቆችን ለ‘መነሻ (menesha
) ተግባር ያመላክታል። በተጨማሪም፣ እኛ ማዛወርያውን አንድ የ‘ዓግኝ (GET)
መጠይቅን እንዲመልስ የ‘አግኝ (get
) ተግባርን በመጠቀም እናዘጋጅዋለን፣ ይህም በሃይለ ጽሑፍ ማዘዋወሪያ ስምምነት ከሚደገፉት መሰረታዊ የሃ.ጽ.ማ.ስ ግሶች (HTTP verbs) ውስጥ አንዱ ነው (ሳጥን 3.2)። በእኛ ሁኔታ ይህ ማለት ቋሚ ገጾች መቆጣጠሪያ ውስጥ አንድ የ‘መነሻ (menesha
) ተግባርን ስናመነጪ በ‘/ቋሚ_ገጾች/መነሻ (/quami_getss/menesha) አድራሻ ላይ አንድ ገጽን በራስሰር እናገኛለን ማለት ነው። ውጤቱን ለማየት በክፍል 1.2.2 ውስጥ እንደተገለጸው፣ አንድ የሬይልስ ማበልጸጊያ የድር አገልጋይን አስጀምሩ:-
$ rails server
ከዚያ ወደ /ቋሚ_ገጾች/መነሻ (/quami_getss/menesha) ሂዱ (ምስል 3.5)።
ዓግኝ (GET)
, ወዘተረፈየሃይለ ጽሑፍ ማዘዋወሪያ ስምምነት (Hhypertext Transfer Protocol (ሃ.ጽ.ማ.ስ (HTTP))):- ዓግኝ (GET)
፣ ዓስቀምጥ (POST)
፣ ዓዘምን (PATCH)
እና ሠርዝ (DELETE)
የተባሉ መሰረታዊ ተግባሮችን ይበይናል። እነዚህ በአንድ ተገልጋይ ኮምፕዩተር እና በአንድ አገልጋይ መካከል ያሉ ክዋኔዎችን ያመለክታሉ።(አንድ ተገልጋይ ኮምፕዩተር በምንልበት ጊዜ፣ በተለምዶ አንድ የድር አሳሽን ማስኬድ ማለት ፋየርፎክስን፣ ክሮምን፣ ወይም ሳፋሪን፣ ማስኬድ ማለታችን እንደሆነ እና እንዲሁም አንድ አገልጋይ በምንልበት ጊዜ ደግሞ፣ በተለምዶ አንድ አፓችን ወይም ኢንጂንኤክስን የሚያስኬድ የድርአገልጋይ ማለታችን እንደሆነ ልትገነዘቡት ይገባል፡፡)(የሬይልስ አፕልኬሽኖችን በአንድ የሰፈር ኮምፒዮተር ላይ በምናበለጽግበት ጊዜ፣ ተገልጋዩ እና አገልጋዩ አንድ በአካል ያለ ኮምፕዩተር መሆኑን ማወቁ አስፈላጊ ነው፤ ነገር ግን በአጠቃላይ የተለያዩ መሆናቸውን ልትገነዘቡ ይገባል።) በው.ሁ.ማ ስነ ህንጻ የተቃኙ የድር መዋቅሮች (ሬይልስን ጨምሮ) በሃ.ጽ.ማ.ስ ግሶች ላይ አጽንዖት የሚሰጡ ናቸው፤ ይህንንም በአጪሩ በምዕራፍ 2 ላይ ተመልክተናል፤ እንደገናም በምዕራፍ 7 ላይ ስለዚሁ ጉዳይ በሰፊው መማር እንጀምራለን፡፡
ዓግኝ (GET)
በድር ላይ መረጃን ለማንበብ (reading) የሚያገለግል፣ በጣም የተለመደ የሃ.ጽ.ማ.ስ ክወና ነው፤ ያ ማለት “አንድ ገጽ አግኝ get a page” ማለት ብቻ ነው፤ እናም በማንኛውም ጊዜ አንድ እንደ https://www.google.com/ ወይም https://www.wikipedia.org/ ያለ ጣቢያን በጎበኛችሁ ቁጥር አሳሻችሁ አንድ የ‘ዓግኝ (GET)
መጠይቅን እያስረከበ ነው ማለት ነው። የሚቀጥለው በጣም የተለመደው ክዋኔ ደግሞ ዓስቀምጥ (POST)
ነው፤ ይህም አንድ ቅጽን ስታስረክቡ፣ በአሳሻችሁ የሚላክ መጠይቅ ነው፡፡ በሬይልስ አፕልኬሽኖች ውስጥ የ‘ዓስቀምጥ (POST)
መጠይቆች ዋና ጥቅማቸው፣ ነገሮችን ለመፍጠር (Creating) ነው (ምንም እንኳ ሃ.ጽ.ማ.ስ ዓስቀምጥ‘ን (POST)
እንዳሻው ነገሮችን እንዲያዘምን ቢፈቅድለትም)። ለምሳሌ:- አንድ የምዝገባ ቅጽን ሞልታችሁ ስታስረክቡ፣ የ‘ዓስቀምጥ (POST)
መጠይቅ እሩቁ ጣቢያ ላይ፣ አንድ አዲስ ተጠቃሚ እንዲፈጠር መጠይቅ ያቀርባል ማለት ነው። ዓዘምን (PATCH)
እና ሠርዝ (DELETE)
የተባሉት ሌሎቹ ሁለት ግሶች የተነደፉት፣ በሩቅ አገልጋይ ላይ ነገሮችን ለማዘመን እና ለማጥፋት ነው። እነዚህ መጠይቆች እንደ ዓግኝ (GET)
እና ዓስቀምጥ (POST)
ብዙ የተለመዱ አይደሉም፤ ምክንያቱም አሳሾቹ እነዚህን መጠይቆች በተፈጥሯቸው መላክ ስለማይችሉ ነው፤ ነገር ግን አንዳንድ የድር መዋቅሮች (ሬይልስን ጨምሮ) በጥበብ አሳሾቹ እነዚህን ስጪዎች እንደሚያስተላልፉ አስመስለው ያሳያሉ። በዚህ ምክንያት ሬይልስ ሁሉንም፣ አራት የመጠይቅ ዓይነቶች ማለት:- ዓግኝን (GET)
፣ ዓስቀምጥ‘ን (POST)
፣ ዓዘምን‘ን (PATCH)
እና ሠርዝ‘ን (DELETE)
ይደግፋል ማለት ነው።
ይህ ገጽ ከየት እንደመጣ ለማወቅ፣ በአንድ የጽሑፍ አርታኢ ውስጥ፣ የቋሚ ገጾች መቆጣጠሪያን ማየት እንጀምር፤ ይህም በዝርዝር 3.9 ውስጥ ያለውን ይዞታ መምሰል ይኖርበታል። ከምዕራፍ 2 የመልመጃ አፕልኬሽን፣ የተጠቃሚወች እና የአጪርጽሑፎች መቆጣጠሪያወች በተለየ መልኩ፣ ይህ የቋሚ ገጾች መቆጣጠሪያ መደበኛ የው.ሁ.ማ ተግባሮችን እንደማይጠቀም አስተውላችሁ ይሆናል። ይህ ለቛሚ ገጾች አንድ የተለመደ ስብስብ ነው፤ ይህ ማለትም የው.ሁ.ማ መዋቅር ለማንኛውም ችግር ብቁ መፍትሔ አይደለም ማለት ነው።
app/controllers/quami_getss_controller.rb
class QuamiGetssController < ApplicationController
def menesha
end
def erdata
end
end
በዝርዝር 3.9 ውስጥ የ‘/ቋሚ_ገጾች_መቆጣጠሪያ.አርቢ (quami_getss_controller.rb
) ፋይል ክፍል (class
) በተባለ ቁልፍቃል፣ አንድ ክፍልን እንደበየነ እንመለከታለን፤ ክፍሉም ቋሚ_ገጾችመቆጣጠሪያ (QuamiGetssController
) ይባላል። ክፍሎች የ‘መነሻ (menesha
) እና የ‘እርዳታ (erdata
) የመሳሰሉ ሥልቶችን (Functions) በቀላሉ ለማደራጀት አመቺ መንገዶች ናቸው (ሥልቶች (Functions) ዘዴወች (Methods) በመባልም ይታወቃሉ)። እነዚህ የሚበየኑትም በይን (def
) የተባለ ቁልፍቃልን በመጠቀም ነው። በክፍል 2.3.4 ላይ እንደተገለጸው ይህ <
የግራ ማዕዘን ቅንፍ ቋሚ_ገጾችመቆጣጠሪያ (QuamiGetssController
) ከሬይልስ የ‘አፕልኬሽንመቆጣጠሪያ (ApplicationController
) ክፍል እንደሚወርስ ያመለክታል፤ ይህ ማለት በቅርብ ጊዜ እንደምናየው፣ ገጾቻችን ብዛት ያላቸው ሬይልስ ተኮር ተግባራትን የሰነቁ ናቸው ማለት ነው። (በክፍል 4.4 ውስጥ ስለ ክፍሎች እና ውርሻ በደንብ እንማራለን።)
በቋሚ ገጾች መቆጣጠሪያ ጉዳይ ላይ፣ ሁለቱም ዘዴወች በመጀመሪያ ላይ ባዶ ናቸው:-
def menesha
end
def erdata
end
በጥሬው ሩቢ ውስጥ እነዚህ ዘዴወች ምንም ነገር አይሰሩም። በሬይልስ አሰራር ግን ሁኔታው የተለየ ነው፤ ቋሚገጾችመቆጣጠሪያ (QuamiGetssController
) አንድ የሩቢ ክፍል ነው፤ ነገር ግን ከ‘አፕልኬሽንመቆጣጠሪያ (ApplicationController
) ስለሚወርስ የዘዴወቹ ባህሪ ለሬይልስ የተለዩ ናቸው፤ የ‘/ቋሚ_ገጾች/መነሻ (/quami_getss/menesha) አድራሻን በምንጎበኝበት ጊዜ፣ ሬይልስ ቋሚ ገጾች መቆጣጠሪያ ላይ ይመለከት እና በ‘መነሻ (menesha
) ተግባር ውስጥ ያለውን ኮድ ይፈጽማል፤ ከዚያም ከተግባሩ ጋር የሚጎዳኘውን ትይታ ያቀርባል፤ (በክፍል 1.2.3 ውስጥ እንደተመለከተው፣ “ት (V)” በ‘ቅ.ተ.መ (MVC) ውስጥ ያለውን የ “ት (V)” ተግባርን ያመለክታል)። በአሁኑ ጊዜ የ‘መነሻ (menesha
) ተግባር ባዶ ነው፤ ስለዚህም /ቋሚ_ገጾች/መነሻ‘ን (/quami_getss/menesha) መጎብኘት የሚሰራው ነገር ቢኖር፣ ትይታውን ማሳየት ብቻ ነው። ታድያ ትይታው ምን ይመስላል? እንዴትስ እናገኘዋለን?
በዝርዝር 3.7 ላይ ያለውን ውጤት እንደገና ብትመለከቱ፣ በተግባሮች እና በማሳያወች መካከል ያለውን ጉድኝት ልትገምቱ ችላላችሁ። ለምሳሌ መነሻ‘ን (menesha
) የመሰለ ተግባር አንድ መነሻ.ሃጽመቋ.ክሩ (menesha.html.erb
) የተባለ ተጓዳኝ ትይታ አለው። .ኢአርቢ (.erb
) የሚለው ክፍል ምን ማለት እንደሆነ፣ በክፍል 3.4 ውስጥ እንማረዋለን፤ .ሃጽመቋ (.html
) የሚለው ክፍል ግን በመሰረቱ ሃ.ጽ.መ.ቋ ስለሚመስል ምናልባት አያስደንቃቹሁ ይሆናል (ዝርዝር 3.10)።
app/views/quami_getss/menesha.html.erb
<h1>QuamiGetss#menesha</h1>
<p>Find me in app/views/quami_getss/menesha.html.erb</p>
የ‘እርዳታ (erdata
) ተግባሩ ትይታም ተመሳሳይ ነው (ዝርዝር 3.11)።
app/views/quami_getss/erdata.html.erb
<h1>QuamiGetss#erdata</h1>
<p>Find me in app/views/quami_getss/erdata.html.erb</p>
እነዚህ ሁለቱም ትይታወች የቦታ-መያዣዎች ናችው፡- አንድ በ‘ራስጌ1 (h1
) መለያ ውስጥ የገባ የአብይ-ደረጃ አርእስት እና አንድ በ‘ፓ (p
) መለያ ውስጥ የገባ፣ ወደ ተጓዳኙ ፋይል የሚወስድ ሙሉ መንገድን አካተዋል።
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
Wanza
) የተባለ መቆጣጠሪያ፣ ቡና (buna
) እና ቤት (bet
) ከተባሉ ሁለት ተግባሮች ጋር አመንጩ።
Wanza
) መቆጣጠሪያን እስከነ ተዛማጅ ተግባሮቹ ጠራርጋችሁ አጥፉ፡፡
ከክፍል 3.4 ጀምሮ አንዳንድ (በጣም በጥቂቱ) የሚለዋወጡ ይዞታዎችን የምንጨምርባቸው ቢሆንም፣ በዝርዝር 3.10 እና በዝርዝር 3.11 ውስጥ ያሉ ፋይሎች አሁን ባሉበት ሁኔታ ግን አንድ አስፈላጊ ነጥብን አጉልተው ያሳያሉ፤ እሱም የሬይልስ ትይታወች ንጹህ ቛሚ ሃ.ጽ.መ.ቋን እንደሚይዙ ነው። ይህ ማለትም የሬይልስ ዕውቀት ሳይኖረን እንኳ የመነሻ እና የእርዳታ ገጾችን ልክ በዝርዝር 3.12 እና በዝርዝር 3.13 ላይ እንዳሉት አድርገን ገጾቹን ማበጀት መጀመር እንችላለን ማለት ነው።
app/views/quami_getss/menesha.html.erb
<h1>ማሳያ አፕልኬሽን</h1>
<p>
ይህ <a href="https://www.railstutorial.org/">
የሩቢ ኦን ሬይልስ ስልጠና </a>
ማሳያ ለተባለው አፕልኬሽን የመነሻ ገጽ ነው፡፡
</p>
app/views/quami_getss/erdata.html.erb
<h1>እርዳታ</h1>
<p>
በሩቢ ኦንሬይልስ ስልጠና ላይ እርዳታን ለማግኘት
<a href="https://www.railstutorial.org/help">የሩቢ ኦንሬይልስ ስልጠና እርዳታ ገጽን</a>
ቃኙ። በዚህ የማሳያ አፕልኬሽን ላይ እርዳታን ለማግኘት
<a href="https://www.railstutorial.org/book"><em>
የሩቢ ኦንሬይልስ ስልጠና</em> መጽሐፍን</a> ተመልከቱ።
</p>
የዝርዝር 3.12 እና የዝርዝር 3.13 ውጤቶች በምስል 3.6 እና በምስል 3.7 ላይ ይታያሉ፡፡
ለማሳያ አፕልኬሽናችን የመነሻ እና የእርዳታ ገጾችን ቀደም ብለን ፈጥረን እና ይዞታቸውንም ሞልተን ጨርሰናል (ክፍል 3.2.2)፣ ስለዚህ አሁን አንድ ስለኛ የተባለ ገጽን እናክላለን። የዚህ ዓይነት ለውጥ በምናደርግበት ጊዜ፣ ገጸባህሪው በትክክል መተግበሩን ለማረጋገጥ፣ አንድ ራስ ፈትኔ ፈተናን (Automated Test) መጻፉ ጥሩ ልምድ ነው። አንድ አፕልኬሽንን በማበልጸግ ሂደት ላይ የሚገኘው የፈተና ስብስብ (Test Suite)፣ ከአንድ አደጋ እንደሚጠብቅ አንድ መረብ እና ልክ እንደ የአፕልኬሽኑ የኮድ ምንጪ፣ ተፈጻሚ ሰነድ ሆኖ ሊያገለግል ይችላል። ምንም እንኳ ተጨማሪ ኮድ ቢጠይቅም፣ በትክክል ከተሰራ፣ ፈተናወችን መጻፋችን ብልጸጋችንን በቅልጣፌ እንድንሰራ ያግዘናል። ምክንያቱም ያልተጠበቁ፣ ወይም ትክክል ያልሆኑ ውጤቶችን፣ ወይም የተጠበቀውን ገጸባህሪ ካላሳየ፣ ሳንካወችን ለማግኘት በጣም ትንሽ ጊዜ ብቻ ስለምናባክን ነው። ሆኖም ይህ የሚጸናው እኛ ፈተናዎችን በመጻፍ ላይ ብቁወች ከሆንን ብቻ ነው፤ ለዚህም ነው ፈተና መጻፍ መለማመዱን በተቻለ መጠን በቶሎ መጀመሩ በጣም አስፈላጊ የሆነው።
ምንም እንኳ ሁሉም የሬይልስ አበልጻጊወች አፕልኬሽንን መፈተን ጥሩ ሃሳብ እንደሆነ ቢስማሙም፣ በዝርዝር ጉዳዮ ላይ ግን የተላያዩ አመለካከቶች አላቸው። በፈተና-መሬ ብልጸጋ (ፈ.መ.ብ) (Test-Driven Development) (TDD) አጠቃቀም ላይ እስከ አሁን ድረስ ሞቅ ያለ ክርክር አለ። 8 ይህ ስልት አንድ አበልጻጊ በመጀመሪያ የሚወድቅ ፈተናን ይጽፍ እና ከዚያ የአፕልኬሽኑን ኮድ ፈተናውን እንዲያልፍ አድርጎ የሚጽፍበት የአፕልኬሽን አበለጻጻግ ዘዴ ነው። የሩቢ ኦን ሬይልስ ስልጠና ፈተናን ለማካሄድ ቀለል ያለ እና ግልጽ አቀራብን ይጠቀማል፤ ይህም የማንኛውንም ቡድን ሃሳብ ሳይደግፍ፣ ፈተና በሚያስፈልግበት ወቅት ፈተና-መሬ ብልጸጋን መጠቀም ይሆናል (ሳጥን 3.3)።
መቼ እና እንዴት መፈተን እንዳለብን በምንወስንበት ጊዜ፣ ለምን መፈተን እንዳለብን መረዳት ተገቢ ነው። በኔ አስተያየት ራስ ፈትኔ ፈተናወችን መጻፉ፣ ሶስት ዋና ጥቅሞች አሏቸው እነሱም፡-
ከላይ ከተዘረዘሩት ጥቅሞች አንዳቸውም እንኳን በመጀመሪያ ፈተናወች እንዲጻፉ የማይጠይቁ ቢሆኑም፣ ፈተና-መሬ ብልጸጋን (ፈ.መ.ብ) (Test-Driven Development (TDD)) በትጥቃችሁ ውስጥ ሊኖራችሁ የሚገባ አንድ ጠቃሚ መሳሪያ የሚሆንበት ብዙ ሁኔታወች ግን አሉ። መቼ እና እንዴት መፈተን እንዳለባችሁ መወሰኑ፣ ፈተናዎችን በመጻፍ ያላችሁ ልምድ ላይ ይወሰናል። አብዛኞቹ አበልጻጊወች ፈተናዎችን በመጻፍ ጥሩ ብቃት ላይ በሚደርሱበት ጊዜ፣ በመጀመሪያ ፈተናውን የመጻፍ ዝንባሌ ያድርባቸዋል። በተጨማሪም ፈተናው ከአፕልኬሽኑ ኮድ ጋር ሲነጻጸር ምን ያህል ከባድ እንደሆነ፣ የሚፈለጉት ገጸባህሪዎች እንዴት በትክክል እንደሚታወቁ እና ለወደፊቱ ገጸባህሪው የመሰበር እድሉ ላይ የተመረኮዘ ነው።
በዚህ ዓውደ ጽሑፍ ውስጥ፣ መቼ መጀመሪያ መፈተን (ወይም ጪራሽ አለመፈተን) እንዳለብን የምንከተለው አንድ የመመሪያ ስብስብ መኖሩ ጠቃሚ ነው። እነዚህ የሚከተሉት መመሪያወች ከራሴ ልምድ አኳያ የምሰጣቸው ናቸው፡-
በመደበኛውን የአሰራር ሂደት የተመለከትን እንደሆነ፣ ከላይ ያሉት አመራሮች መጀመሪያ የመቆጣጠሪያውን እና የቅርጸት ፈተናወችን፣ እና ሁለተኛ የውህደት ፈተናወችን (ይህ በመላው ቅርጸቶች፣ ትይታወች እና መቆጣጠሪያወች ላይ ያለውን ተግባራት ሁሉ ይፈትናል) መጻፍ እንዳለብን ያመለክታሉ። ቀላል ወይም ለስህተት የተጋለጠ የአፕልኬሽን ኮድ በምንጽፍበት ጊዜ፣ ወይም ሊቀየር በሚችልበት ሁኔታ ውስጥ ሲሆን (ብዙውን ጊዜ በትይታወች ላይ እንደሚታየው) ብዙውን ጊዜ መፈተኑን ሙሉ ለሙሉ እንተወዋለን።
የእኛ ዋና የመፈተኛ መሳሪያዎቻችን የመቆጣጠሪያ ፈተናወች (Controller Tests) (በዚህ ክፍል ውስጥ ይጀመራል) የቅርጸት ፈተናዎች (Model Tests) (በምዕራፍ 6 ውስጥ ይጀመራል) እና የውህደት ፈተናዎች (Integration Tests) (በምዕራፍ 7 ውስጥ ይጀመራል) ይሆናሉ። በተለይ የውህደት ፈተናዎች ሃያሎች ናቸው፤ ምክንያቱም አንድ የድር አሳሽን በመጠቀም፣ ከእኛ አፕልኬሽን ጋር የሚገናኝን የተጠቃሚ ድርጊቶችን ለማስመሰል ስለሚያስችሉን ነው፡፡ የውህደት ፈተናዎች የእኛ የመጨረሻ ዋና የመፈተኛ ስልታችን ይሆናሉ፤ ነግር ግን የመቆጣጠሪያ ፈተናወች ለመጀመር አንድ ቀላል መነሻን ይሰጡናል።
አሁን አንድ ስለኛ የተባለ ገጽን ወደ አፕልኬሽናችን የምናክልበት ጊዜ ነው። ከዚህ በኋላ እንደምናየው፣ ፈተናው አጪር እና ቀላል ነው፤ ስለዚህም በሳጥን 3.3 ውስጥ ያሉ አመራሮችን በመከተል ፈተናውን በመጀመሪያ እንጽፋለን። ከዚያም የአፕልኬሽኑን ኮድ ለመጻፍ የሚወድቁትን ፈተናወች እንጠቀማን።
የመፈተን ስራን ለመጀመር ከባድ እና የሬይልስንም የሩቢንም ሰፊ ዕውቀት የሚጠየቅ ሊሆን ይችላል። በዚህ ገና በሆነ ጊዜም ፈተናወችን መጻፉ ተስፋ አስቆራጪ እና አስፈሪ ሊመስል ይችላል። እንደ አጋጣሚ ግን ሬይልስ ከባዱን ስራ ሰርቶልናል፤ ምክንያቱም ፈተናውን በቀጥታ እንድንጀምር የ‘ሬይልስ መቆጣጠርያ አመንጪ (rails generate controller
) ትእዛዝን (ዝርዝር 3.7) ባካሄድንበት ወቅት አንድ የፈተና ፋይልን በራስሰር አመንጪቶልናል፡-
$ ls test/controllers/
quami_getss_controller_test.rb
እስቲ እንመልከተው፤ (በዝርዝር 3.14 ውስጥ ያለው ፈተና የአማርኛ ጽሑፍ እንደተጨመረበት ልትገነዘቡ ይገባል)።
test/controllers/quami_getss_controller_test.rb
require 'test_helper'
class QuamiGetssControllerTest < ActionDispatch::IntegrationTest
test "should get menesha" do
get quami_getss_menesha_url
assert_response :success
end
test "should get erdata" do
get quami_getss_erdata_url
assert_response :success
end
end
በዚህ ወቅት በዝርዝር 3.14 ውስጥ ያለውን አገባብ በዝርዝር መረዳቱ አስፈላጊ አይደለም፤ ነገር ግን በዝርዝር 3.7 ውስጥ በማዘዥያ መስመሩ ላይ፣ ላካተትናቸው ለእያንዳንዱ የመቆጣጠሪያ ተግባር፣ ሁለት ፈተናወዎች እንዳሉ ማየት ግን እንችላለን፡፡ እያንዳንዱ ፈተና በቀላሉ አንድ ዓ.አ.ሃ.አን ያገኛል፤ እናም ውጤቱ የተሳካ መሆኑን (በአንድ ማረጋገጫ (Assertion) በኩል) ያረጋግጣል። እዚህ ጋር የ‘አግኝ (get
) ጥቅም ፈተናወቻችን የመነሻ እና የእርዳታ ገጾች የተለመዱ የድር ገጾች መሆናቸውን እንደሚጠብቅ ያመለክታል፤ ይህም የተደረሰው በአንድ የ‘ዓግኝ (GET)
መጠይቅ ነው (ሳጥን 3.2)። የ‘አሳካ (:success
) ምላሽ፣ የሃ.ጽ.ማ.ስ የስር ኮድ ሁኔታ አንድ የረቀቀ ውክልና ሲሆን፤ አሁን ባለበት ሁኔታ ደግሞ ትክክል (200 OK) ነው ማለት ነው፡፡ በሌላ አማርኛ ይህንን የመሰለ ፈተና:-
test "should get menesha" do
get quami_getss_menesha_url
assert_response :success
end
“አንድ የ‘ዓግኝ (GET)
መጠይቅን በቋሚ ገጾች መነሻ (menesha
) ዓ.አ.ሃ.አ ላይ በመስጠት፣ የመነሻ ገጽን እንፈትን እና ከዚያም ምላሹ ‘ተሳክቷል success’ የሚል የኮድ ሁኔታን እንደተቀበልን እናረጋግጥ” ይላል።
የፈተና ዑደታችንን ለመጀመር፣ ፈተናወቹ በአሁኑ ጊዜ ማለፋቸውን ለማረጋገጥ፣ የፈተና ስብስቡን ማካሄድ አለብን። ይህንንም የ‘ሬይልስ ፈትን (rails test
) ትእዛዝን እንደሚከተለው አድርገን በመጠቀም ማከናወን እንችላለን:-
$ rails db:migrate # በአንዳድ ስርዓቶች ላይ አስፈላጊ ሊሆን የሚችል
$ rails test
2 tests, 2 assertions, 0 failures, 0 errors, 0 skips
የማስጀመሪያ የፈተና ስብስባችን እንደተፈለገው አልፏል (አረንጓዴ)። (ግዴታዊ ያልሆነውን የሚኒቴስት (MiniTest) ዘጋቢዎችን ክፍል 3.6.1 ውስጥ ካልጨመራችሁ በስተቀር፣ ላለፉት ፈተናወች በአረንጓዴ የተጻፉ ፈተናወችን በሰሌዳችሁ ውስጥ ማየት አትችሉም። እነዚህ ቀለሞች ቀጥታዊ ትርጉም ባይሰጣቸውም፣ አንድ አፕልኬሽን በሚገነባበት ጊዜ አረንጓዴ እና ቀይ የሚባለው አጠራር፣ የራሱ የሆነ ትርጉም አለው። ስለሆነም በዚህ ዓውድ ውስጥ ቀይ ማለት የፈተናውን መውደቅ ሲገልጽ፤ አረንጓዴ ማለት ደግሞ የፈተናውን ማለፍ ይገልጻል ማለት ነው፡፡ ስለሆነም ካሁን በኋላ በቀሪው ክፍለ ጊዜ ይህንን አባባል እንጠቀማለን።) እዚህ ላይና በቀሪው የስልጠና ክፍለ ጊዜ ሁሉ፣ በጣም የሚጠቅሙትን ክፍሎች ብቻ አጉልቶ ለማሳየት ስል፣ በአጠቃላይ ከፈተና ውጽዓቱ ላይ የተወሰኑትን መስመሮች እንደምተዋቸው ልብ ልትሉ ይገባል።
በነገራችን ላይ፣ በአንዳንድ ስርዓቶች ላይ በ‘ውጎ (db
) ማውጫ ውስጥ የሚመጡ እነዚህን የመሰሉ:-
/db/test.sqlite3-0
የመነጩ ፋይሎችን ልታዩ ትችላላችሁ። እነዚህ የመነጩ ፋይሎች ማከማቻው ላይ እንዳይታከሉ ለመከላከል፣ በዝርዝር 3.16 ላይ እንደሚታየው፣ እነሱን ችላ እንዲላቸው በ‘.ጊትችላበለው (.gitignore
) ፋይል (ክፍል 1.3.1.2) ውስጥ አንድ ደንብን እንድታክሉ እመክራችኋለሁ፡፡
.gitignore
.
.
.
# Ignore db test files.
db/test.*
በሳጥን 3.3 ውስጥ እንደተገለጸው፣ ፈተና-መሬ ብልጸጋ የሚወድቀውን ፈተና በመጀመሪያ መጻፍ፣ ፈተናውን ለማሳለፍ የሚፈለገውን የአፕልኬሽን ኮድ መጻፍ እና ከዚያም አስፈላጊ ከሆነ ኮዱን ማጣራትን ያሳትፋል። አብዛኞቹ የመፈተኛ መሳሪያዎች የሚወድቁትን ፈተናወች በቀይ የሚያልፉትን ደግሞ በአረንጓዴ ቀለም ስለሚያመለክቱ ይህ ዑደት አንዳንድ ጊዜ “ቀይ፣ አረንጓዴ፣ ማጣራት” በመባል ይታወቃል። በዚህ ክፍል ውስጥ የመጀመሪያውን ዑደት እንጨርሳለን፤ ይህም አንድ የሚወድቅ ፈተናን በመጻፍ ቀይን ማግኘት ይሆናል። ከዚያም በክፍል 3.3.3 ውስጥ አረንጓዴ ቀለምን እናገኛለን፣ ከዚያም በክፍል 3.4.3 ውስጥ ኮዱን እናጣራለን። 9
የመጀመሪያው ሂደታችን ለ‘ስለኛ (Silegna) ገጽ አንድ የሚወድቅ ፈተናን መጻፍ ነው። የዝርዝር 3.14 ቅድን በመከተል ፈተናው ምን ዓይነት ፈተና መሆን እንዳለበት መገመት ትችላላችሁን? መልሱ በዝርዝር 3.17 ውስጥ ይታያል፡፡
test/controllers/quami_getss_controller_test.rb
require 'test_helper'
class QuamiGetssControllerTest < ActionDispatch::IntegrationTest
test "መነሻ ገጽን ማግኘት አለበት" do
get quami_getss_menesha_url
assert_response :success
end
test "እርዳታ ገጽን ማግኘት አለበት" do
get quami_getss_erdata_url
assert_response :success
end
test "ስለኛ ገጽን ማግኘት አለበት" do
get quami_getss_silegna_url
assert_response :success
end
end
በዝርዝር 3.17 ውስጥ በቢጫ ቀለም የተቀቡት መስመሮች ላይ የስለኛ ገጽ፣ “silegna” የሚለው ቃል በ “menesha” ወይም “erdata” ቦታ ከመተካቱ በስተቀር ከሁለቱም ፈተናወች ጋር አንድ ዓይነት እንደሆነ እንመለከታለን። (ዝርዝር 3.17 የፈተናውን ገለጣ ከእንግሊዝኛ ይልቅ ወደ አማርኛ እንደቀየረው ልብበሉ።)
እንደተፈለገው፣ ፈተናው መጀመሪያ ላይ ይወድቃል፡-
$ rails test
3 tests, 2 assertions, 0 failures, 1 errors, 0 skips
አሁን አንድ የወደቀ ፈተና ስላለን (ቀይ) ወደሚያልፈው ፈተና (አረንጓዴ) እንዲመራን፣ የወደቁት ፈተናወች የሰጡንን የስህተት መልእክቶች እንጠቀማለን፣ በነሱ በመመራትም አንድ የሚሰራ የስለኛ ገጽን እንተገብራለን።
የወደቀው ፈተና የስህተት መልእክት ውጤት ውጽዓትን፣ በመመርመር መጀመር እንችላለን፡-
$ rails test
NameError: undefined local variable or method `quami_getss_silegna_url'
እዚህ ያለው የስህተት መልእክት እንደሚለው፣ የስለኛ ገጽ ዓ.አ.ሃ.አ በሬይልስ ኮድ ውስጥ አልተሰየመም ይላል፣ ይህም ራውትስ በተባለው ፋይል ውስጥ አንድ መስመር ኮድ መጨመር እንዳለብን አንድ ፍንጪ እየሰጠን ነው። በዝርዝር 3.20 ላይ እንደሚታየው፣ በዝርዝር 3.8 ውስጥ ያለውን ጥለት በመከተል ይህንን ማከናወን እንችላለን፡፡
silegna
) ማዘዋወሪያን ማከል። ቀይ config/routes.rb
Rails.application.routes.draw do
get 'quami_getss/menesha'
get 'quami_getss/erdata'
get 'quami_getss/silegna'
root 'application#selamta'
end
በዝርዝር 3.20 ውስጥ በቢጫ ቀለም የተቀባው መስመር ሬይልስን፣ በቋሚ ገጾች መቆጣጠሪያ ውስጥ ላለው የ‘ስለኛ (silegna
) ተግባር፣ ለ‘/ቋሚ_ገጾች/ስለኛ (/quami_getss/silegna) ዓ.አ.ሃ.አ አንድ የ‘ዓግኝ (GET)
መጠይቅን እንዲያዘዋውር ይነግረዋል።
ይህ:-
quami_getss_silegna_url
ተብሎ የሚጠራ አንድ ረጅን በራስሰር ይፈጥራል።
የፈተና ስብስቡን በድጋሜ በማስኬድ አሁንም ፈተናው ቀይእንደሆነ እናያለን፤ ነገር ግን አሁን የስህተት መልእክቱ ተለውጧል፡-
$ rails test
AbstractController::ActionNotFound:
The action 'silegna' could not be found for QuamiGetssController
የስህተት መልእክቱ አሁን በቋሚ ገጾች መቆጣጠሪያ ውስጥ የሌለውን አንድ የ‘ስለኛ (silegna
) ተግባርን ያመለክታል፣ ይህንንም በዝርዝር 3.22 ውስጥ እንደታየው፣ በዝርዝር 3.9 ውስጥ ያሉትን ማለት የ‘መነሻ (menesha
) እና የ‘እርዳታ (erdata
) ቅድን በመከተል ተግባሩን ማከል እንችላለን።
silegna
) ተግባር ጋር። ቀይ app/controllers/quami_getss_controller.rb
class QuamiGetssController < ApplicationController
def menesha
end
def erdata
end
def silegna
end
end
እንደበፊቱ የፈተና ስብስባችን አሁንም ቀይነው፤ ነገር ግን የስህተት መልእክቱ አሁንም በድጋሜ ተለውጧል፡-
$ rails test
ActionController::UnknownFormat: QuamiGetssController#silegna is missing
a template for this request format and variant.
ይህ የጎደለውን አንድ ዝግጁገጽታ ያመለክታል፣ ይህም በሬይልስ አውድ ውስጥ በመሰረቱ ከአንድ ትይታ ጋር አንድ ዓይነት ነገር ነው። በክፍል 3.2.1 ውስጥ እንደተገለጸው፣ የ‘መነሻ (menesha
) ተግባር በ‘አፕ/ትይታወች/ቋሚ_ገጾች (app/views/quami_getss
) ውስጥ ከሚገኘው ከ‘መነሻ.ሃጽመቋ.ክሩ (menesha.html.erb
) ትይታ ጋር የተዛመደ ነው። ይህ ማለትም እዛው ውስጥ አንድ ስለኛ.ሃጽመቋ.ክሩ (silegna.html.erb
) የተባለ አዲስ ፋይል መፍጠር ይኖርብናል ማለት ነው።
አንድ ፋይልን የመፍጠር ዘዴው እንደየ ስርዓቱ አወቃቀር ይለያያል፤ ነገር ግን አብዛኞቹ የጽሑፍ አርታኢዎች ማውጫው ላይ መቆጣጠሪያ ቁልፍን ተጪኖ ጠቅ በማድረግ “New File” የሚለውን ምናሌ በመምረጥ አዲስ ፋይልን እንድትፈጥሩ ይፈቅዱላችኋል። በተመሳሳይ መልኩ አንድ አዲስ ፋይልን ለመፍጠርም የፋይል ምናሌውን መጠቀም ትችላላችሁ፤ ከዚያም ፋይሉን በምታስቀምቱበት ጊዜ አስፈላጊውን ማውጫ ምረጡ። በመጨረሻም፣ እኔ የምወደውን የዩኒክስ ንካ ትእዛዝን እንደሚከተለው አድርጋችሁ መጠቀምም ትችላላችሁ፡-
$ touch app/views/quami_getss/silegna.html.erb
በማዘዥያ መስመር ላይ መሰረታዊ እውቀትን ለማግኘት የሚያስፈልገውን ትምህርት ተማር ላይ እንደተገለጸው የ‘ንካ (touch
) ትእዛዝ የአንድ ፋይል ወይም የማውጫ ማህተመጊዜን ለማዘመን የተነደፈ ቢሆንም፣ ትእዛዙ ፋይሉ ላይም ሆነ ማውጫው ላይ ምንም ነገር አይጨምርም፤ ይህ ማለት ፋይሉ ቀድሞ የተፈጠረ ከሆነ ነው፤ ፋይሉ ካልተፈጠረ ግን ትእዛዙ አንድ አዲስ ባዶ ፋይልን ይፈጥራል። (የደመና ቅ.ማ.አን እየተጠቀማችሁ ከሆነ፣ በክፍል 1.2.1 ላይ እንደተገለጸው የፋይሉን ዛፍ ማደስ ሊኖርባችሁ ይችላል፡፡ ይህም አንድ የቴክኒካዊ ብልሃት ምሳሌ ነው (ሳጥን 1.2)።)
አንዴ በትክክለኛው ማውጫ ውስጥ የ‘ስለኛ.ሃጽመቋ.ክሩ (silegna.html.erb
) ፋይልን ከፈጠራችሁ በኋላ፣ ፋይሉን በዝርዝር 3.23 ውስጥ ባሉት ይዞታዎች መሙላት ይኖርባቹኋል።
app/views/quami_getss/silegna.html.erb
<h1>ስለኛ</h1>
<p>
<a href="https://www.railstutorial.org/"><em>የሩቢ ኦን ሬይልስ ስልጠና</em></a>
በ <a href="https://www.learnenough.com/">በበቂ ተማር</a>
ስልጠናወች ውስጥ የሚገኝ አካል እና
<a href="https://rubyonrails.org/">በሩቢ ኦንሬይልስ</a>
ድር ማበልጸግን የሚያስተምር
<a href="https://www.railstutorial.org/book">የመጽሐፍ</a>
እና <a href="https://screencasts.railstutorial.org/">ተከታታይ የቪዲዮ</a>
ስልጠና ነው፡፡ ይህ የስልጠናው የማሳያ አፕልኬሽን ነው።
</p>
በዚህ ጊዜ፣ የ‘ሬይልስ ፈትን (rails test
) ትእዛዝን ማስኬዱ መልሶ ወደ አረንጓዴሊያመጣን ይገባዋል:-
$ rails test
3 tests, 3 assertions, 0 failures, 0 errors, 0 skips
በእርግጥ፣ ፈተናወቻችን ወደ ስህተት እየመሩን አለመሆናቸውን ለማረጋገጥ፣ ገጹን በአንድ የድር አሳሽ ውስጥ ማየቱ መጥፎ ሃሳብ አይደለም (ምስል 3.8)።
አሁን አረንጓዴን ስላገኘን፣ የእኛን ኮድ በልበ ሙሉነት ለማጣራት ነጻ ነን። አንድ አፕልኬሽን በሚበለጽግበት ጊዜ፣ ኮዱ ብዙውን ጊዜ “መሽተት” ይጀምራል፤ ይህ ማለትም አስቀያሚ፣ የተንዛዛ፣ ወይም በኮድ ድግግሞሽ የተሞላ ነው ማለት ነው። ኮምፒውተሩ ኮዱ የፈለገውን ቢመስል ግድ የለውም፣ በርግጥ ሰው ግድ ይለዋል፤ ስሆነም የኮዱን መሰረት ንጹህ ለማድረግ ሁሌ ኮዱን ማጣራት አስፈላጊ ነው። ምንም እንኳን የአፕልኬሽናችን ኮድ ለማጣራት በጣም ትንሽ ቢሆንም፣ የኮድ መሽተትን ግን በሁሉም ስንጥቆች ውስጥ ያስገባል፣ እናም በክፍል 3.4.3 ውስጥ ኮዱን ማጣራት እንጀምራለን።
ለአንዳንዱ ቛሚ ገጾች፣ ተግባሮች እና ትይታወችን ስለፈጠርን፣ አሁን በእያንዳንዱ ገጽ መሰረት ላይ ተሞኩዞ የሚለወጡ፣ አንዳንድ ይዞታዎችን በማከል በጣም በጥቂቱ ተለዋዋጪ እንዲሆኑ እናደርጋቸዋለን፤ እያንዳንዱ ገጽ ይዘቱን የሚያንጸባርቅ አርዕስት ይኖረዋል። በእውነቱ እዚህ ላይ አንድ እንኮ የሚለወጥ አርዕስትን በማድረግ ብቻ ተለዋዋጪ ይዘትን ይወክላል ማለቱ አከራካሪ ነው፤ ነገር ግን ግራም ነፈሰ ቀኝ በምዕራፍ 7 ውስጥ ያለጥርጥር ተለዋዋጪ ለሆነ ይዞታ፣ አስፈላጊውን መሰረት ከወዲሁ ይጥላል፡፡
እቅዳችን በእያንዳንዱ ገጽ ላይ የሚለዋወጥ የገጽ አርዕስት ለማድረግ የመነሻ፣ የእርዳታ እና የስለኛ ገጾችን ማረም ነው። ይህ በእኛ ገጽ ትይታወች ውስጥ ርዕስ (<title>
) የተባለ መለያ መጠቀምን ያሳትፋል። አብዛኛዎቹ የድር አሳሾች የአርዕስት መለያውን ይዞታ በአሳሹ ራስጌ ባለው መስኮት ላይ ያሳዩታል። እናም በዛ ላይ መሆኑ ለፍለጋ ፕሮግራም ማመቻቻ አስፈላጊ ነው፡፡ ይህን ተግባራዊ ለማድረግ ሙሉውን “የቀይ፣ አረንጓዴ እና የማጣራት” ዑደትን እንጠቀማለን፤ በመጀመርያ ለገጽ አርዕስታችን ቀላል ፈተናወችን እናክላለን (ቀይ)፤ ከዚያ ለሶስቱም ገጾች አርዕስቶችን (አረንጓዴ) እናክላለን፤ በመጨረሻም የኮድ ድግግሞሽን ለማጥፋት (ማጣራት) አንድ የገጽታ ፋይልን እንጠቀማለን። በዚህ ክፍል መጨረሻ ሶስቱም ቛሚ ገጾቻችን ይህን የመሰለ ቅርጽ ያለው አርዕስት ይኖራቸዋል:- “<የገጹ ስም> | የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን”። ይህም የመጀመርያው ክፍል፣ በገጹ ላይ የተመረኮዘ አርዕስት የሚይዝ ክፍል ይሆናል (ሰንጠረዥ 3.2)።
የ‘ሬይልስ አዲስ (rails new
) ትእዛዝ (ዝርዝር 3.1) አንድ የገጽታ ፋይልን በነባሪነት ፈጥሯል፤ ነገር ግን መጀመሪያ እሱን ለጊዜው ጥጉን ማስያዙ ጠቃሚ ነው፤ ስሙን በመቀየር እንደዛ ማድረግ እንችላለን:-
$ mv app/views/layouts/application.html.erb layout_file # ጊዜያዊ ለውጥ
በተለምዶ በአንድ እውነተኛ አፕልኬሽን ላይ ይህን አታደርጉም፣ እዚህ ላይ የገጽታ ፋይሉን ሆን ብለን እንዳይሰራ በማድረግ ስለጀመርን ግን ዓላማውን ለመረዳት ቀላል ነው።
ገጽ | ዓ.አ.ሃ.አ | መሰረተ አርዕስት | ተለዋዋጪ አርዕስት |
Menesha | /quami_getss/menesha | "የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን" |
"መነሻ" |
Erdata | /quami_getss/erdata | "የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን" |
"እርዳታ" |
Silegna | /quami_getss/silegna | "የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን" |
"ስለኛ" |
በዝርዝር 3.25 ውስጥ የሚታየውን አይነት ቅጽ የሚወስድ የገጽ አርዕስቶችን ለማከል፣ አንድ የተለመደ የድር ገጽ አወቃቀርን መማር (ወይም መገምገም) ይኖርብናል። (ይህ በ በሃ.ጽ.መ.ቋ ላይ መሰረታዊ እውቀትን ለማግኘት የሚያስፈልገውን ተማር ላይ በሰፊው ተሸፍኗል።)
<!DOCTYPE html>
<html>
<head>
<title>ሰላምታ</title>
</head>
<body>
<p>ዓለም እንዴት ነሽ!</p>
</body>
</html>
በዝርዝር 3.25 ውስጥ ያለው መዋቅር፣ የትኛው ዓይነት የሃ.ጽ.መ.ቋ ስሪትን እየተጠቀምን እንደሆነ ለአሳሾቹ ለመንገር በራስጌው ላይ አንድ የሰነድ ዓይነቱን (Document Type) የሚበይን ደንብን ይይዛል (በዚህ ጊዜ የሚበየነው ደንብም ሃ.ጽ.መ.ቋ5 (HTML5)10 የተባለውን ደንብ ነው)። በዚህ ጊዜ በራስ (head
) ክፍል ውስጥ፡ ርዕስ (title
) በተባለው መለዮ ላይ “ሰላምታ” እና አካል (body
) በተባለው ክፍል ውስጥ ፓ (p
) በተባለው መለዮ ላይ “ዓለም እንዴት ነሽ!” የሚል ይዞታን ይዟል። (ለግምስምስ ሌጣቦታ (Whitespace) የመተው ጉዳይ እንደየሰው ፍላጎት ይወሰናል (ሃ.ጽ.መ.ቋ ለሌጣቦታ ግድ የለውም እናም ሁሉንም ክፍትቦታዎች እና ታሮች ችላ ይላቸዋል።) እኛ ይህንን በማድረጋችን ግን የመዋቅሩን ስነዳ ለማየት ሁኔታወችን ያቃልልናል።11)
በዝርዝር 3.17 ውስጥ ያሉትን ፈተናወች ከ‘መለያ_አረጋግጥ (assert_select
) ዘዴ ጋር በማጣመር ሰንጠረዥ 3.2 ውስጥ ላሉ ለእያንዳንዱ አርዕስት ቀላል የሆኑ ፈተናወችን እንጽፋለን፣ ይህም አንድ የተወሰነ የሃ.ጽ.መ.ቋ መለዮ የተጠበቀው ቦታ ላይ መኖሩን እንድናረጋግጥ ያስችለናል (የሃ.ጽ.መ.ቋ መለዮ ልክ እንደስሙ አንዳንድ ጊዜ “መራጪ (selector)” በመባል ይታወቃል፣ በዚህ ስልጠና ላይ ግን መለዮ በማለት እንጠራወለን):- 12
assert_select "title", "መነሻ | የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን"
በተለይም፣ ከላይ ያለው ኮድ “መነሻ | የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን” የሚል ሃረግ የያዘ አንድ የ‘ርዕስ (<title>
) መለዮ መኖሩን ይፈትሻል። ይህንን ሃሳብ በሶስቱም ቛሚ ገጾች ላይ ተግባራዊ ማድረጉ በዝርዝር 3.26 ውስጥ የተመለከቱትን ፈተናወች ይሰጣል።
test/controllers/quami_getss_controller_test.rb
require 'test_helper'
class QuamiGetssControllerTest < ActionDispatch::IntegrationTest
test "መነሻ ገጽን ማግኘት አለበት" do
get quami_getss_menesha_url
assert_response :success
assert_select "title", "መነሻ | የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን"
end
test "እርዳታ ገጽን ማግኘት አለበት" do
get quami_getss_erdata_url
assert_response :success
assert_select "title", "እርዳታ | የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን"
end
test "ስለኛ ገጽን ማግኘት አለበት" do
get quami_getss_silegna_url
assert_response :success
assert_select "title", "ስለኛ | የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን"
end
end
የዝርዝር 3.26 ፈተናወች ባሉበት ሁኔታ እንዳሉ፣ የፈተና ስብስቡ አሁን ቀይመሆኑን ማረጋገጥ ይኖርባቹኋል፡-
$ rails test
3 tests, 6 assertions, 3 failures, 0 errors, 0 skips
ፈተናወቹ በክፍል 3.4.1 ላይ ባሉ የፈተና ሂደቶች ውስጥ እንዲያልፉ፣ አሁን በእያንዳንዱ ገጽ ላይ አንድ አርዕስትን እናክላለን፡፡ መሰረታዊውን የሃ.ጽ.መ.ቋ መዋቅር ከዝርዝር 3.25 ወደ ተበጀው መነሻ ገጽ ማለት ወደ ዝርዝር 3.12 ማከሉ፣ ዝርዝር 3.28 ‘ን ያስገኛል።
app/views/quami_getss/menesha.html.erb
<!DOCTYPE html>
<html>
<head>
<title>መነሻ | የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን</title>
</head>
<body>
<h1>ማሳያ አፕልኬሽን</h1>
<p>
ይህ <a href="https://www.railstutorial.org/">
የሩቢ ኦን ሬይልስ ስልጠና</a>
ማሳያ ለተባለው አፕልኬሽን፡ የመነሻ ገጽ ነው፡፡
</p>
</body>
</html>
ተዛማጁ የድር ገጽ በምስል 3.9 ውስጥ ይታያል። ከማያ-ገጹ ላይ የተወሰደው ስእል እንደሚያሳየው፣ የገጹን አርዕስት በአሳሻችሁ ላይ ማየት ከፈለጋችሁ፣ አንድ አዲስ ተጨማሪ ትርን መክፈት ይጠበቅባችኋል፡፡ ምስል 3.9 ‘ም የሚታየውን ማለት የሁለተኛውን ትር ያብራራል፡፡
ለእርዳታ ገጽ (ዝርዝር 3.13) እና ለስለኛ ገጽ (ዝርዝር 3.23) ይህንን ቅድ መከተል በዝርዝር 3.29 እና በዝርዝር 3.30 ውስጥ ያለውን ኮድ ያስገኛል።
app/views/quami_getss/erdata.html.erb
<!DOCTYPE html>
<html>
<head>
<title>እርዳታ | የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን</title>
</head>
<body>
<h1>እርዳታ</h1>
<p>
በሩቢ ኦንሬይልስ ስልጠና ላይ እርዳታን፡ ለማግኘት
<a href="https://www.railstutorial.org/help">የሩቢ ኦንሬይልስ ስልጠና እርዳታ ገጽን</a>
ቃኙ። በዚህ የማሳያ አፕልኬሽን ላይ እርዳታን፡ ለማግኘት
<a href="https://www.railstutorial.org/book"><em>
የሩቢ ኦንሬይልስ ስልጠና</em> መጽሐፍን</a> ተመልከቱ።
</p>
</body>
</html>
app/views/quami_getss/silegna.html.erb
<!DOCTYPE html>
<html>
<head>
<title>ስለኛ | የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን</title>
</head>
<body>
<h1>ስለኛ</h1>
<p>
<a href="https://www.railstutorial.org/"><em>የሩቢ ኦን ሬይልስ ስልጠና፡</em></a>
በ <a href="https://www.learnenough.com/">በበቂ ተማር</a>
ስልጠናወች ውስጥ የሚገኝ አካል እና፣
<a href="https://rubyonrails.org/">በሩቢ ኦንሬይልስ</a>
ድር ማበልጸግን የሚያስተምር
<a href="https://www.railstutorial.org/book">የመጽሐፍ</a>
እና <a href="https://screencasts.railstutorial.org/">ተከታታይ የቪዲዮ</a>
ስልጠና ነው፡፡ ይህ የስልጠናው ማሳያ አፕልኬሽን ነው።
</p>
</body>
</html>
በዚህ ጊዜ፣ የፈተና ስብስቡ ወደ አረንጓዴመመለስ አለበት፡-
$ rails test
3 tests, 6 assertions, 0 failures, 0 errors, 0 skips
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
ከዚህ ክፍል ጀምሮ፣ ለወደፊቱ በኮድ ዝርዝር ላይ መልሳቸው የማይቀርብ መልመጃዎችን በመስራት አፕልኬሽኑ ላይ አንዳንድ ማሻሻያዎችን ማድረግ እንጀምራለን፡፡ ይህ የተደረገበት ምክንያት፣ መልመጃዎቹን ላላጠናቀቁ አንባቢዎች መልመጃዎቹ ትርጉም እንዲሰጡ ለማድረግ ሲሆን መልመጃዎቹን ከሰራችኋቸው ግን ኮዳችሁ ከዋናው ጽሑፍ ጋር እንደሚለያይ ልትገነዘቡ ይገባል፡፡ እንደዚህ ያሉ ትናንሽ አስቸጋሪ ልዩነቶችን ለመፍታት የሚደረጉ ጥረቶች ለቴክኒካዊ ብልሃት እድገት ከፍተኛ አስተቃጽኦ ያበረክታሉ (ሳጥን 1.2)፡፡
setup
) ሥልትን በመጠቀሞ የተደጋገምውን ፈተና በማስወገድ በዝርዝር 3.32 ውስጥ ያሉ ፈተናወች ድግግሞሹ ከተወገደ በኋላም አረንጓዴመሆናቸውን አረጋግጡ፡፡ (ዝርዝር 3.32 በክፍል 2.2.2 የታየውን፣ በክፍል 4.4.5 በይበልጥ የሚገለጸውን አንድ የቅርፀ ተለዋዋጪን በክፍል 4.2.1 ላይ በደንብ ከሚገለጸው ከሃረግ ውስጠገምት (String Interpolation) አሰራር ጋር በማጣመር ይሰራል።)
test/controllers/quami_getss_controller_test.rb
require 'test_helper'
class QuamiGetssControllerTest < ActionDispatch::IntegrationTest
def setup
@meserete_ries = "የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን"
end
test "መነሻ ገጽን ማግኘት አለበት" do
get quami_getss_menesha_url
assert_response :success
assert_select "title", "መነሻ | #{@meserete_ries}"
end
test "እርዳታ ገጽን ማግኘት አለበት" do
get quami_getss_erdata_url
assert_response :success
assert_select "title", "እርዳታ | #{@meserete_ries}"
end
test "ስለኛ ገጽን ማግኘት አለበት" do
get quami_getss_silegna_url
assert_response :success
assert_select "title", "ስለኛ | #{@meserete_ries}"
end
end
ቀደም ሲል በዚህ ክፍል ውስጥ ብዙ ነገር አሳክተናል፤ የሬይልስ መቆጣጠሪያወችን እና ተግባሮችን በመጠቀም ሶስት ብቁ ገጾችን አመንጪተናል፤ ነገር ግን ገጾቹ ንጹህ ቛሚ ሃ.ጽ.መ.ቋ ናቸው፣ እና በዚህ ምክንያትም የሬይልስን ችሎታ አያሳዩም። በተጨማሪም በመጥፎ የኮድ ድግግሞሽ ተጠቅተዋል፡-
ይህ የተደጋጋመ ኮድ “ነገር አትደጋግም Don’t Repeat Yourself” የተባለውን የሬይልስ መርህን የሚጥስ ስራ ነው፤ በዚህ ክፍል ውስጥ ድግግሞሹን በማስወገድ ኮዳችንን ከመደጋገም ነጻ እናወጣለን። በመጨመሻም አርዕስቶቹ አሁንም ትክክል መሆናቸውን ለማረጋገጥ፣ በክፍል 3.4.2 ውስጥ የሚገኙትን ፈተናወችን ደግመን እናስኬዳቸዋለን።
ድግግሞሹን ለማስወገድ አንድ እርምጃ ወደፊት እንጓዝ ዘንድ፣ በተቃራኒ መልኩ አንድዳንድ ተጨማሪ ድግግሞሽን በማከል የመጀመሪያውን ሂደት እንጀምራለን፣ አሁን በጣም የሚመሳሰሉትን አርዕስቶች ጪራሽ አንድ ዓይነት በማድረግ እንጀምራለን፡፡ ይህ ሂደት በኋላ ሁሉንም የኮድ ድግግሞሽ ለማስወገድ በጣም ቀላል እንዲሆን ያደርጋል።
ስልቱ በትይታችን ውስጥ ክት ሩቢን (Embedded Ruby) መጠቀምን ያሳትፋል። የመነሻ፣ የእርዳታ እና የስለኛ ገጽ አርዕስቶች አንድ ተለዋዋጪ አካል ስላላቸው፣ በእያንዳንዱ ገጽ ላይ የተለያዩ አርዕስቶችን ለማዘጋጀት አንድ አቅርብ (provide
) የተባለ የሬይልስ ልዩ ሥልትን እንጠቀማለን። በዝርዝር 3.33 ውስጥ ካለው ኮድ ጋር ቃልበቃል “መነሻ” የሚለውን አርዕስት በ‘መነሻ.ሃጽመቋ.ክሩ (menesha.html.erb
) ትይታ ውስጥ በመተካት ይህ አርዕስት እንዴት እንደሚሰራ ማየት እንችላለን፡፡
app/views/quami_getss/menesha.html.erb
<% provide(:title, "መነሻ") %>
<!DOCTYPE html>
<html>
<head>
<title><%= yield(:title)%> | የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን</title>
</head>
<body>
<h1>ማሳያ አፕልኬሽን</h1>
<p>
ይህ <a href="https://www.railstutorial.org/">
የሩቢ ኦን ሬይልስ ስልጠና</a>
ማሳያ ለተባለው አፕልኬሽን፡ የመነሻ ገጽ ነው፡፡
</p>
</body>
</html>
በዝርዝር 3.33 ውስጥ የሚገኘው ክት ሩቢ የመጀመሪያ ምሳሌያችን ነው፣ ይህም ክ.ሩ ERb (ወይም ERB) በመባልም ይታወቃል። (የሃ.ጽ.መ.ቋ ትይታወች ለምን .ሃጽመቋ.ክሩ (.html.erb
) የሚል የፋይል ቅጥያ እንደያዙ አሁን እውቃችኋል።) ኢአርቢ በድር ገጾች ውስጥ ተለዋዋጪ ይዘትን ለማካተት የሚጠቅም ዋነኛው የዝግጁገጽታ ስርዓት ነው፡፡13 ይህ ኮድ:-
<% provide(:title, "መነሻ") %>
ይህን <% ... %>
በመጠቀም፣ ሬይልስ፣ የ‘:ርዕስ (:title
) መለያ ጋር የአቅርብ (provide
) ሥልትን በመጥራት፣ የ “መነሻ”
ሃረግን ከአርዕስት መለያው ጋር እንደሚያዛምድ ያመለክታል። 14 ከዚያም በአርዕስቱ ውስጥ የሩቢን አፍራ (yield
) ሥልትን በመጠቀም አርዕስቱን በገጽታው ውስጥ ለማስገባት በጣም የተዛመደውን ማለት ይህን <%= ... %>
ስርዓተ-ምልክት ተጠቅመናል፡- 15
<title><%= yield(:title) %> | የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን</title>
(በሁለቱ ክት ሩቢ መካከል ያለው ልዮነት፣ ይህ <% ... %>
በውስጡ የገባውን ኮድ ይፈጽማል፤ ይህ <%= ... %>
ደግሞ በውስጡ የገባውን ኮድ ይፈጽም እና ውጤቱን ወደ ገጽታው ያስገባል።) አሁን ገጹ ላይ ያለው ውጤት ከበፊቱ ጋር አንድ ዓይነት ነው፤ አሁን ግን የአርዕስቱ ተለዋዋጪ ክፍል በትእንግርት በክት ሩቢ ይመነጫል።
በክፍል 3.4.2 ውስጥ የሚገኙትን ፈተናወች በማስኬድ፣ እስካሁን ያደረግነው ስራ ሁሉም እንደሚሰራ እና ሁሉም እስካሁን ድረስ አረንጓዴመሆናቸውን ማረጋገጥ እንችላለን፡-
$ rails test
3 tests, 6 assertions, 0 failures, 0 errors, 0 skips
ከዚያ ለእገዛ እና ለስለ ገጾች ተዛማጅ ተተኪ አርዕስቶችን ማድረግ እንችላለን (ዝርዝር 3.35 እና ዝርዝር 3.36)።
app/views/quami_getss/erdata.html.erb
<% provide(:title, "እርዳታ") %>
<!DOCTYPE html>
<html>
<head>
<title><%= yield(:title)%> | የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን</title>
</head>
<body>
<h1>እርዳታ</h1>
<p>
በሩቢ ኦንሬይልስ ስልጠና ላይ እርዳታን፡ ለማግኘት
<a href="https://www.railstutorial.org/help">የሩቢ ኦንሬይልስ ስልጠና እርዳታ ገጽን</a>
ቃኙ። በዚህ የማሳያ አፕልኬሽን ላይ እርዳታን፡ ለማግኘት
<a href="https://www.railstutorial.org/book"><em>
የሩቢ ኦንሬይልስ ስልጠና</em> መጽሐፍን</a> ተመልከቱ።
</p>
</body>
</html>
app/views/quami_getss/silegna.html.erb
<% provide(:title, "ስለኛ") %>
<!DOCTYPE html>
<html>
<head>
<title><%= yield(:title)%> | የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን</title>
</head>
<body>
<h1>ስለኛ</h1>
<p>
<a href="https://www.railstutorial.org/"><em>የሩቢ ኦን ሬይልስ ስልጠና፡</em></a>
በ <a href="https://www.learnenough.com/">በበቂ ተማር</a>
ስልጠናወች ውስጥ የሚገኝ አካል እና፣
<a href="https://rubyonrails.org/">በሩቢ ኦንሬይልስ</a>
ድር ማበልጸግን የሚያስተምር
<a href="https://www.railstutorial.org/book">የመጽሐፍ</a>
እና <a href="https://screencasts.railstutorial.org/">ተከታታይ የቪዲዮ</a>
ስልጠና ነው፡፡ ይህ የስልጠናው ማሳያ አፕልኬሽን ነው።
</p>
</body>
</html>
አሁን የገጹ አርዕስቶች ተለዋዋጪ ክፍልን በክት ሩቢ ስለተካን፣ እያንዳንዱ ገጻችን ይህንን ይመስላል:-
<% provide(:title, "የገጽ አርዕስት") %>
<!DOCTYPE html>
<html>
<head>
<title><%= yield(:title)%> | የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን</title>
</head>
<body>
Contents
</body>
</html>
በሌላ አማርኛ በ‘አካል (body
) መለዮ ውስጥ ካሉት ይዞታወች በስተቀር፣ በርዕስ (title
) መለዮ ውስጥ ያሉትን ይዘቶች ጨምሮ ሁሉም ገጾች በመዋቅር ረገድ ፍጹም አንድ ናቸው ማለት ነው።
ይህንን የጋራ መዋቅር ከሌላ ለመለየት፣ ሬይልስ አፕልኬሽን.ሃጽመቋ.ክሩ (application.html.erb
) ከተባለ አንድ ልዩ የገጽታ ፋይል ጋር ይመጣል፣ እሱም በዚህ ክፍል መጀመሪያ (በክፍል 3.4) ላይ ዳግም-የሰየምነው እና አሁን እነበረበት ቦታ የምንመልሰው ፋይል ነው:-
$ mv layout_file app/views/layouts/application.html.erb
ገጽታው እንዲሰራ ለማድረግ ነባሪውን አርዕስት ከላይ ካሉት ክት ሩቢ ምሳሌዎች ባንዱ እንተካዋለን:-
<title><%= yield(:title) %> | የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን</title>
ያንን በማድረግ የተገኘው የገጽታው ውጤት በዝርዝር 3.37 ውስጥ ይታያል፡፡
app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
<head>
<title><%= yield(:title)%> | የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን</title>
<meta charset="utf-8">
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<%= stylesheet_link_tag 'application', media: 'all',
'data-turbolinks-track': 'reload' %>
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
</head>
<body>
<%= yield %>
</body>
</html>
ይህን ልዩ መስመር ልብ በሉ:-
<%= yield %>
ይህ ኮድ የእያንዳንዱን ገጽ ይዞታ፣ ገጽታው ውስጥ የማስገባት ሃላፊነት አለበት። ይህ እንዴት በትክክል እንደሚሰራ ማወቅ አስፈላጊ አይደለም፣ የሚያስፈልግ ነገር ቢኖር ለምሳሌ:- /ቋሚ_ገጾችመቆጣጠሪያ/መነሻ‘ን (/quami_getss/menesha) መጎብኘቱ የ‘መነሻ.ሃጽመቋ.ክሩ (menesha.html.erb
) ይዞታዎችን ወደ ሃ.ጽ.መ.ቋ እንደሚቀይር እና ከዚያ <%= yield %>
ቦታ ላይ በርግጠኛነት እንደሚያስገባው ማወቅ ብቻ ነው።
ዝርዝር 3.37 አንድ “የሆሄ ቋንቋ (Character Set)” ያካተተ ሲሆን፣ በዚህ ሁኔታ ላይ ዩኒኮድን (Unicode) ለማሳየት utf-8 የተባለውን የቋንቋ ሆሄን ተጠቅሟል።
መጨረሻም፣ ነባሪው የሬይልስ ገጽታ፣ የተለያዩ ተጨማሪ ኮዶችን የያዙ መስመሮችን እንደሚያካትት ማስተዋሉ አስፈላጊ ነው፡-
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<%= stylesheet_link_tag ... %>
<%= javascript_pack_tag "application", ... %>
ከላይ የተዘረዘሩትን ኮዶች ስንመለከት:- የአፕልኬሽኑን ቅጠሉህ (Stylesheet)16 ወደ አፕልኬሽኑ ለማካተት የ‘ቅጠሉህ_አገናኝ_መለያ (stylesheet_link_tag
) ዘዴን ሲጠቀም፤ ጃቫስክሪፕቱን ለማካተት ደግሞ የ‘ጃቫስክሪፕት_አገናኝ_መለያ (javascript_link_tag
) ዘዴን ይጠቀማል፡፡ እነዚህ እና ከላይ የተዘረዘሩትን ጨምሮ ሁሉም የንብረት ቧንቧመስመር ክፍል ናቸው (ክፍል 5.2.1)። የይዘት ጥበቃ ፖሊሲን (Content Security Policy) (ይ.ጥ.ፖ (CSP)) ተግባራዊ አድርጎ ወደ አፕልኬሽኑ የሚመጡ ጣቢያ ሰበር ስክሪፕትን (cross-site scripting) (ጣ.ሰ.ስ (XSS)) ለመቀነስ የ‘ጣሰስ_የውሂብውሂብ_መለያ (csp_meta_tag
) ዘዴን ሲተገብር ወደ አፕልኬሽኑ የሚመጡ ጣቢያ ሰበር የማጪበርበር መጠይቆችን (cross-site request forgery) (ጣ.ሰ.ማ.መ (CSRF)) ለመከላከል ደግሞ የ‘ጣሰማመ_የውሂብውሂብ_መለዮዎች (csrf_meta_tags
) ዘዴን ይተገብራል፡፡ (እንደ ሬይልስ ያለ የበሰለ መዋቅርን የመጠቀም አንዱ ትልቅ ጥቅም እንደዚህ ያሉ ነገሮች ላይ ከመጨነቅ ማዳኑ ነው፡፡)
ምንም እንኳን ፈተናወቹ በሙሉ የሚያልፉ ቢሆንም፤ አንድ መደረግ የሚገባው ነገር ግን አለ፤ በዝርዝር 3.33 ፣ በዝርዝር 3.35 እና በዝርዝር 3.36 ያሉት ትይታወች፣ ገጽታውን ጨምሮ ሁሉም በሃ.ጽ.መ.ቋ መዋቅር ተሞልተዋል። እሱም ከመጠን በላይ የተደጋገመ ስለሆነ (እና በእርግጥም ብቃት ወደለለው የሃ.ጽ.መ.ቋ ንቅሳት ስለሚያመራ) የውስጥ ይዘታዎቹን ብቻ በመተው እሱን ማስወገድ አለብን፡፡ ይህንን በማድረጋችን ምክንያት የጸዱት ትይታወች፣ በዝርዝር 3.38 ፣ በዝርዝር 3.39 እና በዝርዝር 3.40 ውስጥ ይታያሉ፡፡
app/views/quami_getss/menesha.html.erb
<% provide(:title, "መነሻ") %>
<h1>ማሳያ አፕልኬሽን</h1>
<p>
ይህ <a href="https://www.railstutorial.org/">
የሩቢ ኦን ሬይልስ ስልጠና </a>
ማሳያ ለተባለው አፕልኬሽን፡ የመነሻ ገጽ ነው፡፡
</p>
app/views/quami_getss/erdata.html.erb
<% provide(:title, "እርዳታ") %>
<h1>እርዳታ</h1>
<p>
በሩቢ ኦንሬይልስ ስልጠና ላይ እርዳታን፡ ለማግኘት
<a href="https://www.railstutorial.org/help">የሩቢ ኦንሬይልስ ስልጠና እርዳታ ገጽን</a>
ቃኙ። በዚህ የማሳያ አፕልኬሽን ላይ እርዳታን፡ ለማግኘት
<a href="https://www.railstutorial.org/book"><em>
የሩቢ ኦንሬይልስ ስልጠና</em> መጽሐፍን</a> ተመልከቱ።
</p>
app/views/quami_getss/silegna.html.erb
<% provide(:title, "ስለኛ") %>
<h1>ስለኛ</h1>
<p>
<a href="https://www.railstutorial.org/"><em>የሩቢ ኦን ሬይልስ ስልጠና፡</em></a>
በ <a href="https://www.learnenough.com/">በበቂ ተማር</a>
ስልጠናወች ውስጥ የሚገኝ አካል እና፣
<a href="https://rubyonrails.org/">በሩቢ ኦንሬይልስ</a>
ድር ማበልጸግን የሚያስተምር
<a href="https://www.railstutorial.org/book">የመጽሐፍ</a>
እና <a href="https://screencasts.railstutorial.org/">ተከታታይ የቪዲዮ</a>
ስልጠና ነው፡፡ ይህ የስልጠናው ማሳያ አፕልኬሽን ነው።
</p>
እነዚህ ትይታወች ከተበየኑ በኋላ የመነሻ፣ የእርዳታ እና ስለኛ ገጾቹ ከዚህ በፊት ከነበረው ይዞታቸው ጋር ሲነጻጸሩ በይዞታቸው ፍጹም አንድ ዓይነት ሲሆኑ፤ ያላቸው ድግግሞሽ ግን በጣም ትንሽ ነው።
ተሞክሮ እንደሚያሳየው፣ በጣም ትንሽ ማጣራት እንኳን ለስህተት የሚጋለጥ እና በቀላሉ ከቁጥጥር ውጪ ለሆነ ችግር እንደሚያጋልጥ ነው። አንድ ጥሩ የፈተና ስብስብ መኖሩ በጣም አስፈላጊ የሆነበት አንዱ ምክንያትም ለዚህ ነው። እያንዳንዱ ገጽ ትክክል መሆኑን አንድ ባንድ ከማረጋገጥ ይልቅ፣ (በአሁኑ ጊዜ እያንዳንዱ ገጽ ትክክል መሆኑን አንድ በአንድ ማረጋገጡ አስቸጋሪ ባይሆንም አፕልኬሽኑ አያደገ ሲመጣ ግን ሂደቱ የማያዛልቅ ይሆናል) የፈተና ስብስቡ አሁንም አረንጓዴመሆኑን በቀላሉ ማረጋገጥ እንችላለን:-
$ rails test
3 tests, 6 assertions, 0 failures, 0 errors, 0 skips
ይህ የእኛ ኮድ አሁንም ትክክል ለመሆኑ ማረጋገጫ አይደለም፣ ነገር ግን ትክክል የመሆን ዕድሉን በእጅጉ ከፍ ያደርገዋል፣ በዚህም ወደፊት ከሚመጡ ስንኮች የሚጠብቀን አንድ የደህንነት ጋሻን ይሰጠናል።
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
app/views/quami_getss/agignun.html.erb
<% provide(:title, "አግኙን") %>
<h1>አግኙን</h1>
<p>
ማሳያ አፕልኬሽኑን በተመለከተ፡ በሩቢ ኦን ሬይልስ ስልጠና፡
<a href="https://www.railstutorial.org/contact">አግኙን ገጽ</a>
በኩል ልትገናኙን ትችላላችሁ፡፡
</p>
አሁን የጣቢያችንን ገጾች ስላበጀን እና በፈተና ስብስቡ ላይ አንድ ጥሩ ጅማሬን ስላገኘን፣ ከመቀጠላችን በፊት እስኪ የአፕኬሽኑን ስረ ማዘዋወርያ እናዘጋጅ። ልክ እንደ ክፍል 1.2.4 እና ልክ እንደ ክፍል 2.2.2 ከመረጥነው ገጽ ጋር ይህንን ምልክት:- / ለማገናኘት የማዘዋወሪያዎች (routes.rb
) ፋይልን ማረምን ያሳትፋል፤ በዚህ ሁኔታ ላይ ምርጫችን የመነሻ ገጹ ይሆናል። (በዚህ ጊዜ በክፍል 3.1 ላይ በአፕልኬሽን መቆጣጠሪያው ውስጥ የጨመራችሁትን የ‘ሰላምታ (selamta
) ተግባር እንድታስወግዱ አሳስባለሁ።) በዝርዝር 3.43 ውስጥ እንደታየው ማለት የ‘ስር (root
) ማዘዋወርያውን ከ፡-
root 'application#selamta'
ወደ
root 'quami_getss#menesha'
መለወጥ ነው። ይህ የዚህ ምልክት:- / መጠይቆችን ለ‘መነሻ (menesha
) እንዲተላለፍ ያዘጋጃል። የተገኘው የማዘዋወሪያ ፋይል በምስል 3.10 ውስጥ ይታያል።
config/routes.rb
Rails.application.routes.draw do
root 'quami_getss#menesha'
get 'quami_getss/menesha'
get 'quami_getss/erdata'
get 'quami_getss/silegna'
end
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
root_url
) የተባለ የሬይልስ ረጅ ዘዴን ወደመፍጠር ይመራል (ማለት እንደዚህ ዓይነት ተመሳሳይ ረጅን ይፈጥራል quami_getss_home_url
)፡፡ በዝርዝር 3.44 ውስጥ ያለውን ይህን_ሙሉ
የሚለው ቃልን በተገቢው ኮድ በመሙላት፣ ለስረ ማዘዋወርያው አንድ ፈተና ጻፉ፡፡
test/controllers/quami_getss_controller_test.rb
require 'test_helper'
class QuamiGetssControllerTest < ActionDispatch::IntegrationTest
test "ስረ ማዘዋወርያን ማግኘት አለበት" do
get ይህን_ሙሉ
assert_response ይህን_ሙሉ
end
test "መነሻ ገጽን ማግኘት አለበት" do
get quami_getss_menesha_url
assert_response :success
end
test "እርዳታ ገጽን ማግኘት አለበት" do
get quami_getss_erdata_url
assert_response :success
end
test "ስለኛ ገጽን ማግኘት አለበት" do
get quami_getss_about_url
assert_response :success
end
end
config/routes.rb
Rails.application.routes.draw do
# root 'quami_getss#menesha'
get 'quami_getss/menesha'
get 'quami_getss/erdata'
get 'quami_getss/silegna'
end
ይህ ምዕራፍ ከውጪ ሲታይ ይህንን አከናውኗል ለማለት ያስቸግራል፣ በቋሚ ገጾች ጀምረን በአብዛኛው በሚለዋወጡ ገጾች ጨርሰናል። ነገር ግን አቀራረቦቹ የሚያታልሉ ናቸው፤ የሬይልስ መቆጣጠሪያወች፣ ተግባሮች እና ትይታወችን በማበልጸግ አንጻር አሁን የፈለግነውን ያህል ተለዋዋጪ ይዞታዎች በጣቢያችን ላይ ለማከል የሚያስችል አንድ ችሎታ አለን፡፡ ይህ እንዴት እንደሚሆን ማሳየቱ የዚህ ስልጠና ቀሪ ስራው ይሆናል።
ከመቀጠላችን በፊት ለውጦቹን ወደ ርእስ ቅርንጫፉ ለመቀላቀል አንድ ደቂቃ እንወስድ እና ክዚያ ወደ ዋና ቅርንጫፉ እናዋህዳቸው። ከዚህ በፊት ክፍል 3.2 ላይ ቋሚ ገጾችን ለማበልጸግ አንድ የጊት ቅርንጫፍ ፈጥረናል። በጉዟችን ላይ ምንም ዓይነት መቀላቅሎችን ካላደረጋችሁ፣ መጀመሪያ አንድ ማቆሚያ ቦታ ላይ እንደደረስን የሚያመለክት አንድ መቀላቀል አድርጉ፡-
$ git add -A
$ git commit -m "ቋሚ ገጾችን ማጠናቀቅ"
ከዚያ በክፍል 1.3.4 ውስጥ የተጠቀምንበትን ዘዴ በመጠቀም፣ ለውጦቹን ወደ ዋና ቅርንጫፉ መልሳችሁ አዋህዷቸው:-18
$ git checkout main
$ git merge ቛሚ-ገጾች
አንድ ጊዜ እንደዚህ ያለ የማቆሚያ ነጥብ ላይ ከደረሳችሁ፣ ኮዳችሁን ወደ አንድ ሩቅ ማከማቻ መግፋቱ አንድ ጥሩ ሃሳብ ነው (ይህም በክፍል 1.3.3 ውስጥ ያሉትን ቅደም ተከተሎች ከተከተላችሁ ጊትሃብ ይሆናል ማለት ነው)፡-
$ git push
እንዲሁም አፕልኬሽኑን ወደ ሃረኩ እንድታሰማሩት እመክራለሁ:-
$ rails test
$ git push heroku
እዚህ ጋር አፕልኬሽኑን ከማሰማራታችን በፊት የፈተና ስብስቡን አስኪደናል፣ ይህም አፕልኬሽንን በማበልጸግ ጊዜ ሊዘወተሩ ከሚገባቸው ጥሩ ልምዶች ውስጥ አንዱ ነው።
የ‘ሃረኩ አፕ:መረጃ (heroku apps:info
) ትእዛዝን በማስኬድ (ዝርዝር 1.27) የሃረኩ አፕልኬሽናችሁን የድር ዓ.አ.ሃ.አ ማግኘት እንደምትችሉ በክፍል 1.4.1 ውስጥ ተመልክታችኋል፡፡ እሱም በነባሪነት አንድ herokuapp.com የሚል ንዑስ-ግዝአትን ጨምሮ የያዘ ነው (እሱም ይህንን ይመስላል:- mysterious-atoll-47182.herokuapp.com)፡፡ herokuapp.com የሚል ቅጥል ስም ያለው የድር አድራሻ በመጠቀም ድራችሁን ከማስተናገድ ይልቅ፣ አንድ ብጁ ግዝአትን በመጠቀም ድራችሁን በሃረኩ ጣቢያ ላይ እንዴት ማስተናገድ እንደምትችሉ ለማወቅ ማለት ስለዚህ ጉዳይ የነጻ ትምህርት ለማግኘት በብጁ ግዝአት ላይ መሰረታዊ እውቀትን ለማግኘት የሚያስፈልገውን ተማርን ጎብኙ፡፡
config/routes.rb
) ፋይል ውስጥ እንደሚበየኑ፣
rails
) ትእዛዝ rails generate controller የመቆጣጠሪያስም (ControllerName) <አማራጪ የተግባር ስሞች >
አንድ አዲስ መቆጣጠሪያን እንደሚያመነጪ፣
ይህ በምርጫ ሊደረግ የሚችል ክፍል በሩቢ ኦንሬይልስ ስልጠና የቪድዮ ስልጠና ውስጥ ጥቅም ላይ የዋለውን የፈተና መዋቅርን ያብራራል። እዚህ ላይ ሁለት ዋና ነገሮች አሉ፤ እነሱም:- አንድ የተሻሻለ የማለፍ/የውድቀት ዘጋቢ (ክፍል 3.6.1)፤ እና የፋይል ለውጦችን የሚለይ እና ተጓዳኝ ፈተናወችን በራስሰር የሚያስኬድ አንድ ራስሰሬ ፈተና አካሂያጅ ናቸው። (ክፍል 3.6.2)። በዚህ ክፍል ውስጥ ያለው ኮድ የመጠቀ እና ፈተናወችን ለመፈተን ምቹ ለማድረግ ብቻ የቀረበ ነው፤ በዚህ ጊዜ ይህን እንድትረዱት አይጠበቅባችሁም።
በዚህ ክፍል የሚደረጉ ለውጦች በዋና ቅርንጫፉ ላይ መደረግ አለባቸው:-
$ git checkout main
ምንም እንኳን የደመና ቅ.ማ.አን ጨምሮ ብዙ ስርዓቶች ለቀይ እና ለአረንጓዴ የፈተና ስብስቦች ተገቢዎቹን ቀለሞች ቢያሳዩም የሚኒቴስት ሪፖርተርስ እንቁን በፈተና ስርዓት ውስጥ ማከሉ ግን በፈተናው ውጽዓቶች ላይ በተወሰነ መልኩ ደስ የሚያሰኝ መልክን ይሰጣል፤ ስለዚህ በዝርዝር 3.46 ውስጥ ያለውን ኮድ በቴስት ሃልፐር ፋይላችሁ 19 ውስጥ እንድታክሉት እመክራለሁ፤ በዚህ ምክንያትም አፕልኬሽናችሁ በዝርዝር 3.2 ውስጥ የተካተተውን ማለት የ minitestreporters
እንቁን ይጠቀማል ማለት ነው።
test/test_helper.rb
ENV['RAILS_ENV'] ||= 'test'
require_relative '../config/environment'
require 'rails/test_help'
require "minitest/reporters"
Minitest::Reporters.use!
class ActiveSupport::TestCase
# Run tests in parallel with specified workers
parallelize(workers: :number_of_processors)
# Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
fixtures :all
# Add more helper methods to be used by all tests here...
end
በደመና ቅ.ማ.አ ውስጥ ከ ቀይ ወደ አረንጓዴ የተደረገው የሽግግር ውጤት በምስል 3.11 ላይ ይታያል፡፡
የ‘ሬይልስ ፈትን (rails test
) ትእዛዝን ከመጠቀም ጋር የተቆራኘ አንድ ደባሪ ነገር ቢኖር፣ ወደ ማዘዥያ መስመሩ መሄድ እና ፈተናወችን በእጅ ማስኬድ ነው፡፡ ይህንን ችግር ለማስወገድ፣ የፈተናወቹን አካሄድ ራስሰሬ ለማድረግ ጋርድን (Guard) መጠቀም እንችላለን፡፡ ጋርድ በፋይል ስርዓቱ ውስጥ ለውጦችን ይከታተላል፤ ለምሳሌ በ‘/ቋሚ_ገጾች_መቆጣጠሪያ_ፈተና.አርቢ (quami_getss_controller_test.rb
) ፋይል ላይ የሆነ ለውጥ ብናደርግ፣ እነዚያ ፈተናወች ብቻ ይሄዳሉ። ከዚያ በበለጠ ደግሞ ለምሳሌ፣ የ‘መነሻ.ሃጽመቋ.ክሩ (menesha.html.erb
) ፋይል ሲሻሻል፣ /ቋሚ_ገጾች_መቆጣጠሪያ_ፈተና.አርቢ (quami_getss_controller_test.rb
) በራስሰር እንዲሄድ ለማድረግ፣ ጋርድን ማዋቀር እንችላለን፡፡
በዝርዝር 3.2 ውስጥ ያለው የ‘እንቁፋይል (Gemfile
) ቀድሞውኑ የ‘ጋርድ (guard)
እንቁን በአፕልኬሽናችን ውስጥ አካቷል፤ ስለዚህ ስራውን ለማስጀመር እሱን ማስጀመር ይኖርብናል፡-
$ bundle _2.2.17_ exec guard init
Writing new Guardfile to /home/ec2-user/አካባቢ/masaya/Guardfile
00:51:32 - INFO - minitest guard added to Guardfile, feel free to edit it
በመቀጠል የውህደት ፈተናወች እና ትይታወች በሚዘመኑበት ጊዜ ጋርድ ትክክለኛ ፈተናወችን እንዲያስኬድ፣ የ‘ጋርድፋይል (Guardfile
) ውጤትን እናርማለን፣ የተዘመነው ፋይልም በዝርዝር 3.47 ውስጥ ያለውን ይመስላል፡፡ የሚፈለገውን ውጤት ለማግኘት፣ በአፕልኬሽኑ ማጣቀሻ ውስጥ የተዘረዘውን የ‘ጋርድፋይል (Guardfile
) ስሪትን እንድትጠቀሙ እመክራለሁ፤ ይህንን በመስመር ላይ እያነበባችሁ ከሆነ፣ በዝርዝር 3.47 ወስጥ ካለው ጋር ፍጹም አንድ ዓይነት መሆን አለበት:-
Guardfile
) ማጣቀሻ በ railstutorial.org/guardfile ላይ ይገኛል።
ማሳሰቢያ:- የ‘ጋርድፋይሉ (Guardfile
) የአማርኛ ትርጉም ያካተተውን ፈተና ያስኬድልን ዘንድ፣ የአማርኛ ትርጉሙ የተጠቀመበትን የፈተና ኮዶች በጋርድ ፋይል ውስጥ እንዳከልናቸው ልትገነዘቡ ይገባል።
Guardfile
)።
require 'active_support/core_ext/string'
# ለጋርድ ተዛማጅ ደንቦችን ይበይናል።
guard :minitest, spring: "bin/rails test", all_on_start: false do
watch(%r{^test/(.*)/?(.*)_test\.rb$})
watch('test/test_helper.rb') { 'test' }
watch('config/routes.rb') { interface_tests }
watch(%r{app/views/layouts/*}) { interface_tests }
watch(%r{^app/models/(.*?)\.rb$}) do |matches|
"test/models/#{matches[1]}_test.rb"
end
watch(%r{^app/controllers/(.*?)_controller\.rb$}) do |matches|
resource_tests(matches[1])
end
watch(%r{^app/views/([^/]*?)/.*\.html\.erb$}) do |matches|
["test/controllers/#{matches[1]}_controller_test.rb"] +
integration_tests(matches[1])
end
watch(%r{^app/helpers/(.*?)_helper\.rb$}) do |matches|
integration_tests(matches[1])
end
watch('app/views/layouts/application.html.erb') do
'test/integration/site_layout_test.rb'
end
# ለአማርኛው ስሪት ተዛማጅ ደንቦችን ይበይናል።
watch('app/views/layouts/application.html.erb') do
'test/integration/tabya_getsta_test.rb'
end
watch('app/helpers/sessions_helper.rb') do
integration_tests << 'test/helpers/sessions_helper_test.rb'
end
watch('app/controllers/sessions_controller.rb') do
['test/controllers/sessions_controller_test.rb',
'test/integration/users_login_test.rb',
# ለአማርኛው ስሪት ተዛማጅ ደንቦችን ይበይናል።
'test/integration/teteqamis_gba_test.rb']
end
watch('app/controllers/account_activations_controller.rb') do
'test/integration/users_signup_test.rb'
end
# ለአማርኛው ስሪት ተዛማጅ ደንቦችን ይበይናል።
watch('app/controllers/meleya_magberyas_controller.rb') do
'test/integration/teteqamis_temezgeb_test.rb'
end
watch(%r{app/views/users/*}) do
resource_tests('users') +
['test/integration/microposts_interface_test.rb']
end
# ለአማርኛው ስሪት ተዛማጅ ደንቦችን ይበይናል።
watch(%r{app/views/teteqamis/*}) do
resource_tests('teteqamis') +
['test/integration/achrtshufs_beynegets_test.rb']
end
end
# ከተሰጠው ሃብት ጋር የሚዛመዱ የውህደት ፈተናዎችን ይመልሳል።
def integration_tests(resource = :all)
if resource == :all
Dir["test/integration/*"]
else
Dir["test/integration/#{resource}_*.rb"]
end
end
# በይነገጹን የመቱትን ፈተናዎችን ሁሉ ይመልሳል።
def interface_tests
integration_tests << "test/controllers/"
end
# ከተሰጠው ሃብት ጋር የሚዛመዱ የመቆጣጠሪያ ፈተናዎችን ይመልሳል።
def controller_test(resource)
"test/controllers/#{resource}_controller_test.rb"
end
# ለተሰጠው ሃብት ሁሉንም ፈተናዎች ይመልሳል።
def resource_tests(resource)
integration_tests(resource) << controller_test(resource)
end
በደመና ቅ.ማ.አ ላይ፣ አንድ መወሰድ የሚገባው ተጨማሪ ሂደት አለ፤ እሱም ጋርድ በፕሮጀክቱ ውስጥ ያሉትን ሁሉንም ፋይሎች ለመቆጣጠር የሚያስችለውን፣ የሚከተሉትን ግልጽ ያልሆኑ ትእዛዞችን ማስኬድ ነው:-
$ echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf
$ sudo sysctl -p
አንድ ጊዜ ጋርድ ከተዋቀረ፣ አንድ አዲስ መናኸሪያ ላይ የሚከተለውን ትእዛዝ አስኪዱ (ምስል 3.12) (በክፍል 1.2.2 ውስጥ ልክ የሬይልስ ድር አገልጋይን ለማስኬድ ተጠቅመንበት እንደነበረው ዓይነት ማለት ነው):-
$ bundle _2.2.17_ exec guard
በዝርዝር 3.47 ውስጥ ያሉት ደንቦች ለዚህ ስልጠና የተመቻቹ ደንቦች ናቸው፣ ማለት በአንድ መቆጣጠሪያ ላይ አንድ ለውጥ በሚደረግበት ጊዜ፣ የውህደት ፈተናወችን በራስሰር ያስኬዳል። ሁሉንም ፈተናወች ለማስኬድ፣ የተመለስ ቁልፍን የ‘ guard>
መቀበያ ላይ ብቻ ምቱ፡፡
ከጋርድ ለመውጣት፣ “ተቆር-ዲን (Ctrl-D)” ተጫኑ። በጋርድ ላይ ተጨማሪ ተዛማጆችን ለማከል፣ በዝርዝር 3.47 ውስጥ፣ በጋርድ አንብቡኝ እና በጋርድ ዊኪ ላይ ያሉት ምሳሌዎች ላይ ተጣቀሱ፡፡
የፈተና ስብስቡ ያለ ምንም ምክንያት ሳይጀምር ከቀረ፣ ከጋርድ ውጡ፣ ስፕሪንግን አቁሙ እና እንደገና አስጀምሩት (ስፕሪንግ:- ሬይልስ ፈተናወችን ለማፋጠን የሚያግዝ መረጃዎችን ቀድሞ ለመጫን የሚጠቀምበት እንቁ ነው):-
$ bin/spring stop # ፈተናወቹ ባልታወቀ ምክንያት መጀመር ካልቻሉ ይህንን ትእዛዝ ሞክሩ፡፡
$ bundle _2.2.17_ exec guard
ከመቀጠላችሁ በፊት ለውጦቻችሁን ማከል እና መቀላቀል አለባችሁ:-
$ git add -A
$ git commit -m "የላቀ ፈተና መዋቅሩን ማጠናቀቅ"
Gemfile
) እና እንቁ.ቆልፍ (Gemfile.lock
) የተባሉ ተዛማጅ ፋይሎች ስላሉት ነው። ስለዚህ ከመቀጠላችሁ በፊት፣ የመጀመሪያዎቹን ሁለት አፕልኬሽኖች ማስወገድ ያስፈልጋችሁ ይሆናል፤ ይህንን ለማድረግ የምትችሉት ደግሞ ወደ አካባቢ
ማውጫ በመሄድ እና ከዚያ የ rm -rf selamta/ chewata/
ትእዛዝን በማስኬድ ይሆናል (ሰንጠረዥ 1.1)። (ተዛማጆቹን ማከማቻዎች ወደ ጊትሃብ እስከገፋችሁ ድረስ፣ በፈለጋችሁበት ጊዜ ማከማቻችሁን መልሳችሁ ማግኘት ትችላላችሁ።)–local without 'production'
) ትእዛዝ “የ‘ታወሰ ምርጫ (remembered option)”መሆኑን ማወቁ ጥሩ ነው፤ ይህ ማለትም ለሚቀጥለው ጊዜ የ‘ጠቅል ጫን (bundle install
) ትእዛዝን በምናስኬድበት ወቅት እሱ በራስሰር አብሮ ይካተታል ማለት ነው።high_voltage
የተባለውን እንቁ ተመልከቱ።rails
) የተባለውን ትእዛዝ ለማሳጠር ( በ በጽሑፍ አርታኢ ላይ መሰረታዊ እውቀትን ለማግኘት የሚያስፈልገውን ተማር ላይ እንደተገለጸው) ሬ (r
) የተባለ ተለዋጪ ስምን ይጠቀማሉ። ይህ ደግሞ የሬይልስ ድር አገልጋይን ለማስኬድ ሬ አ (r s
) ብለን እንድንጽፍ ያስችለናል ማለት ነው።rails test
) ትእዛዝ ፈተናወች ሲወድቁ በቀይ የተጻፉ የፈተና ውጤቶችን ያሳያል፤ ነገር ግን ፈተናወች ሲያልፉ በአረንጓዴ የተጻፉ የፈተና ውጤቶችን አያሳይም። ትክክለኛውን የቀይ–አረንጓዴ ዑደትን ለማስተካከል ክፍል 3.6.1 ‘ን ተመልከቱ።<!DOCTYPE html>
የ‘ሃ.ጽ.መ.ቋ5 (HTML5) ዘመናዊው የሃ.ጽ.መ.ቋ ሰነድ መስፈርት ነው፡፡content_for
) የተባለውን ሥልት ለመጠቀም ተስፋ አድርገው ይሆናል። ነገር ግን እሱ በንብረት ቧንቧመስመር (asset pipeline) ላይ በትክክል አይሰራም። እሱን የሚተካው ሥልት አቅርብ (provide
) ነው።rm -f *.pid
ትእዛዝ በመጠቀም ያለውን ችግር ማስወገድ ትችላላችሁ፡፡ በነገራችን ላይ ስፕሪንግ ሬይልስ ፈተናወችን ለማፋጠን የሚያግዝ መረጃዎችን ቀድሞ ለመጫን የሚጠቀምበት እንቁ ነው።rails new
) ትእዛዝ በነጠላ ትምህርተ ጥቅስ ውስጥ የገቡ ሃረጎችን ስላመነጨ እና የሚኒቴስት ሪፖርተርስ እንቁ በስነዳው ላይ በድርብ ትምህርተ ጥቅስ ውስጥ የገቡ ሃረጎችን ስለሚጠቀም ነው። እንደዚህ ዓይነት የመቀላቀል ተግባር በሩቢ ውስጥ የተለመደ ባህሪ ነው፡፡ ለበለጠ መረጃ ክፍል 4.2.1 ‘ን ተመልከቱ፡፡