ምዕራፍ 3 በአብዛኛው የማይለዋወጡ ገጾች

በዚህ ምዕራፍ ውስጥ፣ በቀሪው በዚህ ስልጠና በሙሉ፣ እንደ ምሳሌነት የሚያገለግለንን፣ ሞያዊ ደረጃ ያለው የማሳያ አፕልኬሽንን በማበልጸግ እንጀምራለን፡፡ ምንም እንኳን የማሳያ አፕልኬሽኑ በመጨረሻ የተጠቃሚዎች፣ የአጪርጽሑፎች እና አንድ የተሟላ የመግቢያ እና የማረጋገጫ መዋቅር ቢኖረውም፣ እኛ ግን አንድ ቀለል ባለ ርዕስ እንጀምራለን፤ የምንጀምረውም በቛሚ ገጾች አፈጣጠር ይሆናል። ይህም ለጨቅላው አፕልኬሽናችን አንድ ጥሩ ጅማሬ ይሆናል። ምንም እንኳ ቛሚ ገጾችን መፍጠሩ ቀላል ቢመስልም፣ እነሱን መስራቱ ግን እጅግ አስተማሪ የሆነ መልመጃ ይሆናል።

ሬይልስ በመሰረቱ የተነደፈው፣ በውሂበጎታ-የተደገፉ የሚቀያየሩ ድረ-ጣባዎችን ለመስራት ቢሆንም፤ በጥሬ የሃ.ጽ.መ.ቋ ፋይሎች፣ መፍጠር የምንችለውን ቛሚ ገጾች በመስራትም ትልቅ ሚና ይጫወታል። በእርግጥም፣ ሬይልስን ለቛሚ ገጾች መጠቀም፣ አንድ የተለየ ጥቅምን ያስገኛል፡- ይህም ጥቂት መቀያየር የሚችሉ ይዞታዎችን፣ በቀላሉ መጨመር ማስቻሉ ነው። በዚህ ምዕራፍ ይህን እንዴት ማድረግ እንደምንችል እንማራለን። በጉዟችንም፣ የመጀመርያችንን ራስ ፈትኔ የተባለውን ፈታና እንቋደሳለን፣ ይህም የኛ ኮድ ትክክል እንደሆነ፣ የበለጠ እርግጠኞች እንድንሆን ይረዳናል። ከዚህም በላይ፣ አንድ ጥሩ የፈተና ስብስብ መኖሩ፣ የኮዳችን ሥልትን ሳይቀይር ቅርጸቱን ብቻ እንደሚለውጠው በመተማመን ኮዱን እንድናጣራ ያስችለናል።

3.1 የማሳያ አፕልኬሽንን ማዋቀር

ልክ እንደ ምዕራፍ 2 ስራ ከመጀመራችን በፊት አንድ አዲስ የሬይልስ ፕሮጀክትን መፍጠር ይኖርብናል። በዚህ ጊዜም ማሳያ (masaya) በመባል ይታወቃል። ይህም በዝርዝር 3.1 ውስጥ ይታያል። 1

ዝርዝር 3.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 ላይ የተዘረዘሩትን እንቁዎች መጠቀም ይኖርባችኋል (ምንም እንኳን ተመሳሳይ እንቁዎች ቢመስሉም)፡፡

ዝርዝር 3.2: ለማሳያ አፕልኬሽኑ የሚሆን አንድ የ‘እንቁፋይል (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 ውስጥ የለሉ ተጨማሪ የላቁ መረጃወችን ያካትታል።

ዝርዝር 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
images/figures/create_sample_app_repository
ምስል 3.1: በጊትሃብ ላይ፣ ለዋናው የማሳያ አፕልኬሽን አንድ ማከማቻን መፍጠር።

የደመና ቅ.ማ.አን እየተጠቀማችሁ ከሆነ፣ አፕልኬሽኑ በሰፈር የድር አገልጋይ ላይ ይስተናገድ ዘንድ፣ እንደቀድሞዎቹ ሁለት ምዕራፎች ሁሉ የ‘ምርት.አርቢ (development.rb) ፋይሉን በማረም አፕልኬሽኑን ማዘጋጀት ይኖርባችኋል (ዝርዝር 3.4)፡፡

ዝርዝር 3.4: ከሰፈር የድር አገልጋይ ጋር ግንኙነቶችን መፍቀድ። config/environments/development.rb
Rails.application.configure do
  .
  .
  .
  # ከሰፈር አገልጋይ ጋር ግንኙነቶችን መፍቀድ።
  config.hosts.clear
end

ማሳሰቢያ:- የክላውድ9 አካባቢዎች በቂ የዲስክ ቦታ እንደማይኖራቸው አንዳንድ ዘገባወች ደርሰውኛል። በቂ የዲስክ ቦታ እንደለለ የሚያመለክት አንድ የስህተት መልእክት ካገኛችሁ፣ በአካባቢያችሁ ላይ ተጨማሪ ቦታ ለማከል፣ በዝርዝር 1.5 ውስጥ የተመለከተውን ትእዛዝ እንድታስኬዱ ሀሳቤን አቀርባለሁ፡፡

በኋላ የሚመጣውን የአፕልኬሽን ውህደት አለመጣጣምን ለመከላከል ያህል፣ በዚህ ገና በሆነ ደረጃም ቢሆን፣ አፕልኬሽኑን ወደ ሃረኩ ማሰማራቱ አንድ ጥሩ ሃሳብ ነው። ልክ እንደ ምዕራፍ 1 እና ምዕራፍ 2ዝርዝር 1.13 እና ዝርዝር 1.14 ውስጥ የ “ዓለም እንዴት ነሽ!” ሂደቶችን እንድትከተሉ አሳስባለሁ። (ለዚህ ዋነኛው ምክንያት፣ ነባሪው የሬይልስ ገጽ በተለምዶ በሃረኩ ላይ ስለሚሰበር ነው፤ ይህም አፕልኬሽኑን ማሰማራቱ የተሳካ እና ያልተሳካ መሆኑን ለማወቅ አዳጋች ያደርገዋል፡፡)

ዝርዝር 3.5: በአፕልኬሽን መቆጣጠሪያው ውስጥ አንድ የ‘ሰላምታ (selamta) ተግባርን ማከል። app/controllers/application_controller.rb
class ApplicationController < ActionController::Base

  def selamta
    render html: "ዓለም እንዴት ነሽ!"
  end
end
ዝርዝር 3.6: ስር ማዘዋወርያውን ማቀናበር። 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 ውስጥ ለምርት ድርአገልጋይ መደረግ የሚገባውን መዋቅር መከተላችሁን አረጋግጡ።

መልመጃዎች

የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።

የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡

  1. ጊትሃብ በዝርዝር 3.3 ያለውን የአንብበኝ ማርክዳውንን ወደ ሃ.ጽ.መ.ቋ ቀይሮ እንዳቀረበው አረጋግጡ (ምስል 3.2)፡፡
  2. አፕልኬሽናችሁን በሃረኩ ላይ ማሰማራታችሁ የተሳካ መሆኑን ለማረጋገጥ፣ በምርት ድርአገልጋይ ላይ ስረ ማዘዋወርያውን ጎብኙ።
images/figures/sample_app_readme
ምስል 3.2: በጊትሃብ ላይ የማሳያ አፕልኬሽኑ የአንብበኝ ገጽ።

3.2 ቛሚ ገጾች

ክፍል 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 ላይ በአጪሩ እንደተመለከተው፣ የስሪት ቁጥጥርን በምትጠቀሙበት ጊዜ በርካታ ማቀላቀሎችን ማድረጉ አንድ ጥሩ ሀሳብ እንደሆነ ነው፡፡ ገለጻው አሰልቺ እንዳይሆን ለማድረግ፣ ጽሑፉ ራሱ በእያንዳንዱ ምዕራፍ መጨረሻ ላይ አንድ ማቀላቀልን ብቻ ያካትታል፣ ጥሩው መመሪያ ግን በአብዛኛዎቹ ክፍሎች (ወይም በአብዛኛዎቹ ንዑስ-ክፍሎች) መጨረሻ ላይ ማቀላቀሎችን ማድረግ ይሆናል፡፡

3.2.1 የመነጩ ቛሚ ገጾች

የቛሚ ገጾች ስራን ለመጀመር፣ በመጀመሪያ በምዕራፍ 2 ላይ መወጣጫን ለማመንጨት የተጠቀምንበትን፣ የሬይልስ የ‘አመንጪ (generate) ትእዛዝን በመጠቀም፣ አንድ መቆጣጠሪያን እናመነጫለን፡፡ ቛሚ ገጾችን ለማስተናገድ አንድ መቆጣጠሪያ ስለምንሰራ Quami Getss Controller ብለን እንጠራዋለን፤ ይህ ቋሚገጾችም (QuamiGetss) ቅርጸ-ግመል (CamelCase) ተብሎ በሚጠራው የአጻጻፍ ዘዴ የተዘጋጀ ስም ነው (ለበለጠ መረጃ በምስል 3.3 ላይ የተሰጠውን ስእላዊ መግለጫ ተመልከቱ)። በተጨማሪም በንዑስ ፊደላት የተዘጋጁ፣ ሶስት ተግባሮችን አብረን እናካትታለን፣ እነሱም:- ለመነሻ ገጹ የ‘መነሻ (menesha) ተግባር፣ ለእርዳታ ገጹ የ‘እርዳታ (erdata) ተግባር እና ለስለኛ ገጹ ደግሞ የ‘ስለኛ (silegna) ተግባር ይሆናሉ። የሬይልስ የ‘አመንጪ (generate) ትእዛዝ፣ አንድ የተግባሮች ዝርዝር አማራጪን ይወስዳል፤ ስለዚህ የመነሻ ገጽን እና የእርዳታ ገጽ ተግባሮችን ለመስራት፣ እነሱን በማዘዥያ መስመሩ ላይ በቀጥታ እናካትት እና ስለኛ ገጽን ግን ሆን ብለን እንተወዋለን፤ ስለሆነም በክፍል 3.3 ላይ እሱን እንዴት አድርገን ማካተት እንደምንችል ለማየት ይረዳናል። የቋሚ ገጾች መቆጣጠሪያውን የሚያመነጨው ትእዛዝ፣ በዝርዝር 3.7 ላይ ተመልክቷል።

ዝርዝር 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
ሰንጠረዥ 3.1: ከሬይልስ አቋራጮች ውስጥ ጥቂቶቹ።
images/figures/coding_cases
ምስል 3.3: ቅርጸ ግመል እና ቅርጸ እባብ የተባሉትን የአጻጻፍ ስልቶች የሚያሳይ ስእላዊ መግለጫ።

ከመቀጠላችን በፊት፣ ጊትን እየተጠቀማችሁ ከሆነ፣ የቋሚ ገጾች መቆጣጠሪያውን ወደ ሩቁ ማከማቻ ማከሉ አንድ ጥሩ ሃሳብ ነው፡-

$ 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.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)።

images/figures/config_directory
ምስል 3.4: የማሳያ አፕልኬሽን የ‘አዋቅር (config) ማውጫ ይዞታዎች።

ዝርዝር 3.7 ውስጥ የ‘መነሻ (menesha) እና የ‘እርዳታ (erdata) ተግባሮችን ስላካተትን፣ በዝርዝር 3.8 ውስጥ እንደሚታየው፣ የማዘዋወርያዎች ፋይል ቀድሞውኑ ለእያንዳንዱ ማዘዋወሪያ አንድ ደንብን ይዟል።

ዝርዝር 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)።

images/figures/raw_home_view
ምስል 3.5: ጥሬው የመነሻ ገጽ ትይታ (/quami_getss/menesha)።
ሳጥን 3.2. ዓግኝ (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 የመልመጃ አፕልኬሽን፣ የተጠቃሚወች እና የአጪርጽሑፎች መቆጣጠሪያወች በተለየ መልኩ፣ ይህ የቋሚ ገጾች መቆጣጠሪያ መደበኛ የው.ሁ.ማ ተግባሮችን እንደማይጠቀም አስተውላችሁ ይሆናል። ይህ ለቛሚ ገጾች አንድ የተለመደ ስብስብ ነው፤ ይህ ማለትም የው.ሁ.ማ መዋቅር ለማንኛውም ችግር ብቁ መፍትሔ አይደለም ማለት ነው።

ዝርዝር 3.9: ዝርዝር 3.7 የተሰራው የቋሚ ገጾች መቆጣጠሪያ። 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)።

ዝርዝር 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)።

ዝርዝር 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) መለያ ውስጥ የገባ፣ ወደ ተጓዳኙ ፋይል የሚወስድ ሙሉ መንገድን አካተዋል።

መልመጃዎች

የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።

የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡

  1. አንድ ዋንዛ (Wanza) የተባለ መቆጣጠሪያ፣ ቡና (buna) እና ቤት (bet) ከተባሉ ሁለት ተግባሮች ጋር አመንጩ።
  2. ሳጥን 3.1 ውስጥ የተገለጹትን ብልሃቶች ተግባር ላይ በማዋል፣ የ‘ዋንዛ (Wanza) መቆጣጠሪያን እስከነ ተዛማጅ ተግባሮቹ ጠራርጋችሁ አጥፉ፡፡

3.2.2 ብጁ ቛሚ ገጾች

ክፍል 3.4 ጀምሮ አንዳንድ (በጣም በጥቂቱ) የሚለዋወጡ ይዞታዎችን የምንጨምርባቸው ቢሆንም፣ በዝርዝር 3.10 እና በዝርዝር 3.11 ውስጥ ያሉ ፋይሎች አሁን ባሉበት ሁኔታ ግን አንድ አስፈላጊ ነጥብን አጉልተው ያሳያሉ፤ እሱም የሬይልስ ትይታወች ንጹህ ቛሚ ሃ.ጽ.መ.ቋን እንደሚይዙ ነው። ይህ ማለትም የሬይልስ ዕውቀት ሳይኖረን እንኳ የመነሻ እና የእርዳታ ገጾችን ልክ በዝርዝር 3.12 እና በዝርዝር 3.13 ላይ እንዳሉት አድርገን ገጾቹን ማበጀት መጀመር እንችላለን ማለት ነው።

ዝርዝር 3.12: ለመነሻ ገጹ የተበጀ ሃ.ጽ.መ.ቋ። app/views/quami_getss/menesha.html.erb
<h1>ማሳያ አፕልኬሽን</h1>
<p>
  ይህ <a href="https://www.railstutorial.org/">
  የሩቢ ኦን ሬይልስ ስልጠና </a>
  ማሳያ ለተባለው አፕልኬሽን የመነሻ ገጽ ነው፡፡
</p>
ዝርዝር 3.13: ለመነሻ ገጹ የተበጀ ሃ.ጽ.መ.ቋ። 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 ላይ ይታያሉ፡፡

images/figures/custom_home_page
ምስል 3.6: አንድ የተበጀ የመነሻ ገጽ።
images/figures/custom_help_page
ምስል 3.7: አንድ የተበጀ የእርዳታ ገጽ።

3.3 የፈተና ስራን መጀመር

ለማሳያ አፕልኬሽናችን የመነሻ እና የእርዳታ ገጾችን ቀደም ብለን ፈጥረን እና ይዞታቸውንም ሞልተን ጨርሰናል (ክፍል 3.2.2)፣ ስለዚህ አሁን አንድ ስለኛ የተባለ ገጽን እናክላለን። የዚህ ዓይነት ለውጥ በምናደርግበት ጊዜ፣ ገጸባህሪው በትክክል መተግበሩን ለማረጋገጥ፣ አንድ ራስ ፈትኔ ፈተናን (Automated Test) መጻፉ ጥሩ ልምድ ነው። አንድ አፕልኬሽንን በማበልጸግ ሂደት ላይ የሚገኘው የፈተና ስብስብ (Test Suite)፣ ከአንድ አደጋ እንደሚጠብቅ አንድ መረብ እና ልክ እንደ የአፕልኬሽኑ የኮድ ምንጪ፣ ተፈጻሚ ሰነድ ሆኖ ሊያገለግል ይችላል። ምንም እንኳ ተጨማሪ ኮድ ቢጠይቅም፣ በትክክል ከተሰራ፣ ፈተናወችን መጻፋችን ብልጸጋችንን በቅልጣፌ እንድንሰራ ያግዘናል። ምክንያቱም ያልተጠበቁ፣ ወይም ትክክል ያልሆኑ ውጤቶችን፣ ወይም የተጠበቀውን ገጸባህሪ ካላሳየ፣ ሳንካወችን ለማግኘት በጣም ትንሽ ጊዜ ብቻ ስለምናባክን ነው። ሆኖም ይህ የሚጸናው እኛ ፈተናዎችን በመጻፍ ላይ ብቁወች ከሆንን ብቻ ነው፤ ለዚህም ነው ፈተና መጻፍ መለማመዱን በተቻለ መጠን በቶሎ መጀመሩ በጣም አስፈላጊ የሆነው።

ምንም እንኳ ሁሉም የሬይልስ አበልጻጊወች አፕልኬሽንን መፈተን ጥሩ ሃሳብ እንደሆነ ቢስማሙም፣ በዝርዝር ጉዳዮ ላይ ግን የተላያዩ አመለካከቶች አላቸው። በፈተና-መሬ ብልጸጋ (ፈ.መ.ብ) (Test-Driven Development) (TDD) አጠቃቀም ላይ እስከ አሁን ድረስ ሞቅ ያለ ክርክር አለ። 8 ይህ ስልት አንድ አበልጻጊ በመጀመሪያ የሚወድቅ ፈተናን ይጽፍ እና ከዚያ የአፕልኬሽኑን ኮድ ፈተናውን እንዲያልፍ አድርጎ የሚጽፍበት የአፕልኬሽን አበለጻጻግ ዘዴ ነው። የሩቢ ኦን ሬይልስ ስልጠና ፈተናን ለማካሄድ ቀለል ያለ እና ግልጽ አቀራብን ይጠቀማል፤ ይህም የማንኛውንም ቡድን ሃሳብ ሳይደግፍ፣ ፈተና በሚያስፈልግበት ወቅት ፈተና-መሬ ብልጸጋን መጠቀም ይሆናል (ሳጥን 3.3)።

ሳጥን 3.3. መቼ እንፈትን?

መቼ እና እንዴት መፈተን እንዳለብን በምንወስንበት ጊዜ፣ ለምን መፈተን እንዳለብን መረዳት ተገቢ ነው። በኔ አስተያየት ራስ ፈትኔ ፈተናወችን መጻፉ፣ ሶስት ዋና ጥቅሞች አሏቸው እነሱም፡-

  1. ከምልሰቶች (Regressions) ይከላከላሉ፤ ይህ ማለት ቀደም ሲል የበለጸጉ እና የሚሰሩ ገጸባህሪያት ላይ፣ የሆነ ለውጥ ከተደረገ በኋላ፣ የሚፈጠር ስህተትን ለመከላከል ይጠቅማሉ ማለት ነው፡፡
  2. የአንድ አፕልኬሽን ኮድን (ማለትም ተግባሩን ሳይቀይር ቅጹን በመለወጥ ኮዱን) ለማጣራት (Refactore) ይጠቅማሉ፤ ይህም ከፍተኛ በሆነ መተማመን ላይ የተመረኮዘ፣ የኮድ ማጣራት እድልን ይሰጣል።
  3. ለአፕልኬሽን ኮዱ ልክ እንደ አንድ ተገልጋይ ሆነው ያገለግላሉ፤ በዚህም ንድፉን እና ከሌሎች የስርዓቱ ክፍሎች ጋር ያለውን በይነገጽ እንድንወስን ይረዱናል፡፡

ከላይ ከተዘረዘሩት ጥቅሞች አንዳቸውም እንኳን በመጀመሪያ ፈተናወች እንዲጻፉ የማይጠይቁ ቢሆኑም፣ ፈተና-መሬ ብልጸጋን (ፈ.መ.ብ) (Test-Driven Development (TDD)) በትጥቃችሁ ውስጥ ሊኖራችሁ የሚገባ አንድ ጠቃሚ መሳሪያ የሚሆንበት ብዙ ሁኔታወች ግን አሉ። መቼ እና እንዴት መፈተን እንዳለባችሁ መወሰኑ፣ ፈተናዎችን በመጻፍ ያላችሁ ልምድ ላይ ይወሰናል። አብዛኞቹ አበልጻጊወች ፈተናዎችን በመጻፍ ጥሩ ብቃት ላይ በሚደርሱበት ጊዜ፣ በመጀመሪያ ፈተናውን የመጻፍ ዝንባሌ ያድርባቸዋል። በተጨማሪም ፈተናው ከአፕልኬሽኑ ኮድ ጋር ሲነጻጸር ምን ያህል ከባድ እንደሆነ፣ የሚፈለጉት ገጸባህሪዎች እንዴት በትክክል እንደሚታወቁ እና ለወደፊቱ ገጸባህሪው የመሰበር እድሉ ላይ የተመረኮዘ ነው።

በዚህ ዓውደ ጽሑፍ ውስጥ፣ መቼ መጀመሪያ መፈተን (ወይም ጪራሽ አለመፈተን) እንዳለብን የምንከተለው አንድ የመመሪያ ስብስብ መኖሩ ጠቃሚ ነው። እነዚህ የሚከተሉት መመሪያወች ከራሴ ልምድ አኳያ የምሰጣቸው ናቸው፡-

  • ከአፕኬሽኑ ኮድ ጋር ሲነጻጸር ፈተናው አጪር ወይም ግልጽ ከሆነ፣ በመጀመሪያ ፈተናውን ወደ መጻፉ አዘንብሉ።
  • የተፈለገው ባህሪ ሙሉ በሙሉ ግልጽ ካልሆነ፣ በመጀመሪያ የአፕልኬሽኑን ኮድ ወደ መጻፉ አዘንብሉ፣ ከዚያም ውጤቱን ለመግለጽ ፈተናውን ጻፉ።
  • ጥበቃ ቅድሚያ የሚሰጠው ጉዳይ ስለሆነ፣ በመጀመሪያ የጥበቃ ቅርጸቱ ፈተናወች ላይ ስህተትን ፈጽሙ፡፡
  • ኮዱ ላይ አንድ ሰንክ በሚገኝበት ጊዜ፣ አንድ እሱን የሚፈጥር እና ከምልሰቶች የሚከላከል ፈተናን ጻፉ፣ ከዚያም እሱን የሚያስተካክከውን የአፕልኬሽኑን ኮድ ጻፉ።
  • ኮዱ ለወደፊት የሚለወጥ ከሆነ (እንደ የተዘረዘረ የሃ.ጽ.መ.ቋ መዋቅርን የመሰሉ) ፈተናዎችን ወዳለመጻፍ አዘንብሉ።
  • ኮዱን ከማጣራታችሁ በፊት ፈተናወችን ጻፉ፣ ይህም ሊሰበር የሚችል ዓይነት እና ለስህተት የተጋለጠው ኮድ ላይ በማተኮር ይሆናል።

በመደበኛውን የአሰራር ሂደት የተመለከትን እንደሆነ፣ ከላይ ያሉት አመራሮች መጀመሪያ የመቆጣጠሪያውን እና የቅርጸት ፈተናወችን፣ እና ሁለተኛ የውህደት ፈተናወችን (ይህ በመላው ቅርጸቶች፣ ትይታወች እና መቆጣጠሪያወች ላይ ያለውን ተግባራት ሁሉ ይፈትናል) መጻፍ እንዳለብን ያመለክታሉ። ቀላል ወይም ለስህተት የተጋለጠ የአፕልኬሽን ኮድ በምንጽፍበት ጊዜ፣ ወይም ሊቀየር በሚችልበት ሁኔታ ውስጥ ሲሆን (ብዙውን ጊዜ በትይታወች ላይ እንደሚታየው) ብዙውን ጊዜ መፈተኑን ሙሉ ለሙሉ እንተወዋለን።

የእኛ ዋና የመፈተኛ መሳሪያዎቻችን የመቆጣጠሪያ ፈተናወች (Controller Tests) (በዚህ ክፍል ውስጥ ይጀመራል) የቅርጸት ፈተናዎች (Model Tests) (በምዕራፍ 6 ውስጥ ይጀመራል) እና የውህደት ፈተናዎች (Integration Tests) (በምዕራፍ 7 ውስጥ ይጀመራል) ይሆናሉ። በተለይ የውህደት ፈተናዎች ሃያሎች ናቸው፤ ምክንያቱም አንድ የድር አሳሽን በመጠቀም፣ ከእኛ አፕልኬሽን ጋር የሚገናኝን የተጠቃሚ ድርጊቶችን ለማስመሰል ስለሚያስችሉን ነው፡፡ የውህደት ፈተናዎች የእኛ የመጨረሻ ዋና የመፈተኛ ስልታችን ይሆናሉ፤ ነግር ግን የመቆጣጠሪያ ፈተናወች ለመጀመር አንድ ቀላል መነሻን ይሰጡናል።

3.3.1 የመጀመሪያ ፈተናችን

አሁን አንድ ስለኛ የተባለ ገጽን ወደ አፕልኬሽናችን የምናክልበት ጊዜ ነው። ከዚህ በኋላ እንደምናየው፣ ፈተናው አጪር እና ቀላል ነው፤ ስለዚህም በሳጥን 3.3 ውስጥ ያሉ አመራሮችን በመከተል ፈተናውን በመጀመሪያ እንጽፋለን። ከዚያም የአፕልኬሽኑን ኮድ ለመጻፍ የሚወድቁትን ፈተናወች እንጠቀማን።

የመፈተን ስራን ለመጀመር ከባድ እና የሬይልስንም የሩቢንም ሰፊ ዕውቀት የሚጠየቅ ሊሆን ይችላል። በዚህ ገና በሆነ ጊዜም ፈተናወችን መጻፉ ተስፋ አስቆራጪ እና አስፈሪ ሊመስል ይችላል። እንደ አጋጣሚ ግን ሬይልስ ከባዱን ስራ ሰርቶልናል፤ ምክንያቱም ፈተናውን በቀጥታ እንድንጀምር የ‘ሬይልስ መቆጣጠርያ አመንጪ (rails generate controller) ትእዛዝን (ዝርዝር 3.7) ባካሄድንበት ወቅት አንድ የፈተና ፋይልን በራስሰር አመንጪቶልናል፡-

$ ls test/controllers/
quami_getss_controller_test.rb

እስቲ እንመልከተው፤ (በዝርዝር 3.14 ውስጥ ያለው ፈተና የአማርኛ ጽሑፍ እንደተጨመረበት ልትገነዘቡ ይገባል)።

ዝርዝር 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) ትእዛዝን እንደሚከተለው አድርገን በመጠቀም ማከናወን እንችላለን:-

ዝርዝር 3.15: አረንጓዴ
$ 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) ውስጥ አንድ ደንብን እንድታክሉ እመክራችኋለሁ፡፡

ዝርዝር 3.16: የመነጩ የውሂበጎታ ፋይሎችን ችላ ማለት። .gitignore
.
.
.
# Ignore db test files.
db/test.*

3.3.2 ቀይ

ሳጥን 3.3 ውስጥ እንደተገለጸው፣ ፈተና-መሬ ብልጸጋ የሚወድቀውን ፈተና በመጀመሪያ መጻፍ፣ ፈተናውን ለማሳለፍ የሚፈለገውን የአፕልኬሽን ኮድ መጻፍ እና ከዚያም አስፈላጊ ከሆነ ኮዱን ማጣራትን ያሳትፋል። አብዛኞቹ የመፈተኛ መሳሪያዎች የሚወድቁትን ፈተናወች በቀይ የሚያልፉትን ደግሞ በአረንጓዴ ቀለም ስለሚያመለክቱ ይህ ዑደት አንዳንድ ጊዜ “ቀይ፣ አረንጓዴ፣ ማጣራት” በመባል ይታወቃል። በዚህ ክፍል ውስጥ የመጀመሪያውን ዑደት እንጨርሳለን፤ ይህም አንድ የሚወድቅ ፈተናን በመጻፍ ቀይን ማግኘት ይሆናል። ከዚያም በክፍል 3.3.3 ውስጥ አረንጓዴ ቀለምን እናገኛለን፣ ከዚያም በክፍል 3.4.3 ውስጥ ኮዱን እናጣራለን። 9

የመጀመሪያው ሂደታችን ለ‘ስለኛ (Silegna) ገጽ አንድ የሚወድቅ ፈተናን መጻፍ ነው። የዝርዝር 3.14 ቅድን በመከተል ፈተናው ምን ዓይነት ፈተና መሆን እንዳለበት መገመት ትችላላችሁን? መልሱ በዝርዝር 3.17 ውስጥ ይታያል፡፡

ዝርዝር 3.17: ለ‘ስለኛ (Silegna) ገጽ የሚሆን አንድ ፈተና። ቀይ 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 የፈተናውን ገለጣ ከእንግሊዝኛ ይልቅ ወደ አማርኛ እንደቀየረው ልብበሉ።)

እንደተፈለገው፣ ፈተናው መጀመሪያ ላይ ይወድቃል፡-

ዝርዝር 3.18: ቀይ
$ rails test
3 tests, 2 assertions, 0 failures, 1 errors, 0 skips

3.3.3 አረንጓዴ

አሁን አንድ የወደቀ ፈተና ስላለን (ቀይ) ወደሚያልፈው ፈተና (አረንጓዴ) እንዲመራን፣ የወደቁት ፈተናወች የሰጡንን የስህተት መልእክቶች እንጠቀማለን፣ በነሱ በመመራትም አንድ የሚሰራ የስለኛ ገጽን እንተገብራለን።

የወደቀው ፈተና የስህተት መልእክት ውጤት ውጽዓትን፣ በመመርመር መጀመር እንችላለን፡-

ዝርዝር 3.19: ቀይ
$ rails test
NameError: undefined local variable or method `quami_getss_silegna_url'

እዚህ ያለው የስህተት መልእክት እንደሚለው፣ የስለኛ ገጽ ዓ.አ.ሃ.አ በሬይልስ ኮድ ውስጥ አልተሰየመም ይላል፣ ይህም ራውትስ በተባለው ፋይል ውስጥ አንድ መስመር ኮድ መጨመር እንዳለብን አንድ ፍንጪ እየሰጠን ነው። በዝርዝር 3.20 ላይ እንደሚታየው፣ በዝርዝር 3.8 ውስጥ ያለውን ጥለት በመከተል ይህንን ማከናወን እንችላለን፡፡

ዝርዝር 3.20: የ‘ስለኛ (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

ተብሎ የሚጠራ አንድ ረጅን በራስሰር ይፈጥራል።

የፈተና ስብስቡን በድጋሜ በማስኬድ አሁንም ፈተናው ቀይእንደሆነ እናያለን፤ ነገር ግን አሁን የስህተት መልእክቱ ተለውጧል፡-

ዝርዝር 3.21: ቀይ
$ rails test
AbstractController::ActionNotFound:
The action 'silegna' could not be found for QuamiGetssController

የስህተት መልእክቱ አሁን በቋሚ ገጾች መቆጣጠሪያ ውስጥ የሌለውን አንድ የ‘ስለኛ (silegna) ተግባርን ያመለክታል፣ ይህንንም በዝርዝር 3.22 ውስጥ እንደታየው፣ በዝርዝር 3.9 ውስጥ ያሉትን ማለት የ‘መነሻ (menesha) እና የ‘እርዳታ (erdata) ቅድን በመከተል ተግባሩን ማከል እንችላለን።

ዝርዝር 3.22: የቋሚ ገጾች መቆጣጠሪያ ከታከለ ስለኛ (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 ውስጥ ባሉት ይዞታዎች መሙላት ይኖርባቹኋል።

ዝርዝር 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) ትእዛዝን ማስኬዱ መልሶ ወደ አረንጓዴሊያመጣን ይገባዋል:-

ዝርዝር 3.24: አረንጓዴ
$ rails test
3 tests, 3 assertions, 0 failures, 0 errors, 0 skips

በእርግጥ፣ ፈተናወቻችን ወደ ስህተት እየመሩን አለመሆናቸውን ለማረጋገጥ፣ ገጹን በአንድ የድር አሳሽ ውስጥ ማየቱ መጥፎ ሃሳብ አይደለም (ምስል 3.8)።

images/figures/about_us
ምስል 3.8: አዲሱ ስለኛ ገጽ (/quami_getss/silegna)።

3.3.4 ማጣራት

አሁን አረንጓዴን ስላገኘን፣ የእኛን ኮድ በልበ ሙሉነት ለማጣራት ነጻ ነን። አንድ አፕልኬሽን በሚበለጽግበት ጊዜ፣ ኮዱ ብዙውን ጊዜ “መሽተት” ይጀምራል፤ ይህ ማለትም አስቀያሚ፣ የተንዛዛ፣ ወይም በኮድ ድግግሞሽ የተሞላ ነው ማለት ነው። ኮምፒውተሩ ኮዱ የፈለገውን ቢመስል ግድ የለውም፣ በርግጥ ሰው ግድ ይለዋል፤ ስሆነም የኮዱን መሰረት ንጹህ ለማድረግ ሁሌ ኮዱን ማጣራት አስፈላጊ ነው። ምንም እንኳን የአፕልኬሽናችን ኮድ ለማጣራት በጣም ትንሽ ቢሆንም፣ የኮድ መሽተትን ግን በሁሉም ስንጥቆች ውስጥ ያስገባል፣ እናም በክፍል 3.4.3 ውስጥ ኮዱን ማጣራት እንጀምራለን።

3.4 በጥቂቱ የሚለዋወጡ ገጾች

ለአንዳንዱ ቛሚ ገጾች፣ ተግባሮች እና ትይታወችን ስለፈጠርን፣ አሁን በእያንዳንዱ ገጽ መሰረት ላይ ተሞኩዞ የሚለወጡ፣ አንዳንድ ይዞታዎችን በማከል በጣም በጥቂቱ ተለዋዋጪ እንዲሆኑ እናደርጋቸዋለን፤ እያንዳንዱ ገጽ ይዘቱን የሚያንጸባርቅ አርዕስት ይኖረዋል። በእውነቱ እዚህ ላይ አንድ እንኮ የሚለወጥ አርዕስትን በማድረግ ብቻ ተለዋዋጪ ይዘትን ይወክላል ማለቱ አከራካሪ ነው፤ ነገር ግን ግራም ነፈሰ ቀኝ በምዕራፍ 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.2: (በአብዛኛው) የማይለዋወጡ ገጾች።

3.4.1 አርዕስቶችን መፈተን (ቀይ)

ዝርዝር 3.25 ውስጥ የሚታየውን አይነት ቅጽ የሚወስድ የገጽ አርዕስቶችን ለማከል፣ አንድ የተለመደ የድር ገጽ አወቃቀርን መማር (ወይም መገምገም) ይኖርብናል። (ይህ በ በሃ.ጽ.መ.ቋ ላይ መሰረታዊ እውቀትን ለማግኘት የሚያስፈልገውን ተማር ላይ በሰፊው ተሸፍኗል።)

ዝርዝር 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 ውስጥ የተመለከቱትን ፈተናወች ይሰጣል።

ዝርዝር 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 ፈተናወች ባሉበት ሁኔታ እንዳሉ፣ የፈተና ስብስቡ አሁን ቀይመሆኑን ማረጋገጥ ይኖርባቹኋል፡-

ዝርዝር 3.27: ቀይ
$ rails test
3 tests, 6 assertions, 3 failures, 0 errors, 0 skips

3.4.2 የገጽ አርዕስትን ማከል (አረንጓዴ)

ፈተናወቹ በክፍል 3.4.1 ላይ ባሉ የፈተና ሂደቶች ውስጥ እንዲያልፉ፣ አሁን በእያንዳንዱ ገጽ ላይ አንድ አርዕስትን እናክላለን፡፡ መሰረታዊውን የሃ.ጽ.መ.ቋ መዋቅር ከዝርዝር 3.25 ወደ ተበጀው መነሻ ገጽ ማለት ወደ ዝርዝር 3.12 ማከሉ፣ ዝርዝር 3.28 ‘ን ያስገኛል።

ዝርዝር 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 ‘ም የሚታየውን ማለት የሁለተኛውን ትር ያብራራል፡፡

images/figures/home_view_full_html
ምስል 3.9: የመነሻ ገጹ ከአንድ አርዕስት ጋር፡፡

ለእርዳታ ገጽ (ዝርዝር 3.13) እና ለስለኛ ገጽ (ዝርዝር 3.23) ይህንን ቅድ መከተል በዝርዝር 3.29 እና በዝርዝር 3.30 ውስጥ ያለውን ኮድ ያስገኛል።

ዝርዝር 3.29: የእርዳታ ገጹ ትይታ ከተሟላ የሃ.ጽ.መ.ቋ መዋቅር ጋር። ቀይ 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>
ዝርዝር 3.30: የስለኛ ገጽ ትይታ ከተሟላ የሃ.ጽ.መ.ቋ መዋቅር ጋር። አረንጓዴ 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>

በዚህ ጊዜ፣ የፈተና ስብስቡ ወደ አረንጓዴመመለስ አለበት፡-

ዝርዝር 3.31: አረንጓዴ
$ rails test
3 tests, 6 assertions, 0 failures, 0 errors, 0 skips

መልመጃዎች

የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።

የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡

ከዚህ ክፍል ጀምሮ፣ ለወደፊቱ በኮድ ዝርዝር ላይ መልሳቸው የማይቀርብ መልመጃዎችን በመስራት አፕልኬሽኑ ላይ አንዳንድ ማሻሻያዎችን ማድረግ እንጀምራለን፡፡ ይህ የተደረገበት ምክንያት፣ መልመጃዎቹን ላላጠናቀቁ አንባቢዎች መልመጃዎቹ ትርጉም እንዲሰጡ ለማድረግ ሲሆን መልመጃዎቹን ከሰራችኋቸው ግን ኮዳችሁ ከዋናው ጽሑፍ ጋር እንደሚለያይ ልትገነዘቡ ይገባል፡፡ እንደዚህ ያሉ ትናንሽ አስቸጋሪ ልዩነቶችን ለመፍታት የሚደረጉ ጥረቶች ለቴክኒካዊ ብልሃት እድገት ከፍተኛ አስተቃጽኦ ያበረክታሉ (ሳጥን 1.2)፡፡

  1. በቋሚ ገጾች መቆጣጠሪያ ፈተና ውስጥ አንዳንድ የፈተና ድግግሞሽን አስተውላችሁ ይሆናል (ዝርዝር 3.26)፡፡ በተለይም “የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን” የሚለው መሰረተ አርዕስት ለእያንዳንዱ የአርዕስት ፈተና አንድ ዓይነት ነው። ከእያንዳንዱ ፈተና በፊት በራስሰር የሚሄደውን ልዩ የ‘አዘጋጅ (setup) ሥልትን በመጠቀሞ የተደጋገምውን ፈተና በማስወገድ በዝርዝር 3.32 ውስጥ ያሉ ፈተናወች ድግግሞሹ ከተወገደ በኋላም አረንጓዴመሆናቸውን አረጋግጡ፡፡ (ዝርዝር 3.32ክፍል 2.2.2 የታየውን፣ በክፍል 4.4.5 በይበልጥ የሚገለጸውን አንድ የቅርፀ ተለዋዋጪንክፍል 4.2.1 ላይ በደንብ ከሚገለጸው ከሃረግ ውስጠገምት (String Interpolation) አሰራር ጋር በማጣመር ይሰራል።)
ዝርዝር 3.32: የቋሚ ገጾች መቆጣጠሪያ ፈተና ከአንድ መሰረተ አርዕስት ጋር። አረንጓዴ 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

3.4.3 ገጽታወች እና ክት ሩቢ (ማጣራት)

ቀደም ሲል በዚህ ክፍል ውስጥ ብዙ ነገር አሳክተናል፤ የሬይልስ መቆጣጠሪያወችን እና ተግባሮችን በመጠቀም ሶስት ብቁ ገጾችን አመንጪተናል፤ ነገር ግን ገጾቹ ንጹህ ቛሚ ሃ.ጽ.መ.ቋ ናቸው፣ እና በዚህ ምክንያትም የሬይልስን ችሎታ አያሳዩም። በተጨማሪም በመጥፎ የኮድ ድግግሞሽ ተጠቅተዋል፡-

  • የገጹ አርዕስቶች በአብዛኛው (ግን ብዙ ባይሆንም) በጣም ተመሳሳዮች ናቸው።
  • “የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን” የሚለው አርዕስት ለሶስቱም አርዕስቶች የጋራ ነው።
  • ሁሉም የሃ.ጽ.መ.ቋ መሰረታዊ መዋቅር በእያንዳንዱ ገጽ ላይ ይደጋገማል።

ይህ የተደጋጋመ ኮድ “ነገር አትደጋግም Don’t Repeat Yourself” የተባለውን የሬይልስ መርህን የሚጥስ ስራ ነው፤ በዚህ ክፍል ውስጥ ድግግሞሹን በማስወገድ ኮዳችንን ከመደጋገም ነጻ እናወጣለን። በመጨመሻም አርዕስቶቹ አሁንም ትክክል መሆናቸውን ለማረጋገጥ፣ በክፍል 3.4.2 ውስጥ የሚገኙትን ፈተናወችን ደግመን እናስኬዳቸዋለን።

ድግግሞሹን ለማስወገድ አንድ እርምጃ ወደፊት እንጓዝ ዘንድ፣ በተቃራኒ መልኩ አንድዳንድ ተጨማሪ ድግግሞሽን በማከል የመጀመሪያውን ሂደት እንጀምራለን፣ አሁን በጣም የሚመሳሰሉትን አርዕስቶች ጪራሽ አንድ ዓይነት በማድረግ እንጀምራለን፡፡ ይህ ሂደት በኋላ ሁሉንም የኮድ ድግግሞሽ ለማስወገድ በጣም ቀላል እንዲሆን ያደርጋል።

ስልቱ በትይታችን ውስጥ ክት ሩቢን (Embedded Ruby) መጠቀምን ያሳትፋል። የመነሻ፣ የእርዳታ እና የስለኛ ገጽ አርዕስቶች አንድ ተለዋዋጪ አካል ስላላቸው፣ በእያንዳንዱ ገጽ ላይ የተለያዩ አርዕስቶችን ለማዘጋጀት አንድ አቅርብ (provide) የተባለ የሬይልስ ልዩ ሥልትን እንጠቀማለን። በዝርዝር 3.33 ውስጥ ካለው ኮድ ጋር ቃልበቃል “መነሻ” የሚለውን አርዕስት በ‘መነሻ.ሃጽመቋ.ክሩ (menesha.html.erb) ትይታ ውስጥ በመተካት ይህ አርዕስት እንዴት እንደሚሰራ ማየት እንችላለን፡፡

ዝርዝር 3.33: የመነሻ ገጽ ትይታ ከአንድ ክት ሩቢ አርዕስት ጋር። አረንጓዴ 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 ውስጥ የሚገኙትን ፈተናወች በማስኬድ፣ እስካሁን ያደረግነው ስራ ሁሉም እንደሚሰራ እና ሁሉም እስካሁን ድረስ አረንጓዴመሆናቸውን ማረጋገጥ እንችላለን፡-

ዝርዝር 3.34: አረንጓዴ
$ rails test
3 tests, 6 assertions, 0 failures, 0 errors, 0 skips

ከዚያ ለእገዛ እና ለስለ ገጾች ተዛማጅ ተተኪ አርዕስቶችን ማድረግ እንችላለን (ዝርዝር 3.35 እና ዝርዝር 3.36)።

ዝርዝር 3.35: የእርዳታ ገጽ ትይታ ከአንድ ክት ሩቢ አርዕስት ጋር። አረንጓዴ 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>
ዝርዝር 3.36: የስለኛ ገጽ ትይታ ከአንድ ክት ሩቢ አርዕስት ጋር። አረንጓዴ 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 ውስጥ ይታያል፡፡

ዝርዝር 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 ውስጥ ይታያሉ፡፡

ዝርዝር 3.38: የመነሻ ገጹ ከተወገደ የሃ.ጽ.መ.ቋ መዋቅር ጋር። አረንጓዴ app/views/quami_getss/menesha.html.erb
<% provide(:title, "መነሻ") %>
<h1>ማሳያ አፕልኬሽን</h1>
<p>
  ይህ <a href="https://www.railstutorial.org/">
  የሩቢ ኦን ሬይልስ ስልጠና </a>
  ማሳያ ለተባለው አፕልኬሽን፡ የመነሻ ገጽ ነው፡፡
</p>
ዝርዝር 3.39: የእርዳታ ገጹ ከተወገደ የሃ.ጽ.መ.ቋ መዋቅር ጋር። አረንጓዴ 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>
ዝርዝር 3.40: የእርዳታ ገጹ ከተወገደ የሃ.ጽ.መ.ቋ መዋቅር ጋር። አረንጓዴ 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>

እነዚህ ትይታወች ከተበየኑ በኋላ የመነሻ፣ የእርዳታ እና ስለኛ ገጾቹ ከዚህ በፊት ከነበረው ይዞታቸው ጋር ሲነጻጸሩ በይዞታቸው ፍጹም አንድ ዓይነት ሲሆኑ፤ ያላቸው ድግግሞሽ ግን በጣም ትንሽ ነው።

ተሞክሮ እንደሚያሳየው፣ በጣም ትንሽ ማጣራት እንኳን ለስህተት የሚጋለጥ እና በቀላሉ ከቁጥጥር ውጪ ለሆነ ችግር እንደሚያጋልጥ ነው። አንድ ጥሩ የፈተና ስብስብ መኖሩ በጣም አስፈላጊ የሆነበት አንዱ ምክንያትም ለዚህ ነው። እያንዳንዱ ገጽ ትክክል መሆኑን አንድ ባንድ ከማረጋገጥ ይልቅ፣ (በአሁኑ ጊዜ እያንዳንዱ ገጽ ትክክል መሆኑን አንድ በአንድ ማረጋገጡ አስቸጋሪ ባይሆንም አፕልኬሽኑ አያደገ ሲመጣ ግን ሂደቱ የማያዛልቅ ይሆናል) የፈተና ስብስቡ አሁንም አረንጓዴመሆኑን በቀላሉ ማረጋገጥ እንችላለን:-

ዝርዝር 3.41: አረንጓዴ
$ rails test
3 tests, 6 assertions, 0 failures, 0 errors, 0 skips

ይህ የእኛ ኮድ አሁንም ትክክል ለመሆኑ ማረጋገጫ አይደለም፣ ነገር ግን ትክክል የመሆን ዕድሉን በእጅጉ ከፍ ያደርገዋል፣ በዚህም ወደፊት ከሚመጡ ስንኮች የሚጠብቀን አንድ የደህንነት ጋሻን ይሰጠናል።

መልመጃዎች

የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።

የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡

  1. ለአፕልኬሽኑ አንድ የአግኙን (agignun) ገጽ አድርጉ።17ዝርዝር 3.17 ውስጥ ያለውን ቅድ በመከተል በ:- /quami_getss/agignun ዓ.አ.ሃ.አ ላይ አንድ ገጽ ለመኖሩ እና በገጹ ላይ “አግኙን | የሩቢ ኦን ሬይልስ ስልጠና ማሳያ አፕልኬሽን” የሚል አርዕስት መኖሩን የሚያረጋግጥ አንድ ፈተና ጻፉ፡፡ ልክ በክፍል 3.3.3 ውስጥ የስለኛ ገጽ ፈተናወችን ለማሳለፍ የተደረጉትን ቅደም ተከተሎች በመከተል እና በዝርዝር 3.42 ውስጥ ያለውን ይዞታ በአግኙን ገጹ ላይ በመሙላት ፈተናወቹ እንደሚያልፉ አድርጉ።
ዝርዝር 3.42: ለታሰበው የአግኙን ገጽ የሚሆን ኮድ። app/views/quami_getss/agignun.html.erb
<% provide(:title, "አግኙን") %>
<h1>አግኙን</h1>
<p>
  ማሳያ አፕልኬሽኑን በተመለከተ፡ በሩቢ ኦን ሬይልስ ስልጠና፡
  <a href="https://www.railstutorial.org/contact">አግኙን ገጽ</a>
  በኩል ልትገናኙን ትችላላችሁ፡፡
</p>

3.4.4 ስረ ማዘዋወርያውን ማቀናበር

አሁን የጣቢያችንን ገጾች ስላበጀን እና በፈተና ስብስቡ ላይ አንድ ጥሩ ጅማሬን ስላገኘን፣ ከመቀጠላችን በፊት እስኪ የአፕኬሽኑን ስረ ማዘዋወርያ እናዘጋጅ። ልክ እንደ ክፍል 1.2.4 እና ልክ እንደ ክፍል 2.2.2 ከመረጥነው ገጽ ጋር ይህንን ምልክት:- / ለማገናኘት የማዘዋወሪያዎች (routes.rb) ፋይልን ማረምን ያሳትፋል፤ በዚህ ሁኔታ ላይ ምርጫችን የመነሻ ገጹ ይሆናል። (በዚህ ጊዜ በክፍል 3.1 ላይ በአፕልኬሽን መቆጣጠሪያው ውስጥ የጨመራችሁትን የ‘ሰላምታ (selamta) ተግባር እንድታስወግዱ አሳስባለሁ።) በዝርዝር 3.43 ውስጥ እንደታየው ማለት የ‘ስር (root) ማዘዋወርያውን ከ፡-

root 'application#selamta'

ወደ

root 'quami_getss#menesha'

መለወጥ ነው። ይህ የዚህ ምልክት:- / መጠይቆችን ለ‘መነሻ (menesha) እንዲተላለፍ ያዘጋጃል። የተገኘው የማዘዋወሪያ ፋይል በምስል 3.10 ውስጥ ይታያል።

ዝርዝር 3.43: ስረ ማዘዋወርያውን ለመነሻ ገጹ ማቀናበር። 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
images/figures/home_root_route
ምስል 3.10: የመነሻ ገጹ በስረ ማዘዋወርያው ላይ።

መልመጃዎች

የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።

የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡

  1. ዝርዝር 3.43 ውስጥ የስረ ማዘዋወርያውን ማከሉ አንድ ስር_ዓአሃአ (root_url) የተባለ የሬይልስ ረጅ ዘዴን ወደመፍጠር ይመራል (ማለት እንደዚህ ዓይነት ተመሳሳይ ረጅን ይፈጥራል quami_getss_home_url)፡፡ በዝርዝር 3.44 ውስጥ ያለውን ይህን_ሙሉ የሚለው ቃልን በተገቢው ኮድ በመሙላት፣ ለስረ ማዘዋወርያው አንድ ፈተና ጻፉ፡፡
  2. ዝርዝር 3.43 ውስጥ ባለው ኮድ ምክንያት፣ ከዚህ በፊት ባለው መልመጃ ላይ ያለው ፈተና ሲፈጠር ጀምሮ አረንጓዴነው፡፡ በእንዲህ ያለ ሁኔታ ላይ እኛ የፈተነው ነገር በትክክል እየተፋተነ መሆኑን እርግጠኞች ለመሆን ከባድ ነው። ስለሆነም ፈተናው ቀይ ይሆን ዘንድ፣ በዝርዝር 3.43 ላይ ያለው ስረ ማዘዋወርያ ላይ ከፊቱ አንድ የአስተያየት ምልክት አድርጉ (ዝርዝር 3.45)፡፡ (በክፍል 4.2 ውስጥ ስለ ሩቢ አስተያየቶች በበለጠ እንነጋገራለን፡፡) ከዚያም ከፊቱ ያደረጋችሁትን የአስተያየት ምልክት አስወግዱ፤ ስለሆነም ፈተናው አረንጓዴይሆናል (ሁሉ ነገር ቀድሞ ወደነበረበት ይዘት ማለት ወደ ዝርዝር 3.43 ይመስላል ማለት ነው)፡፡
ዝርዝር 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
ዝርዝር 3.45: የስረ ማዘዋወርያው ይወድቅ ዘንድ አንድ አስተያየት ማድረግ። ቀይ 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.5 ማጠቃለያ

ይህ ምዕራፍ ከውጪ ሲታይ ይህንን አከናውኗል ለማለት ያስቸግራል፣ በቋሚ ገጾች ጀምረን በአብዛኛው በሚለዋወጡ ገጾች ጨርሰናል። ነገር ግን አቀራረቦቹ የሚያታልሉ ናቸው፤ የሬይልስ መቆጣጠሪያወች፣ ተግባሮች እና ትይታወችን በማበልጸግ አንጻር አሁን የፈለግነውን ያህል ተለዋዋጪ ይዞታዎች በጣቢያችን ላይ ለማከል የሚያስችል አንድ ችሎታ አለን፡፡ ይህ እንዴት እንደሚሆን ማሳየቱ የዚህ ስልጠና ቀሪ ስራው ይሆናል።

ከመቀጠላችን በፊት ለውጦቹን ወደ ርእስ ቅርንጫፉ ለመቀላቀል አንድ ደቂቃ እንወስድ እና ክዚያ ወደ ዋና ቅርንጫፉ እናዋህዳቸው። ከዚህ በፊት ክፍል 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 የሚል ቅጥል ስም ያለው የድር አድራሻ በመጠቀም ድራችሁን ከማስተናገድ ይልቅ፣ አንድ ብጁ ግዝአትን በመጠቀም ድራችሁን በሃረኩ ጣቢያ ላይ እንዴት ማስተናገድ እንደምትችሉ ለማወቅ ማለት ስለዚህ ጉዳይ የነጻ ትምህርት ለማግኘት በብጁ ግዝአት ላይ መሰረታዊ እውቀትን ለማግኘት የሚያስፈልገውን ተማርን ጎብኙ፡፡

3.5.1 በዚህ ምዕራፍ ውስጥ የተማርናቸው ነገሮች:-

  • አዲስ ማዘዋወርያወች በአዋቅር/ማዘዋወርያወች/አርቢ (config/routes.rb) ፋይል ውስጥ እንደሚበየኑ፣
  • የ‘ሬይልስ (rails) ትእዛዝ rails generate controller የመቆጣጠሪያስም (ControllerName) <አማራጪ የተግባር ስሞች > አንድ አዲስ መቆጣጠሪያን እንደሚያመነጪ፣
  • የሬይልስ ትይታወች ቋሚ ሃ.ጽ.መ.ቋን ወይም ክት ሩቢን (ክ.ሩ ERb) ሊይዙ እንደሚችሉ፣
  • ፈተና-መሬ ብልጸጋ አንድ የ “ቀይ፣ አረንጓዴ፣ ማጣራት” ዑደትን እንደሚጠቀም፣
  • ራስሰሬ ፈተና አዳዲስ ገጸባህሪያትን ለማበልጸግ የሚረዱ የፈተና ስብስቦችን ለመጻፍ እንደሚያስችለን፣ (ኮዱን) ለማጣራት በራስ የመተማመን ችሎታን እንደሚሰጡ፣ እና ምልሰቶችን እንደሚይዙ፣
  • የሬይልስ ገጽታወች በአፕልኬሽናችን ውስጥ፣ ገጾች አንድ የጋራ ዝግጁገጽታ እንዲጠቀሙ እንደሚፈቅዱ፣ በዚህ ምክንያትም የኮድ ድግግሞሽን እንደሚያስወግዱ እና
  • ለሶስተኛ ጊዜ ከዜሮ ተነስተን አንድ አዲስ የሬይልስ አፕልኬሽንን ለመፍጠር ሙሉ ቅደመ ተከተሎችን ማድረግን፣ አስፈላጊ እንቁወችን መጫንን፣ ወደ አንድ ሩቅ ማከማቻ መግፋትን፣ ከዚያም አፕልኬሽኑን በምርት ላይ ማሰማራትን ተምረናል።

3.6 የላቀ የፈተና መዋቅር

ይህ በምርጫ ሊደረግ የሚችል ክፍል በሩቢ ኦንሬይልስ ስልጠና የቪድዮ ስልጠና ውስጥ ጥቅም ላይ የዋለውን የፈተና መዋቅርን ያብራራል። እዚህ ላይ ሁለት ዋና ነገሮች አሉ፤ እነሱም:- አንድ የተሻሻለ የማለፍ/የውድቀት ዘጋቢ (ክፍል 3.6.1)፤ እና የፋይል ለውጦችን የሚለይ እና ተጓዳኝ ፈተናወችን በራስሰር የሚያስኬድ አንድ ራስሰሬ ፈተና አካሂያጅ ናቸው። (ክፍል 3.6.2)። በዚህ ክፍል ውስጥ ያለው ኮድ የመጠቀ እና ፈተናወችን ለመፈተን ምቹ ለማድረግ ብቻ የቀረበ ነው፤ በዚህ ጊዜ ይህን እንድትረዱት አይጠበቅባችሁም።

በዚህ ክፍል የሚደረጉ ለውጦች በዋና ቅርንጫፉ ላይ መደረግ አለባቸው:-

$ git checkout main

3.6.1 ሚኒቴስት ሪፖርተር

ምንም እንኳን የደመና ቅ.ማ.አን ጨምሮ ብዙ ስርዓቶች ለቀይ እና ለአረንጓዴ የፈተና ስብስቦች ተገቢዎቹን ቀለሞች ቢያሳዩም የሚኒቴስት ሪፖርተርስ እንቁን በፈተና ስርዓት ውስጥ ማከሉ ግን በፈተናው ውጽዓቶች ላይ በተወሰነ መልኩ ደስ የሚያሰኝ መልክን ይሰጣል፤ ስለዚህ በዝርዝር 3.46 ውስጥ ያለውን ኮድ በቴስት ሃልፐር ፋይላችሁ 19 ውስጥ እንድታክሉት እመክራለሁ፤ በዚህ ምክንያትም አፕልኬሽናችሁ በዝርዝር 3.2 ውስጥ የተካተተውን ማለት የ minitestreporters እንቁን ይጠቀማል ማለት ነው።

ዝርዝር 3.46: ፈተናው አረንጓዴእና ቀይ እንዲያሳይ ማዋቀር። 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 ላይ ይታያል፡፡

images/figures/red_to_green
ምስል 3.11: በደመና ቅ.ማ.አው ላይ ከ ቀይ ወደ አረንጓዴ መሄድ።

3.6.2 ራስሰሬ ፈተናዎች ከጋርድ ጋር

የ‘ሬይልስ ፈትን (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) የአማርኛ ትርጉም ያካተተውን ፈተና ያስኬድልን ዘንድ፣ የአማርኛ ትርጉሙ የተጠቀመበትን የፈተና ኮዶች በጋርድ ፋይል ውስጥ እንዳከልናቸው ልትገነዘቡ ይገባል።

ዝርዝር 3.47: አንድ የተበጀ የ‘ጋርድፋይል (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> መቀበያ ላይ ብቻ ምቱ፡፡

images/figures/guard
ምስል 3.12: በደመና ቅ.ማ.አ ላይ ጋርድን መጠቀም።

ከጋርድ ለመውጣት፣ “ተቆር-ዲን (Ctrl-D)” ተጫኑ። በጋርድ ላይ ተጨማሪ ተዛማጆችን ለማከል፣ በዝርዝር 3.47 ውስጥ፣ በጋርድ አንብቡኝ እና በጋርድ ዊኪ ላይ ያሉት ምሳሌዎች ላይ ተጣቀሱ፡፡

የፈተና ስብስቡ ያለ ምንም ምክንያት ሳይጀምር ከቀረ፣ ከጋርድ ውጡ፣ ስፕሪንግን አቁሙ እና እንደገና አስጀምሩት (ስፕሪንግ:- ሬይልስ ፈተናወችን ለማፋጠን የሚያግዝ መረጃዎችን ቀድሞ ለመጫን የሚጠቀምበት እንቁ ነው):-

$ bin/spring stop  # ፈተናወቹ ባልታወቀ ምክንያት መጀመር ካልቻሉ ይህንን ትእዛዝ ሞክሩ፡፡
$ bundle _2.2.17_ exec guard

ከመቀጠላችሁ በፊት ለውጦቻችሁን ማከል እና መቀላቀል አለባችሁ:-

$ git add -A
$ git commit -m "የላቀ ፈተና መዋቅሩን ማጠናቀቅ"
1. የደመና ቅ.ማ.አን እየተጠቀማችሁ ከሆነ፣ “Goto Anything” የሚለውን ትእዛዝ መጠቀም አስፈላጊ ነው። ይህም የምትፈልጉትን የፋይል ስም ገና ግማሹን ስትጽፉ፣ የፋይል ስርዓቱን በፍጥነት በመዳሰስ የምትፈልጉትን ፋይል ያቀርብላችኋል። በዚህ አውድ ውስጥ፣ አንድ ፕሮጀክት ውስጥ ሶስት አፕልኬሽኖች (ሰላምታ (selamta)፣ ጨዋታ (chewata) እና ማሳያ (masaya)) ስላሉ፣ በዚህ ምክንያት ደግሞ ብዙ የጋራ ስሞች ስላሉ፣ የ “Goto Anything” ትእዛዝን መጠቀሙ አመች አይሆንም። ለምሳሌ:- የ “Gemfile” ፋይልን በምንፈልግበት ጊዜ፣ ስድስት አማራጮች በዝርዝር ይታያሉ፣ ምክንያቱ ደግሞ እያንዳንዱ ፕሮጀክት እንቁፋይል (Gemfile) እና እንቁ.ቆልፍ (Gemfile.lock) የተባሉ ተዛማጅ ፋይሎች ስላሉት ነው። ስለዚህ ከመቀጠላችሁ በፊት፣ የመጀመሪያዎቹን ሁለት አፕልኬሽኖች ማስወገድ ያስፈልጋችሁ ይሆናል፤ ይህንን ለማድረግ የምትችሉት ደግሞ ወደ አካባቢ ማውጫ በመሄድ እና ከዚያ የ rm -rf selamta/ chewata/ ትእዛዝን በማስኬድ ይሆናል (ሰንጠረዥ 1.1)። (ተዛማጆቹን ማከማቻዎች ወደ ጊትሃብ እስከገፋችሁ ድረስ፣ በፈለጋችሁበት ጊዜ ማከማቻችሁን መልሳችሁ ማግኘት ትችላላችሁ።)
2. https://github.com/mhartl/samlpe_app_6th_ed
3. የ‘ሰፈር ያለ ‘ምርት’ (–local without 'production') ትእዛዝ “የ‘ታወሰ ምርጫ (remembered option)”መሆኑን ማወቁ ጥሩ ነው፤ ይህ ማለትም ለሚቀጥለው ጊዜ የ‘ጠቅል ጫን (bundle install) ትእዛዝን በምናስኬድበት ወቅት እሱ በራስሰር አብሮ ይካተታል ማለት ነው።
4. የማበልጸጊያ እና የምርት አካባቢወች በተቻለ መጠን፣ በሁሉ ነገር ተቀራራቢ እንዲሆኑ ማድረግ ጥሩ ሃሳብ ነው፤ ይህም ፍጹም አንድ አይነት ውሂበጎታ መጠቀምን ያካትታል፤ ስለሆነም ይህንን ስልጠና ስትጨርሱ፣ በማበልጸግ ስራ ውስጥ እንዴት ፖስትግሬስተ.መ.ቋን መጫን እና ማዋቀር እንደሚቻል ለመማር እንድትሞክሩ እመክራለሁ፤ አሁን ግን ጊዜው አይደለም። ጊዜው ሲደርስ “<ስርአታችሁ> ላይ ፖስትግሬስተ.መ.ቋን መጫን እና ማዋቀር (install configure postgresql <your system>)” እና “ሬይልስን ለፖስትግሬስተ.መ.ቋ ማዘጋጀት (rails postgresql setup)” በማለት ጎግል ላይ ፈልጉ፣ ከዚያም ለስራ ተዘጋጁ። (በደመና ቅ.ማ.አ ላይ <ስርአታችሁ (your system)> የሚለው ኡባንቱ (ubuntu) ነው።)
5. እኔ እራሴ የጻፍኩት፣ ለአፕልኬሽኑ የይፋ የትግበራ ማጣቀሻ የሚሆን አንድ የፈቃድ ፋይልም በኤምዲ ፋይል (.md) ቀርቧል። አፕልኬሽናችሁ የተሟላ እንዲሆን ከፈለጋችሁ ከጊትሃብ በማውረድ ፋይሉን አፕልኬሽናችሁ ላይ መገልበጥ ትችላላችሁ፡፡ ይህንን ስልጠና ለመከታተል ግን እንደ አስፈላጊ ነገር ሁኖ የሚወሰድ አይደለም።
6. ቛሚ ገጾቻችንን ለመስራት የምንጠቀምበት ዘዴ በአጋጣሚ ቀላል ነው፤ ነገር ግን ይህ ብቸኛው መንገድ አይደለም። ይህንን ለመስራት የምትጠቀሙበት መንገድ በፍላጎታችሁ ላይ ይወሰናል። ብዙ የሆኑ ቛሚ ገጾችን የምትጠቀሙ ከሆነ፣ የ‘ቛሚ ገጾች (Quami Getss) መቆጣጠሪያን መጠቀሙ አድካሚ ይሆናል፤ እኛ ግን በአፕልኬሽናችን ውስጥ የምንፈልገው ጥቂት ቛሚ ገጾችን ብቻ ነው። ብዙ ቛሚ ገጾችን የምትፈላጉ ከሆነ በቶውትቦት የቀረበውን high_voltage የተባለውን እንቁ ተመልከቱ።
7. ብዙ የሬይልስ አበልጻጊወች ሬይልስ (rails) የተባለውን ትእዛዝ ለማሳጠር ( በ በጽሑፍ አርታኢ ላይ መሰረታዊ እውቀትን ለማግኘት የሚያስፈልገውን ተማር ላይ እንደተገለጸው) ሬ (r) የተባለ ተለዋጪ ስምን ይጠቀማሉ። ይህ ደግሞ የሬይልስ ድር አገልጋይን ለማስኬድ ሬ አ (r s) ብለን እንድንጽፍ ያስችለናል ማለት ነው።
8. ለምሳሌ “ፈ.መ.ብ ሙቷል፡፡ እድሜ ለፈተና” የሚለውን ማለት ሬይልስን በሰራው፣ በዴቪድ ሄይኒሚየር ሃንሰን የተጻፈውን መጣጥፍ ተመልከቱ።
9. በተፈጥሮ የ‘ሬይልስ ፈትን (rails test) ትእዛዝ ፈተናወች ሲወድቁ በቀይ የተጻፉ የፈተና ውጤቶችን ያሳያል፤ ነገር ግን ፈተናወች ሲያልፉ በአረንጓዴ የተጻፉ የፈተና ውጤቶችን አያሳይም። ትክክለኛውን የቀይ–አረንጓዴ ዑደትን ለማስተካከል ክፍል 3.6.1 ‘ን ተመልከቱ።
10. ሃ.ጽ.መ.ቋ ከጊዜ ጋር ይለዋወጣል፤ የሰነድ አይነቱን ከወዲሁ ግልጽ አድርጎ በማቅረብ ለወደፊት አሳሾቹ እኛ የምንፈልገው ዓይነት የድር ገጾችን እንዲያቀርቡ እናደርጋለን። ይህ:- <!DOCTYPE html> የ‘ሃ.ጽ.መ.ቋ5 (HTML5) ዘመናዊው የሃ.ጽ.መ.ቋ ሰነድ መስፈርት ነው፡፡
11. ይህንን ትርጉም እየጻፍኩኝ አንድ ጓደኛየ “ያቃልልናል” የሚለውን፡ የመጨረሻውን ቃል በአንክሮ ተመለከተና፡ “ ምንድነው ይሄ ሁሉ ያይናማ ብዛት?” ብሎ ጠየቀኝ፣ ጥያቄው አይመችም?! ውነቱን ነው፤ ካለ “ና” በስተቀር ሁሉም ሆሄወች አንደ ኤደን ዓይናሞች ናቸው፡፡
12. የተለመዱ የሚኒቴስት ማረጋገጫዎች ዝርዝርን ለማየት፣ በሬይልስ የፈተና መመሪያዎች ዓምድ ውስጥ የሚገኘውን የማረጋገጫ ሰንጠረዥን ተመልከቱ።
13. ሃምል (Haml) የተባለ ሁለተኛ ታዋቂ የዝግጁገጽታ ስርዓት አለ፣ እኔ በበኩሌ ይህንን እወደዋለሁ፤ ነገር ግን በእንዲህ አይነቱ የጀማሪወች ስልጠና ላይ እሱን ሙሉ በሙሉ መጠቀሙ አሁን ደረጃው አይደለም (አስተውሉ “ሃምል (HAML) ሃ.ጽ.መ.ቋ አይደለም”)።
14. ልምድ ያላቸው የሬይልስ አበልጻጊወች በዚህ ጊዜ ይዘት_ለ (content_for) የተባለውን ሥልት ለመጠቀም ተስፋ አድርገው ይሆናል። ነገር ግን እሱ በንብረት ቧንቧመስመር (asset pipeline) ላይ በትክክል አይሰራም። እሱን የሚተካው ሥልት አቅርብ (provide) ነው።
15. ሩቢን ከዚህ በፊት አጥንታችሁት ከሆነ፣ ሬይልስ ይዞታዎችን ወደ ጥምሩ እያስረከበ መሆኑን ልትጠረጥሩ ትችሉ ይሆናል፤ ይህ ጥርጣሬያችሁም እውነት ነው፤ ነገር ግን አፕልኬሽኖችን በሬይልስ ለመስራት ይህንን ማወቁ አያስፈልጋችሁም።
16. ቅጠሉህ (stylesheet) ለሚታተም/ለሚታይ/ለሚቀርብ ይዘት፣ እንደ የገጽ ገጽታ መግለጫዎች ያሉ ትርጓሜዎችን ለመተግበር የሚያገለግል ኮድ የያዘ አንድ የጽሑፍ ፋይል ነው፡፡
17. ይህ መልመጃ በክፍል 5.3.1 ውስጥ ተመልሷል፤ ማለት ፍችው ተሰቷል።
18. የስፕሪንግ ሂደት መታወቂያ (pid) ፋይል በምታዋህዱት ይዘት ይተካል የሚል የስህተት መልእክት ካገኛችሁ፣ የማዘዥያ መስመራችሁ ላይ ይህንን rm -f *.pid ትእዛዝ በመጠቀም ያለውን ችግር ማስወገድ ትችላላችሁ፡፡ በነገራችን ላይ ስፕሪንግ ሬይልስ ፈተናወችን ለማፋጠን የሚያግዝ መረጃዎችን ቀድሞ ለመጫን የሚጠቀምበት እንቁ ነው።
19.ዝርዝር 3.46 ውስጥ ያሉት ኮዶች በነጠላ እና በድርብ ትምህርተ ጥቅስ ውስጥ የገቡ ሃረጎችን ደባልቆ ያቀርባል። ይህ የሆነበት ምክንያት፣ የሬይልስ አዲስ (rails new) ትእዛዝ በነጠላ ትምህርተ ጥቅስ ውስጥ የገቡ ሃረጎችን ስላመነጨ እና የሚኒቴስት ሪፖርተርስ እንቁ በስነዳው ላይ በድርብ ትምህርተ ጥቅስ ውስጥ የገቡ ሃረጎችን ስለሚጠቀም ነው። እንደዚህ ዓይነት የመቀላቀል ተግባር በሩቢ ውስጥ የተለመደ ባህሪ ነው፡፡ ለበለጠ መረጃ ክፍል 4.2.1 ‘ን ተመልከቱ፡፡