ምዕራፍ 2 የጨዋታ አፕልኬሽን

በዚህ ምዕራፍ ውስጥ፣ ጥቂት የሬይልስ ችሎታወችን ለማሳየት፣ አንድ ጨዋታ የተባለ የማሳያ አፕልኬሽንን እናበለጽጋለን። የዚህ ምዕራፍ ዋናው አላማ፣ የሩቢ ኦን ሬይልስ ፕሮግራምን ማለት የአንድ ድር አበለጻጸግን አጠቃላይ ግንዛቤ ለማግኘት፣ መወጣጫ በመባል የሚታወቀውን፣ የኮድ ማመንጫ በመጠቀም፣ ቶሎ ቶሎ ኮዶችን ማመንጨት ነው። ይህ መወጣጫም በርካታ ተግባራትን በራስሰር ይፈጥራል። በሳጥን 2.1 ላይ እንደተገለጸው፣ ቀሪው የመጽሐፉ ክፍሎች ተቃራኒውን ስልት ይጠቀማሉ፤ ነገር ግን ከመቅጽበት አስደሳች ውጤትን ለማግኘት እና በፍጥነት ለመስራት፣ ከመወጣጫ ስልት ጋር የሚስተካከል የአሰራር ዘዴ የለም። የማሳያ አፕልኬሽኑን በምንሰራበት ጊዜ ክብደት እየጨመረ በሄደ ቁጥር፣ እግረ መንገዳችን ላይ የሚያጋጥሙንን አዳዲስ ሃሳቦች እናብራራለን። ከዚህ የሚገኘው የጨዋታ አፕልኬሽን በዓ.አ.ሃ.አወቹ በኩል እንድንተጋበር/እንድንገናኝ እና በሬይልስ የሚወደደውን የመጀመሪያውን አንድ የው.ሁ.ማ (REST) መዋቅር ምሳሌን ጨምሮ፣ የሬይልስ አፕልኬሽንን ውስጣዊ አወቃቀር እንድናይ ያስችለናል።

የጨዋታ አፕልኬሽኑ፣ ከሱ ቀጥለን እንደምንሰራው የማሳያ አፕልኬሽን፣ የአፕልኬሽኑን ተጠቃሚዎች እና ከተጠቃሚወቹ ጋር የሚዛመዱትን አጪርጽሑፎች ይይዛል (ማለት በጥቂቱ የትዊተር አፕ ቅጥን የያዘ ይሆናል)። ተግባራዊነቱ ሙሉ በሙሉ ያልዳበረ እና እንጪጪ ይሆናል፣ በተጨማሪም ብዙወቹ ሂደቶቹ አስማት ይመስላሉ፣ ነገር ግን በዚህ አትጨነቁ፣ ከምዕራፍ 3 ጀምረን አንድ ይህንን እራሱን የሚመስል አፕልኬሽን ከባዶ ተነስተን ማበልጸግ እንጀምራለን፤ እና ይህንን አፕልኬሽን ሰርተን ስንጨርስ በዚሁ ሞያ ላይ ለመጪው ጊዜ ሊያገለግሏችሁ የሚችሉ አስፈላጊ ማጣቀሻወችን እሰጣችኋለሁ። አሁን ግን ዕምነትና ትነሽ ትእግስት ይኑራችሁ። የዚህ ስልጠና ዋናው አላማ ስለ ሬይልስ ሰፊ ዕውቀት እንዲኖራችሁ ማድረግ እና እናንተን በመወጣጫ ከተዘጋጀ አቅርቦት ባሻገር ማድረስ ነው።

ሳጥን 2.1. መወጣጫ፡- ፈጣን፣ ቀላል እና በጣም አታላይ።

ገና ከጅማሬው የሬይልስ ፈጣሪ በሆነው ዴቪድ ሄይንማየር ሃንሰን በተዘጋጀችው፣ በ 15 ደቂቃ ውስጥ የተሰራ ድርን በሚያሳይ አንድ ቪዲዮ ምክንያት፣ ብዙዎች ሬይልስን ለመጠቀም፣ ይሄ ነው የማይባል ጉጉት አድሮባቸው ነበር። ያ እና ተከታታዮቹ ቪዲዮወች የሬይልስ ችሎታን ለማቛደስ ጥሩ ምሳሌዎች ናቸው፤ እናም እነሱን እንድትመለከቷቸው ከወዲሁ ምክሬን እለግሳለሁ፡፡ በነገራችን ላይ አበልጻጊው ያን የመሰለ ድንቅ የአስራ አምስት ደቂቃ ስራ፣ ለማከነወን የተጠቀመው መወጣጫ የተባለውን ገጸባህሪ እንደነበር ልትገነዘቡ ይገባል፤ ይህም በከፍተኛ ደረጃ በሬይልስ የ‘መወጣጫ ፍጠር (generate scaffold) ትእዛዝ ምትሃታዊ ፈጠራ የመነጨ ኮድ ላይ ጥገኛ የሆነ ነው። አንድ የሩቢ ኦን ሬይልስ ስልጠናን መጻፍ በሚፈለግበት ጊዜ፣ የመወጣጫ አቀራረብ ላይ ለመታመን ያስከጅላል፤ የመወጣጫ አሰራሩ ፈጣን፣ ቀላል እና በጣም አታላይ ነው፤ ሆኖም የመወጣጫ ኮድ ብዛት እና ውስብስብነት ለአዲስ ሬይልስ አበልጻጊ አስቸጋሪ ሊሆን ይችላል። ይህም ቢሆን ልትጠቀሙበት ትችሉ ይሆናል፤ ነገር ግር ልትረዱት አትችሉም። የመወጣጫን ዘዴ መጠቀም አደጋ ላይ እንድትጋለጡ ያደርጋችኋል፤ በቀላሉ የሚቀጪ አነስተኛ የሬይልስ ዕውቀት እና አንድ ልዩ ኮድ የማመንጨት ችሎታ ያለው ሰው ሁናችሁ ትቀራላችሁ።

እኛ በሩቢ ኦን ሬይልስ ስልጠና ውስጥ፣ ከመወጣጫ አሰራር ጋር ጪራሽ አፍ እና ቂጥ (ተቃራኒ) የሆነ አሰራርን እንከተላለን። በምዕራፍ 2 ላይ መወጣጫን በመጠቀም አንድ የጨዋታ አፕልኬሽን ብናዘጋጅም ዋናው ትኩረታችን ግን፣ የሬይልስ ስልጠና ስር መሰረት በሆነው፣ የማሳያ አፕልኬሽኑ ላይ ነው፤ እናም ለዚህ አፕልኬሽን የሚያስፈልገውን ኮድ፣ በምዕራፍ 3 ላይ መጻፍ እንጀምራለን፡፡ በያንዳንዱ በማሳያ አፕልኬሽኑ የዝግጅት ሂደት ላይ፣ የተመጠኑ እና ለመረዳት የቀለሉ ሆኖም ዕውቀታችሁን ለመፈተን ብቃት ያላቸው፣ አዲስና እንግዳ ኮዶችን እንጽፋለን። ከዚህ የምታካብቱት ውጤት አንድ ጥልቅ እና እንደልብ የሚገራ የሬይልስ እውቀት ሲሆን፣ እሱም ማንኛውንም አይነት የድር አፕልኬሽን ለመጻፍ አንድ ጥሩ ዳራን/ችሎታን ይሰጣችኋል።

2.1 አፕልኬሽኑን ማቀድ

በዚህ ክፍል ውስጥ፣ ለጨዋታ አፕልኬሽናችን የሚሆነውን እቅድ እነድፋለን፡፡ በክፍል 1.2 ላይ እንዳደረግነው፣ የ‘ሬይልስ አዲስ (rails new) ትእዛዝን በመጠቀም፣ የአፕልኬሽናችን መሰረት ከአንድ የተወሰነ የሬይልስ ስሪት ቁጥር ጋር በዚህ መልኩ እናመነጫለን:-

$ cd ~/አካባቢ
$ rails _6.1.4.1_ new chewata
$ cd chewata/

ክፍል 1.1.1 ውስጥ እንደተመከረው የደመና ቅ.ማ.አን እየተጠቀማችሁ ከሆነ፣ ልክ እንደመጀመሪያው፣ ይህ ሁለተኛው አፕልኬሽንም በአንድ አካባቢ ላይ መፈጠር እንደሚችል አስተውሉ። ሌላ አንድ አዲስ አካባቢን መፍጠር አስፈልግም። ፋይሎቹ እንዲታዩ ለማድረግ፣ ፋይል ዳሳሽ ቦታው ላይ፣ ጥርሳማ ክብ አዶው ላይ ጠቅ በማድረግ “Refresh File Tree” የሚለውን መምረጥ ሊኖርባችሁ ይችል ይሆናል።

ከዚያ ቀጥሎ፣ አንድ የጽሑፍ አርታኢን በመጠቀም፣ በጠቅላይ የሚፈለገውን የ‘እንቁፋይል (Gemfile) በዝርዝር 2.1 ውስጥ ባለው ይዘት ማዘመን ይሆናል።

ጠቃሚ ማሳሰቢያ፡- በዚህ መጽሐፍ ውስጥ ላሉት እንቁዎች ሁሉ፣ ከዚህ በታች ከተዘረዘሩት እንቁዎች ይልቅ፣ በ gemfiles-6th-ed.railstutorial.org ላይ የተዘረዘሩትን እንቁዎች መጠቀም ይኖርባችኋል (ምንም እንኳን ተመሳሳይ እንቁዎች ቢመስሉም)፡፡

ዝርዝር 2.1: ለጨዋታ አፕልኬሽን የሚሆን አንድ የ‘እንቁፋይል (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 'rack-mini-profiler', '2.3.1'
  gem 'listen',             '3.4.1'
  gem 'spring',             '2.1.1'
end

group :test do
  gem 'capybara',           '3.35.3'
  gem 'selenium-webdriver', '3.142.7'
  gem 'webdrivers',         '4.6.0'
end

group :production do
  gem 'pg', '1.2.3'
end

# ዊንዶውስ የዞን መረጃ ፋይሎችን አያካትትም፤ ስለሆነም፣ በአንድ የቤተኛ የዊንዶውስ ስርዓት
# ላይ፣ ሬይንስን የምታካሂዱ ከሆነ፣ የሚከተለው እንቁ ላይ ያለውን የአስተያየት ምልክት ማስወገድ
# ይኖርባችኋል:-
# gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

ዝርዝር 2.1 ይዞታ ከዝርዝር 1.23 ይዞታ ጋር ፍጹም አንድ ዓይነት እንደሆነ አስተውሉ።

ክፍል 1.4.1 ላይ እንዳደረግነው ሁሉ፣ የምርት እንቁወችን በሰፈር እንቁወች ላይ መጫንን ለመከላከል፣ ጠቅል ሰፈርን ያለ ‘ምርት’ በማዘጋጀት አዋቅርን (bundle config set –local without 'production') በመጠቀም፣ የሚያስፈልጉን እንቁወችን እንደሚከተው አድርገን እንጪናለን:-

$ bundle _2.2.17_ config set --local without 'production'
$ bundle _2.2.17_ install

ክፍል 1.2.1 ውስጥ እና እንዲሁም በሳጥን 1.2 ላይ እንደተጠቀሰው፣ የ‘ጠቅል አዘምን (bundle update) ትእዛዝን ማስኬድ ይኖርባችሁ ይሆናል። በዚህ ወቅት በተጨማሪም፣ በ “The dependency tzinfo-data” የሚጀምር አንድ የማስጠንቀቂያ መልእክትን ልታገኙ ትችላላችሁ፤ ይህንን ፊት በመንሳት ስራችሁን መቀጠል ትችላላችሁ።

በመጨረሻም፣ አፕልኬሽኑን በጊት የስሪት ቁጥጥሩ ስር እናስቀምጠዋለን:-

$ git init
$ git add -A
$ git commit -m "ማከማቻ ማስጀመር"

ክፍል 1.3.3 ላይ ለ “ዓለም እንዴት ነሽ!” የተጠቀምነውን የአሰራር ስልት በመከተል፣ በጊትሃብ ላይ አንድ አዲስ ማከማቻ መፍጠር እና ከዚያ ወደ ሩቁ ማከማቻ መግፋት ይኖርባችኋል (ምስል 2.1 ላይ እንደሚታየው፣ ማከማቻውን በናንተ ብቻ የሚታይ ማለት የግል ማድረግ ይኖርባችኋል)፡-

$ git remote add origin https://github.com/<የተጠቃሚስም>/chewata.git
$ git push -u origin main
images/figures/create_demo_repository
ምስል 2.1: በጊትሃብ ላይ ጨዋታ ለተባለው አፕልኬሽን አንድ ማከማቻን መፍጠር።

በመጨረሻም፣ አፕልኬሽኑን ለማሰማራት ጊዜው ገና አይደለም፣ ለዚህም በዝርዝር 2.2 እና በዝርዝር 2.3 ላይ እንደታዩት ክፍል 1.2.4 ውስጥ የ “ዓለም እንዴት ነሽ!” ሂደቶች ላይ የተጠቀምናቸውን ሂደቶች እንድትከተሉ እመክራችኋለሁ።

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

  def selamta
    render html: "ዓለም እንዴት ነሽ!"
  end
end
ዝርዝር 2.3: ስረ ማዘዋወርያን ማቀናበር። config/routes.rb
Rails.application.routes.draw do
  root 'application#selamta'
end

ለውጦቹን ከቅርንጫፉ ጋር ቀላቅሉ እና፣ ከዚያ በአንድ ጊዜ ቅርንጫፉን ወደ ሃረኩ እና ወደ ጊትሃብ ግፉት። የሁለቱንም ማለት የሃረኩ እና የጊትሃብ ቅጂዎችን አንድ ዓይነት እንዲሆኑ ማድረጉ አንድ ጥሩ ሃሳብ ነው።

$ git commit -am "ሰላምታን መጨመር"
$ heroku create
$ git push && git push heroku main

ወደ ጊትሃብ እና ሃረኩ ቅርንጫፉን በአንድ ጊዜ ስንገፋ፣ ሁለቱን የጊት ግፋ (push) ትእዛዛትን ለማጣመር፣ እዚህ ላይ ሁለት እናወችን ማለት ኤምፐርሳንድ የተባለውን የስሌት ምልክትን && ተጠቅመናል፤ እዚህ ላይ ሁለተኛው ትእዛዝ የሚፈጸመው፣ የመጀመሪያው ከተሳካ ብቻ ይሆናል (ይህ የስሌት ምልክት && “እና” ተብሎ ይነበባል)።1

ልክ እንደ ክፍል 1.4 ለአሁኑ ችላ መባል የሚገባቸው፣ አንዳንድ የማስጠንቀቂያ መልእክቶችን ልታዩ ትችላላችሁ፡፡ በክፍል 7.5 ላይ እንደሚሆን እናደርጋቸዋለን፡፡ ከሃረኩ አፕ ዓ.አ.ሃ.አ በስተቀር ውጤቱ ከምስል 1.31 ጋር አንድ ዓይነት መሆን አለበት።

2.1.1 የተጠቃሚዎች የውሂብ ቅርጸት

አሁን አፕልኬሽኑን መስራት ለመጀመር ዝግጁ ነን። አንድ የድር አፕልኬሽንን ለመስራት የመጀመሪያው ሂደት፣ ለአፕልኬሽኑ አስፈላጊ የሆነውን መዋቅር የሚያሳይ አንድ የውሂብ ቅርጸትን (Data Model) መፍጠር ነው፤ ይህም በአፕልኬሽናችን መካከል ያሉትን ግንኙነቶ ጨምሮ፣ ለአፕልኬሽናችን የሚያስፈልጉ መዋቅሮችን የሚወክል አንድ መወከያ ነው። በእኛ ሁኔታ፣ የጨዋታ አፕልኬሽኑ ተጠቃሚዎች እና አጪርጽሑፎችን ብቻ የያዘ፣ አንድ የትዊተር ዓይነት ማይክሮብላግ ይሆናል። ስለዚህ በዚህ ክፍል ውስጥ፣ በአፕልኬሽኑ ላይ አንድ የተጠቃሚዎች ቅርጸትን በመስራት እንጀምር እና ከዚያ በክፍል 2.1.2 ላይ አንድ የአጪርጽሑፎች ቅርጸትን እንጨምረለን።

ብዙ ዓይነት የድር መመዝገቢያ ቅጾች እንዳሉ ሁሉ፣ የአንድ ተጠቃሚ የውሂብ ቅርጸትን ለመስራትም፣ እንዲሁ ብዙ ምርጫዎች አሉ፤ እኛ ግን ነገሮችን ለማቅለል፣ አንድ ቀለል ያለ መንገድን እንጠቀማለን፡፡ የጨዋታ አፕልኬሽናችን ተጠቃሚዎች፣ የራሳቸው ብቻ የሆነ (የውሂብ አይነቱ ሙሉ ቁጥር (integer)) መታወቂያ (id) የተባለ አንድ ልዩ ጠቋሚ፣ አንድ ማንም ሊያየው የሚችል ስም (sim) (የውሂብ አይነቱ ሃረግ (string)) እና እንዲሁም ከተጠቃሚ ስሙ በብዛቱ እጥፍ የሆነ፣ አንድ የ‘ኤመልእክት (emelekt) አድራሻ (ይሄም የውሂብ አይነቱ ሃረግ (string)) ይኖራቸዋል። (እዚህ ላይ ይህ አፕልኬሽን የመሕለፈቃል ባሕሪ (Attribute) እንደሌለው ልብ በሉ፤ ይሄ ሁኔታም ነው “የጨዋታ” አፕልኬሽን ለመሆን ያበቃው። ከምዕራፍ 6 ጀምሮ ስለ መሕለፈቃል አሰራር እንማራለን።) የተጠቃሚዎች የውሂብ ቅርጸት በምስል 2.2 ላይ ይታያል።

demo_user_model
ምስል 2.2: የተጠቃሚዎች የውሂብ ቅርጸት።

ክፍል 6.1.1 ጀምሮ እንደምንመለከተው፣ በምስል 2.2 ውስጥ ያለው የ‘ተጠቃሚዎች (teteqamis) መሰየሚያ፣ በውሂበጎታው ውስጥ ካለው ሰንጠረዥ ጋር ይጎዳኛል፤ እናም የ‘መታወቂያ (id) የ‘ስም (sim) እና የ‘ኤመልእክት (emelekt) ባሕሪወቹ፡ በሰንጠረዡ (Table) ውስጥ ልክ እንደ አምዶች (Columns) ይወሰዳሉ።

2.1.2 የአጪርጽሑፎች የውሂብ ቅርጸት

በመግቢያው ላይ እንደምታስታውሱት፣ አጪርጽሑፍ ማለት አንድ አጪር መልእክት ማለት ሲሆን፤ በተለይ ደግሞ “ትዊተር” የሚባለው ቃል፣ በትዊተር የተሰጠ ምርት ተኮር አጠቃላይ ስያሜ ነው፡፡ የአጪርጽሑፍ የውሂብ ቅርጸት፣ ከተጠቃሚዎች የውሂብ ቅርጸት የቀለለ ነው። የአጪርጽሑፍ የውሂብ ቅርጸቱ አንድ የ‘መታወቂያ (id) እና ለአጪርጽሑፉ መጻፊያ የሚሆን አንድ የ‘ይዘት (yizet) መስክ (የውሂብ አይነቱ ጽሑፍ (text)) ብቻ ይኖረዋል።2 ይሁን እንጂ አሁን አንድ ችግር አለ። እያዳንዱን አጪርጽሑፍ ከባለቤቱ (ከተጠቃሚው) ጋር ማዛመድ (Associate) እንፈልጋለን። ይህን ለማከናወን የአጪርጽሑፉን ባለቤት የመታወቂያ፣ ማለት የ‘ተጠቃሚ_መታወቂያ‘ውን (teteqami_id) በመዝገብ ላይ ማስፈር ይኖርብናል። ውጤቱ በምስል 2.3 ላይ ተመልክቷል።

demo_micropost_model
ምስል 2.3: የአጪርጽሑፎች የውሂብ ቅርጸት።

ክፍል 2.3.3 (እንዲሁም በምዕራፍ 13 ውስጥ ከዚህ በበለጠ በተሟላ መልኩ) የ‘ተጠቃሚ_መታወቂያ (teteqami_id) ባሕሪ፣ አንድ ተጠቃሚ ከእሱ ጋር የሚዛመዱትን ብዙ አጪርጽሑፎች እንዴት ግልጽ እና ቀላል በሆነ ሁኔታ እንደሚገልጽልን እንመለከታለን።

2.2 የተጠቃሚዎች ሃብት

በዚህ ክፍል ውስጥ፣ በክፍል 2.1.1 ያለውን የተጠቃሚዎች የውሂብ ቅርጸት፣ ከአንድ የድር በይነገጽ ጋር የማገናኘት ተግባርን እውን እናደርጋለን። የዚህ ውህደት አንድ የተጠቃሚዎች ሃብትን (Teteqamis Resource) ይመሰረታል፤ ይህም ተጠቃሚዎች በድር ውስጥ፣ በሃ.ጽ.ማ.ስ ስምምነት (HTTP protocol)3 በኩል ሊፈጠሩ፣ ሊነበቡ፣ ሊዘመኑ እና ሊሰርዙ የሚችሉ ቁሶች እንደሆኑ አድርገን እንድናስብ ያስችለናል፡፡ በመግቢያው ላይ ቃል በተገባው መሰረት፣ የተጠቃሚወች ሃብታችን፣ ከእያንዳንዱ ሬይልስ ጋር በቓሚነት በሚመጣው በአንድ የመወጣጫ ማመንጫ ፕሮግራም ይፈጠራል። አሁን ባላችሁበት የዕውቀት ደረጃ ኮዱን ለመረዳት መሞከሩ፣ ድንብርብራችሁን ሊያወጣው ካልሆነ በስተቀር፣ ሌላ ለምንም አይጠቅማችሁም፣ ስለዚህ እኔ አሁን ምንም አይነት ትኩረት እንዳትሰጡት እመክራችኋለሁ።

የሬይልስ መወጣጫ የሚመነጨው፣ መወጣጫ (scaffold) የተባለውን ትእዛዝ ሬይልስ አመንጪ (rails generate) ወደተባለው ትእዛዝ በማሳለፍ ነው። የ‘መወጣጫ (scaffold) ትእዛዝ ነጋሪአሴት (Argument)፡ የሃብቱን አንድ የነጠላ ስም (በዚህ ጊዜ ተጠቃሚ (Teteqami)) እና ለውሂብ ቅርጸት ባህሪዎች የሚሆኑ አማራጪ ሰሚአሴቶችን (Parameters) ይይዛል:-4

$ rails generate scaffold Teteqami sim:string emelekt:string
invoke  active_record
   create    db/migrate/20201001192425_create_teteqamis.rb
   create    app/models/teteqami.rb
   invoke    test_unit
   create      test/models/teteqami_test.rb
   create      test/fixtures/teteqamis.yml
   invoke  resource_route
    route    resources :teteqamis
   invoke  scaffold_controller
   create    app/controllers/teteqamis_controller.rb
   invoke    erb
   create      app/views/teteqamis
   create      app/views/teteqamis/index.html.erb
   create      app/views/teteqamis/edit.html.erb
   create      app/views/teteqamis/show.html.erb
   create      app/views/teteqamis/new.html.erb
   create      app/views/teteqamis/_form.html.erb
   invoke    test_unit
   create      test/controllers/teteqamis_controller_test.rb
   create      test/system/teteqamis_test.rb
   invoke    helper
   create      app/helpers/teteqamis_helper.rb
   invoke      test_unit
   invoke    jbuilder
   create      app/views/teteqamis/index.json.jbuilder
   create      app/views/teteqamis/show.json.jbuilder
   create      app/views/teteqamis/_teteqami.json.jbuilder
   invoke  assets
   invoke    scss
   create      app/assets/stylesheets/teteqamis.scss
   invoke  scss
   create    app/assets/stylesheets/scaffolds.scss

ስም:ሃረግ (sim:string) እና ኤመልእክት:ሃረግ (emelekt:string) የተባሉ መስኮችን በማካተት፤ የተጠቃሚ ቅርጸቱ በምስል 2.2 ላይ ያለውን መልክ እንዲይዝ አድርገናል። (እዚህ ላይ፣ ለ‘መታወቂያ (id) አንድ ሰሚአሴትን ማካተት አስፈላጊ አለመሆኑን ልብ በሉ፤ ይህ የሆነበት ምክንያት፣ በውሂበጎታው ውስጥ እንደ ዋና ቁልፍ (primary key) ሆኖ ያገለግል ዘንድ፣ ሬይልስ ራሱ መታወቂያውን በራስሰር ስለሚፈጥረው ነው፡፡)

የጨዋታ አፕልኬሽኑን መገንባቱን ለመቀጠል፣ በዝርዝር 2.4 ላይ እንደሚታየው፣ ሬይልስ ውጎ:አፍልስ‘ን (rails db:migrate) በመጠቀም፣ በመጀመሪያ የውሂብጎታውን ማፍለስ ይኖርብናል፡፡

ዝርዝር 2.4: ውሂበጎታውን ማፍለስ።
$ rails db:migrate
== CreateTeteqamis: migrating ======================================
-- create_table(:teteqamis)
   -> 0.0027s
== CreateTeteqamis: migrated (0.0036s) =============================

ዝርዝር 2.4 ያስገኘው ውጤት፣ በአዲሱ የ‘ተጠቃሚያች‘ን (teteqamis) የውሂብ ቅርጸት ላይ የውሂበጎታውን ማዘመን ነው። (ከክፍል 6.1.1 ጀምሮ ስለ ውሂበጎታ ፍልሰት በይበልጥ እንማራለን፡፡)

ዝርዝር 2.4 ውስጥ ውሂበጎታውን ካፈለስን በኋላ፣ በአንድ ሌላ ትር ውስጥ አንድ የሰፈር የድር አገልጋይን መክፈት እንችላለን (ምስል 1.15)። አፕልኬሽኑ አገልግሎት መስጠት እንዲችል (ዝርዝር 2.5) የደመና ቅ.ማ.አ ተጠቃሚዎች፣ መጀመሪያ ክፍል 1.2.2 ውስጥ ካለው መዋቅር ጋር አንድ አይነት የሆነ መዋቅርን ማከል አለባችሁ።

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

ከዚያ ልክ በክፍል 1.2.2 ውስጥ እንዳደረግነው ሁሉ፣ አሁንም እንደሚከተለው አድርጋችሁ የሬይልስ የድር አገልጋይን አስኪዱ:-

$ rails server

ክፍል 1.2.2 ላይ እንደተገለጸው፣ አሁን አፕልኬሽኑ በሰፈር የድር አገልጋዩ ላይ መገኘት አለበት፡፡ በተለይም የመነሻ ዓ.አ.ሃ.አውን እዚህ  / ላይ ብንጎበኝ፣ በምስል 1.20 ላይ እንደሚታየው፣ “ዓለም እንዴት ነሽ!” የሚል ገጽ እናያለን (በክፍል 1.2.4 ላይ እንደተገለጸው፡ ይህ ምልክት  / “ስላሽ” ተብሎ ይነበባል)፡፡

2.2.1 ተጠቃሚን መቃኘት

ክፍል 2.2 ውስጥ የተጠቃሚዎች ሃብት መወጣጫን በማመንጨት ላይ፣ ሬይልስ ተጠቃሚዎችን ለማንቀሳቀስ የሚያገለግሉ ቁጥራቸው ብዙ የሆነ ገጾችን ፈጥሯል። ለምሳሌ:- ሁሉንም ተጠቃሚዎች ለመዘርዘር /ተጠቃሚዎች (/teteqamis) የተባለ ዓ.አ.ሃ.አን እና አዲስ ተጠቃሚን ለመፍጠር /ተጠቃሚዎች/አዲስ (/teteqamis/new) የተባለ ዓ.አ.ሃ.አን አመንጪቶልናል። ቀሪው የዚህ ክፍል ክፍለ ጊዜ፣ እነዚህን የተጠቃሚ ገጾች ለመቃኘት የተመደበ ይሆናል። በጉዟችን ላይ ይህን ሰንጠረዥ 2.1 መጣቀሱ ሊረዳ ይችላል፤ ይህም በገጾቹ እና በዓ.አ.ሃ.አወቹ መካከል ያለውን ዝምድና ያሳያል።

ዓ.አ.ሃ.አ ተግባር ጥቅም
/teteqamis index ሁሉን ተጠቃሚዎች ለመዘርዘር የሚጠቅም ገጽ
/teteqamis/1 show መታወቂያው 1 የሆነውን ተጠቃሚ ለማሳየት የሚጠቅም ገጽ
/teteqamis/new new አንድ አዲስ ተጠቃሚን ለመስራት የሚጠቅም ገጽ
/teteqamis/1/edit edit መታወቂያው 1 የሆነውን ተጠቃሚ ለማረም የሚጠቅም ገጽ
ሰንጠረዥ 2.1: በገጾች እና በተጠቃሚዎች ሃብት ዓ.አ.ሃ.አዎች መካከል ያሉ ዝንድናዎች።

ማውጫ (index) በተባለው፣ በአፕልኬሽናችን ውስጥ በ‘/ተጠቃሚዎች (/teteqamis) ላይ በሚገኘው፣ ያሉትን ተጠቃሚዎች በሙሉ መዘርዘር በሚያስችለው ገጽ እንጀምራለን። ወደዚህ ገጽ ለመሄድ በአሳሻችሁ የአድራሻ አሞሌ ላይ ጠቅ አድርጉ እና በስረ ዓ.አ.ሃ.አው መጨረሻ (ምስል 2.4) ላይ “/teteqamis” ን አክሉ፤ እናም የተሟላው ዓ.አ.ሃ.አ የዚህን አይነት ቅጽ የያዘ ይሆናል ማለት ነው:- https://www.msalie.com/teteqamis

images/figures/slash_users
ምስል 2.4: በስረ ዓ.አ.ሃ.አው ላይ /teteqamis ‘ን ማከል።

ከወዲሁ እንደምትገምቱት፣ በመጀመሪያ ምንም ተጠቃሚ አይኖረንም (ምስል 2.5)።

images/figures/demo_blank_user_index
ምስል 2.5: የተጠቃሚዎች ሃብት (/teteqamis)፡ የመጀመሪያው የመዘርዘሪያ ገጽ፡፡

አንድ አዲስ ተጠቃሚን ለመፍጠር፣ በምስል 2.5 ላይ እንደሚታየው “New Teteqamis” የሚለውን አገናኝ ጠቅ ማድረግ እንችላለን፤ አዲሱን (new) ገጽ በ‘/ተጠቃሚዎች/አዲስ (/teteqamis/new) ላይ መጎብኘቱ ደግሞ፣ ልክ በምስል 2.6 ላይ እንደሚታየው ዓይነት ውጤትን ይሰጣል፤ ይህም በምዕራፍ 7 ላይ የተጠቃሚ መመዝገቢያ ገጽ በመሆን ያገለግለናል።

images/figures/demo_new_user
ምስል 2.6: የአዲስ ተጠቃሚ ገጽ (/teteqamis/new)።

የስም እና የኤመልእክቱን ዋጋ በጽሁፉ መስክ ውስጥ ካስገባን በኋላ፣ “Create Teteqamis” የሚለውን አዝራር ጠቅ በማድረግ አንድ አዲስ ተጠቃሚን መፍጠር እንችላለን፡፡ ውጤቱን ምስል 2.7 ላይ እንደምናየው፣ የተጠቃሚ ማሳያ (show) ገጽን በ‘/ተጠቃሚዎች/1 (/teteqamis/1) ላይ እናገኛለን። (በአረንጋዴ የተጻፈው የእንኳን ደህና መጡ መልእክት የተከናወነው በብልጪታ (Flash) ነው፤ ስለሱ በክፍል 7.4.2 ላይ እንማራለን።) አስተውሉ! በ‘/ተጠቃሚዎች/1 (/teteqamis/1) ዓ.አ.ሃ.አ ላይ  1 ቁጥር የሚያመለክተው እንደምትገምቱት፣ በምስል 2.2 ላይ ያለውን የተጠቃሚውን የ‘መታወቂያ (id) ባሕሪ ብቻ ነው። ይህ ገጽ በክፍል 7.1 ላይ፣ የአንድ ተጠቃሚ መገለጫ (Profile) ገጽ በመሆን ያገለግለናል (በዚህ ስልጠና ውስጥ የመገለጫ ገጽ ማለት የአንድ ተጠቃሚ አጪር ግለ ታሪክን የያዘ ገጽ ማለት ነው። ስለሆነም ከዚህ በኋላ ባለው ትምህርት ላይ ይህንኑ ቃል እንጠቀማለን)።

images/figures/demo_show_user
ምስል 2.7: የአንድ ተጠቃሚ ማሳያ ገጽ (/teteqamis/1)።

የአንድ ተጠቃሚ መረጃን ለመቀየር “Edit” የሚለውን አገናኝ ጠቅ አድርገን የ‘አርትዕ (edit) ገጽን በ‘/ተጠቃሚዎች/1/አርትዕ (/teteqamis/1/edit) ላይ እንጎበኛለን (ምስል 2.8)። የምንፈልገውን መረጃ ካስተካከልን በኋላ፣ የተጠቃሚውን ማዘመኛ ማለት “Update Teteqami” የሚለውን አዝራር ጠቅ ስናደርግ በአፕልኬሽናችን ውስጥ ያለውን የተጠቃሚ መረጃ አዘመንን ማለት ነው (ምስል 2.9)። (ምዕራፍ 6 ላይ በዝርዝር ልናየው እንደምንችለው፣ ይህ የተጠቃሚ ውሂብ በአንድ የውሂበጎታ ደጀን ውስጥ ይከማቻል፡፡) በክፍል 10.1 ላይ ተጠቃሚን የማረም እና የማዘመን ተግባራዊነትን በማሳያ አፕልኬሽናችን ላይ እንጨምራለን።

images/figures/demo_edit_user
ምስል 2.8: የተጠቃሚው የማረሚያ ገጽ (/teteqamis/1/edit)።
images/figures/demo_update_user
ምስል 2.9: አንድ መረጃው የዘመነ ተጠቃሚ።

አዲስ (new) ገጽን በ /teteqamis/new ላይ በድጋሜ በመጎብኘት አሁን ደግሞ አንድ ሁለተኛ ተጠቃሚን እንፈጥር እና ከዚያ ሁለተኛውን የተጠቃሚ የመረጃ ስብስብን እናስረክባለን። የተገኘው የተጠቃሚው ማውጫ (index) ገጽ በምስል 2.10 ላይ ይታያል። ክፍል 7.1 ሁሉንም ተጠቃሚዎች ለማሳየት፣ አንድ በይበልጥ የተለቃለቀ የመዘርዘሪያ ገጽን ያበለጽጋል።

images/figures/demo_user_index_two
ምስል 2.10: የተጠቃሚው መዘርዘሪያ ገጽ፣ ከሁለተኛው ተጠቃሚ ጋር (/teteqamis)።

ተጠቃሚዎችን እንዴት መፍጠር፣ ማሳየት እና ማረም እንደምንችል እስካሁን ተመልክተናል፤ አሁን ደግሞ ከዚህ ቀደም የፈጠርናቸውን ተጠቃሚዎች እንዴት ማጥፋት እንደምንችል (ምስል 2.11) እንመለከታለን። ይህንን ማድረግ የምንችለው፣ በምስል 2.11 ላይ ጠቁሮ የምናየውን (መደምሰሻ) ጠቅ በማድረግ ነው፤ ይህንን ስናደርግ ሁለተኛው ተጠቃሚ ጠፍቶ፣ አንድ ተጠቃሚ ብቻ ወደላበት ገጽ ይመራናል። (አስተውሉ! ይህ ተግባር ካልሰራ፣ በድር አሳሽችሁ ውስጥ ጃቫስክሪፕት መንቃቱን አረጋግጡ። ሬይልስ ጃቫስክሪፕትን በመጠቀም አንድ ተጠቃሚን ለማጥፋት የሚያስፈልገውን መጠይቅ ያቀርባል፡፡) ክፍል 10.4 አጠቃቀሙን በአንድ ልዩ የአስተዳደር ተጠቃሚዎች ክፍል ውስጥ በመገደብ፤ የተጠቃሚዎች ስረዛን ለማሳያ አፕልኬሽኑ ያክላል።

images/figures/demo_destroy_user
ምስል 2.11: አንድ ተጠቃሚን ማጥፋት።

መልመጃዎች

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

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

  1. (ወ.ሉ.ቅን ለሚያውቁ አንባቢዎች) አንድ አዲስ ተጠቃሚ ፍጠሩ፣ ከዚያ የድር አሳሻችሁን የሃ.ጽ.መ.ቋ መመርመርያ በመጠቀም ይህንን:- “Teteqami was successfully created.” መልእክት የያዘውን የወ.ሉ.ቅ መታወቂያ (CSS id) አግኙ። የድር አሳሻችሁን ስታድሱት ምን ተከሰተ?
  2. አንድ ስም፣ ነገር ግን የኤመልእክት አድራሻ የሌለው፣ ተጠቃሚ ብትፈጥሩ ምን ይከሰታል?
  3. አንድ እንደዚህ አይነት “@msalie.com” ብቃት የለለው የኤመልእክት አድራሻ ያለው አንድ ተጠቃሚን ብትፈጥሩ ምን ይከሰታል?
  4. በቀደሙት መልመጃዎች ላይ የፈጠራችኋቸውን ተጠቃሚዎች አንድ ባንድ አጥፉ፡፡ አንድ ተጠቃሚ በሚጠፋበት ጊዜ፣ ሬይልስ አንድ መልእክትን በነባሪነት ያሳያልን?

2.2.2 ቅ.ት.መ በስራ ላይ

የተጠቃሚዎች ሃብትን አጠቃላይ እይታን ባጪሩ ተመልክተናል፤ አሁን ደግሞ በክፍል 1.2.3 ውስጥ ከተዋወቅነው፣ ከቅርጸት-ትይታ-መቆጣጠሪያ (Model-View-Controller) (ቅ.ት.መ (MVC)) ንድፍ ውስጥ አንዱን ክፍል ብቻ እንመረምራለን። የቅ.ት.መ (MVC) አሰራርን ለመረዳት የምንጠቀመው ስልት፣ በቅ.ት.መ (MVC) አንጻር አንድ ተራ የድር አሳሽ የተጠቃሚ መዘርዘሪያ ገጹን ማለት /teteqamis ን ሲመታ የሚገኙ ውጤቶችን በመግለጽ ይሆናል (ምስል 2.12)።

images/figures/mvc_detailed
ምስል 2.12: አንድ በደንብ የተዘረዘረ የሬይልስ የቅ.ት.መ (MVC) ስእላዊ መግለጫ፡፡

ምስል 2.12 ላይ የተመለከቱት ፍጻሜወች የቅደም ተከተል ማጠቃለያ እነሆ:-

  1. የድር አሳሹ ለ‘/ተጠቃሚዎች (/teteqamis) ዓ.አ.ሃ.አው አንድ መጠይቅን ይሰጣል።
  2. ሬይልስ ‘/ተጠቃሚዎች‘ን (/teteqamis) በተጠቃሚ መቆጣጠሪያ ውስጥ ወደሚገኘው፣ የ‘ማውጫ (index) ተግባር ያዘዋውረዋል።
  3. የ‘ማውጫ (index) ተግባር (ሁሉንም ተጠቃሚዎች (Teteqami.all)) ፈልጎ እንዲያገኝ፣ የተጠቃሚ ቅርጸቱን (Teteqamis model) ይጠይቃል።
  4. የተጠቃሚ ቅርጸቱ (Teteqamis model) ሁሉንም ተጠቃሚዎች ከውሂበጎታው ጎትቶ ያወጣል።
  5. የተጠቃሚ ቅርጸቱ (Teteqamis model) የተጠቃሚዎቹን ዝርዝር ወደ መቆጣጠሪያው ይልካል።
  6. መቆጣጠሪያው ተጠቃሚዎችን @ተጠቃሚዎች (@teteqamis) በተባለ ተለዋዋጪ ላይ ይዞ፣ ወደ ማውጫ (index) ትይታ ገጹ ያስተላልፋል።
  7. ትይታው ገጹን በሃ.ጽ.መ.ቋ ለማቅረብ ክት ሩቢን ይጠቀማል።
  8. መቆጣጠሪያው ሃ.ጽ.መ.ቋውን ወደ አሳሹ መልሶ ይሰዳል።5

አሁን ከላይ ያሉትን ቅደም ተከተሎች ጠለቅ ባለ ዝርዝር እንመልከት። የምንጀምረው አንድ በድር አሳሹ በተሰጠ መጠይቅ ላይ መሰረት በማድረግ ይሆናል። ማለትም አንድ ዓ.አ.ሃ.አን በአድራሻ አሞሌው ላይ በመጻፍ፣ ወይም አንድ አገናኝን ጠቅ በማድረግ በተገኘ ውጤት ይሆናል (በምስል 2.12 ውስጥ ቁጥር አንድን (1) መፈጸም ማለት ነው)። ይህ መጠይቅ የሬይልስ ማዘዋወሪያ (Rails Router) ጋር ይደርሳል (በምስል 2.12 ውስጥ ቁጥር ሁለትን (2) መፈጸም ማለት ነው)፣ ይህም ሬይልስ የዓ.አ.ሃ.አው መጠይቅ ላይ በመመርኮዝ ዓ.አ.ሃ.አውን ትክክለኛ ወደሆነው የመቆጣጠሪያ ተግባር (Controller Action) ይልከዋል (በሳጥን 3.2 ላይ ይህ ምን ዓይነት መጠይቅ እንደሆነ እንመለከታለን)። ለተጠቃሚዎች ሀብቶች፣ የመቆጣጠሪያ ተግባሮችን፣ የተጠቃሚ ዓ.አ.ሃ.አወች ካርታን እንዲፈጥር የሚያደርገው ኮድ በዝርዝር 2.6 ውስጥ ይገኛል፡፡ ይህ ኮድ በሰንጠረዥ 2.1 ላይ ያየነውን የዓ.አ.ሃ.አ እና የተግባር ጥምረትን ያሰናዳልናል። (:ተጠቃሚወች (:teteqamis) የሚለው እንግዳው ስርዓተ-ምልክት ወካይ (Symbol) ይባላል፣ ይህንንም በክፍል 4.3.3 ላይ እንማረዋለን።)

ዝርዝር 2.6: የሬይልስ ማዘዋወሪያወች ከአንድ የተጠቃሚዎች ሃብቶች ደንብ ጋር። config/routes.rb
Rails.application.routes.draw do
  resources :teteqamis
  root 'application#selamta'
end

የማዘዋወሪያወች ፋይልን በመመልከት ላይ እያለን፣ እግረ መንገዳችንን የተጠቃሚወች መዘርዘሪያ ገጹን ከስር ማዘዋወሪያው ጋር እናቆራኘው እና ከዚያ “የህዝባር” ምልክቱ ወደ /ተጠቃሚዎች (/teteqamis) እንደሚወስድ እናድርገው። የስር ማዘዋወሪያውን ዝርዝር 2.3 ላይ እንዲህ አድርገን እንዳከልን አስታውሱ:-

root 'application#selamta'

ስለዚህም በአፕልኬሽን መቆጣጠሪያ ውስጥ፣ የስር ማዘዋወሪያው ወደ ሰላምታ ተግባሩ ተጉዞ ነበረ። በአሁኑ ጊዜ፣ በተጠቃሚዎች መቆጣጠሪያ ውስጥ የ‘ማውጫ (index) ተግባርን መጠቀም እንፈልጋለን፣ ይህንንም በዝርዝር 2.7 ውስጥ ባለው ኮድ ማዘጋጀት እንችላለን።

ዝርዝር 2.7: ለተጠቃሚዎች አንድ የስር ማዘዋወሪያን ማከል። config/routes.rb
Rails.application.routes.draw do
  resources :teteqamis
  root 'teteqamis#index'
end

አንድ መቆጣጠሪያ የአንድ ተዛማጅ ተግባሮች ስብስብን ይይዛል፤ እናም በክፍል 2.2.1 ላይ የቃኘናቸው ገጾች፣ በተጠቃሚዎች መቆጣጠሪያ ውስጥ ካሉ ተግባሮች ጋር ይጎዳኛሉ። በመወጣጫ የመነጨው መቆጣጠሪያ በዝርዝር 2.8 ላይ በንድፋዊ መልኩ ይታያል። ይህንን ኮድ አስተውሉ class TeteqamisController < ApplicationController ይህ የሩቢ ክፍል (Class) ከውርሽያ (Inheritance) ጋር ያለውን ግንኙነት የሚያሳይ አንድ ምሳሌ ነው። (መወራረስን በክፍል 2.3.4 ላይ በሰፊው ስንመለከት፣ ሁለቱንም ሃሳቦች ማለት መወራረስን እና ክፍልን ደግሞ በክፍል 4.4 ላይ በሰፊው እንመለከታቸዋለን።)

ዝርዝር 2.8: የተጠቃሚዎች መቆጣጠሪያ በንድፋዊ መልኩ። app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
  .
  .
  .
  def index
    .
    .
    .
  end

  def show
    .
    .
    .
  end

  def new
    .
    .
    .
  end

  def edit
    .
    .
    .
  end

  def create
    .
    .
    .
  end

  def update
    .
    .
    .
  end

  def destroy
    .
    .
    .
  end
end

እዚህ ላይ፣ ከገጾቹ ይልቅ ተግባሮቹ እንደሚበዙ አስተውላችሁ ይሆናል። የ‘ማውጫ (index)፣ የ‘ማሳያ (show)፣ የ‘አዲስ (new) እና የ‘አርትዕ (edit) ተግባሮች ሁሉም ክፍል 2.2.1 ላይ ካሉት ገጾች ጋር ይዛመዳሉ፤ ነገር ግን ተጨማሪ የ‘ፍጠር (create)፣ የ‘አዘምን (update) እና የ‘አጥፋ (destroy) ተግባሮችም አሉ። እነዚህ ተግባሮች በተለምዶ ገጾችን አያቀርቡም (ምንም እንኳን ቢችሉም)፤ ይልቁንስ የእነሱ ዋና ዓላማ በውሂበጎታው ውስጥ የሚገኝ የተጠቃሚዎች መረጃን መለወጥ ነው።

ይህ በሰንጠረዥ 2.2 ላይ የተጠቃለለው የተሟላ የመቆጣጠሪያ ተግባር ስብስብ፣ ውከላዊ ሁኔታን ማስተላለፍ (ው.ሁ.ማ REST) የተባለውን የሬይልስ መዋቅርን ያዘጋጃል (ሳጥን 2.2)። ይህም በኮምፒዩተር ሳይንቲስቱ ሮይ ፊልዲንግ6 የታወቀ፣ የተበየነ እና “የድር አገልግሎቶችን ለመፍጠር የሚያገለግሉ፣ የተወሰኑ ገደቦችን የሚገልጽ፣ የሶፍትዌር ስነ-ህንጻ ዘይቤ ነው።” የሚል ሃሳብ ላይ የተመሰረተ ነው። ሰንጠረዥ 2.2 ውስጥ ካስተዋላችሁ ዓ.አ.ሃ.አወቹ ላይ አንዳንድ መደራረብ ታያላችሁ። ለምሳሌ:- ተጠቃሚን የሚያሳየው የ‘አሳይ (show) ተግባር እና የተጠቃሚ መረጃን የሚያዘምነው የ‘አዘምን (update) ተግባር ሁለቱም ከ‘/ተጠቃሚዎች/1 (/teteqamis/1) ዓ.አ.ሃ.አ ጋር ይዛመዳሉ። በሁለቱ መካከል ያለው ልዩነት፣ ለሃ.ጽ.ማ.ስ የመጠይቅ ዘዴ፣ የሚሰጡት መልስ ነው። ስለነዚህ የሃ.ጽ.ማ.ስ የመጠይቅ ዘዴወች፣ በክፍል 3.3 ላይ በይበልጥ እንማራለን።

የሃ.ጽ.ማ.ስ መጠይቅ ዓ.አ.ሃ.አ ተግባር ጥቅም
GET /teteqamis index ሁሉንም ተጠቃሚዎች ለመዘርዘር የሚጠቅም ገጽ
GET /teteqamis/1 show መታወቂያው 1 የሆነውን ተጠቃሚ ለማሳየት የሚጠቅም ገጽ
GET /teteqamis/new new አንድ አዲስ ተጠቃሚን ለመስራት የሚጠቅም ገጽ
POST /teteqamis create አንድ አዲስ ተጠቃሚን መፍጠር
GET /teteqamis/1/edit edit መታወቂያው 1 የሆነውን ተጠቃሚ ለማረም የሚጠቅም ገጽ
PATCH /teteqamis/1 update መታወቂያው 1 የሆነውን ተጠቃሚ ማዘመን
DELETE /teteqamis/1 destroy መታወቂያው 1 የሆነውን ተጠቃሚ ማጥፋት
ሰንጠረዥ 2.2: ዝርዝር 2.6 በተጠቃሚዎች ሃብት የቀረቡ ሙሉየው.ሁ.ማ ማዘዋወሪያወች።
ሳጥን 2.2. ውከላዊ ሁኔታን ማስተላለፍ (ው.ሁ.ማ)

ስለ ሩቢ ኦን ሬይልስ የድር አበለጻጸግ ብዙ የምታነቡ ከሆነ፣ ስለ “ው.ሁ.ማ (REST)” ብዙ ማጣቀሻወችን ታገኛላችሁ፣ ይህም ውከላዊ ሁኔታን ማስተላለፍ (REpresentational State Transfer) አንድ የቃል መነሻ ስብስብ (Acronym) መሆኑን ነው። ው.ሁ.ማ እንደ አለም አቀፍ ድሮችን፣ የድር አፕልኬሽኖችን እና የኮምፒተር አውታረመረብ ስርዓቶችን ለማበልጸግ የሚያገለግል አንድ መዋቅራዊ ስልት ነው። ምንም እነኳን የው.ሁ.ማ ጽንሰ ሃሳብ ረቂቅ ቢሆንም፣ በሬይልስ አፕልኬሽን አውድ ውስጥ፣ ው.ሁ.ማ ማለት አብዛኛው የአፕልኬሽኑ አካላት (እንደ ተጠቃሚዎች (Teteqamis) እና አጪርጽሑፎች (Achrtshufs) ያሉ)፣ ከሁለቱም ማለት ከፍ.አ.አ.ሰ (CRUD)7 እና ከአራቱ መሰረታዊ የሃ.ጽ.ማ.ስ የመጠይቅ ዘዴወች:- ማለት ከ‘ዓስቀምጥ (POST)ከ‘ዓግኝ (GET)ከ‘ዓዘምን (PATCH) እና ከ‘ሠርዝ (DELETE) ጋር የሚዛመዱ ሊፈጠሩ፣ ሊነበቡ፣ ሊዘመኑ እና ሊሰረዙ የሚችሉ ሃብቶች (Resources) ተደርገው የተቀረጹ ናቸው ማለት ነው፡፡ (ስለ የሃ.ጽ.ማ.ስ የመጠይቅ ዘዴወች በክፍል 3.3 ውስጥ እና በይበልጥ ደግሞ በሳጥን 3.2 ላይ እንማራለን።)

የሬይልስ አፕልኬሽን አበልጻጊ እንደመሆናችሁ መጠን፣ ሙሉየው.ሁ.ማ ስልት የትኛውን መቆጣጠሪያ እና ተግባርን መጻፍ እንዳለባችሁ እንድትመርጡ ያግዛችኋል። ማድረግ የሚጠበቅባችሁ ነገር የሚፈጠሩ፣ የሚነበቡ፣ የሚዘመኑ እና የሚሰረዙ ሃብቶችን በመጠቀም፣ አፕልኬሽኑን ማዋቀር ብቻ ነው። የተጠቃሚዎችና (Teteqamis) የአጪርጽሑፎች (Achrtshufs) ሁኔታን በተመለከተ ሂደቱ በጣም ግልጽ ነው። ምክንያቱ ደግሞ እነሱ ራሳቸው በተፈጥሯቸው ሃብቶች ስለሆኑ ነው። በምዕራፍ 14 ውስጥ፣ የው.ሁ.ማ መርህ “ተጠቃሚዎችን የመከተል” አሰራር ላይ የሚያጋጥመንን አንድ አስቸጋሪ መሰናክልን ለመወጣት፣ ተፈጥሮዋዊ እና ምቹ በሆነ መንገድ፣ ለመቀረጽ እንደሚያስችለን የሚያሳይ አንድ ምሳሌን እንመለከታለን፡፡

በተጠቃሚ ቅርጸት እና በተጠቃሚወች መቆጣጠሪያ መካከል ያለውን ግንኙነት ለመመርመር እስኪ በዝርዝር 2.9 ላይ ለምሳሌነት ተነጥሎ የቀረበውን፣ የ‘ማውጫ (index) ተግባርን እንመልከት። (ኮዱን ሙሉ በሙሉ ባትረዱት እንኳ፣ ኮድ እንዴት እንደሚነበብ ማወቁ ራሱ ለቴክኒካዊ ብልሃት አንድ አስፈላጊ የሆነ አካል ነው (ሳጥን 1.2))።

ዝርዝር 2.9: ለምሳሌነት ተነጥሎ የቀረበ የተጠቃሚ የ‘ማውጫ (index) ተግባር። app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
  .
  .
  .
  def index
    @teteqamis = Teteqami.all
  end
  .
  .
  .
end

ይህ የ‘ማውጫ (index) ተግባር @teteqamis = Teteqami.all የሚል መስመርን ይዟል (በምስል 2.12 ውስጥ ቁጥር ሶስትን (3) መፈጸም ማለት ነው)፤ ይህም ሁሉንም ተጠቃሚዎች በዝርዝር ከውሂበጎታው ውስጥ ፈልጎ እንዲያገኝ ይጠይቃል (በምስል 2.12 ውስጥ ቁጥር አራትን (4) መፈጸም ማለት ነው)፤ እናም @ተጠቃሚዎች (@teteqamis) (ሲነበብ “አት-ተጠቃሚዎች”) በተባለው ቅርፀ ተለዋዋጪ ላይ ያኖራቸዋል (በምስል 2.12 ውስጥ ቁጥር አምስትን (5) መፈጸም ማለት ነው)።

የተጠቃሚ ቅርጸቱ ብቻውን በዝርዝር 2.10 ላይ ይገኛል። ምንም እንኳን ተራ ቢመስልም፣ በውርሻ (Inheritance) ምክንያት ግን ብዙ ተግባራዊነትን ይዟል (ክፍል 2.3.4 እና ክፍል 4.4)። በተለይ ንቅ መዝገብ (Active Record) የተባለውን የሬይልስ ቤተኮድን (Library) በመጠቀም፣ በዝርዝር 2.10 ውስጥ ያለው ኮድ፣ በውሂበጎታው ውስጥ ያሉትን ሁሉንም ተጠቃሚዎች እንዲመልስ ለ‘ሁሉም.ተጠቃሚ (Teteqami.all) ያዘጋጃል፡፡

ዝርዝር 2.10: የመጫወቻ አፕልኬሽኑ፣ የተጠቃሚው ቅርጸት፡፡ app/models/teteqami.rb
class Teteqami < ApplicationRecord
end

ዝርዝር 2.11 ላይ እንደሚታየው፣ አንዴ የ‘@ተጠቃሚዎች (@teteqamis) ተለዋዋጩ ከተበየነ በኋላ፣ መቆጣጠሪያው ትይታውን ይጠራዋል (በምስል 2.12 ውስጥ ቁጥር ስድስትን (6) መፈጸም ማለት ነው)። በዚህ @ ወካይ የሚጀምሩ ተለዋዋጮች ቅርፀ ተለዋዋጮች (Instance Variables) ይባላሉ፤ እነሱም በትይታ ውስጥ በራስሰር ይገኛሉ። በዚህ ጊዜ፣ በዝርዝር 2.11 ላይ ያለው የ index.html.erb ትይታ በ‘@ተጠቃሚዎች (@teteqamis) ዝርዝር ላይ ይደጋገም እና ለእያንዳንዱ አባል አንድ የሃ.ጽ.መ.ቋ መስመርን ያመነጫል። (አስተውሉ፣ አሁን ይህን ኮድ እንድትረዱት አይጠበቅባችሁም። ይሄ የቀረበው ምሳሌውን ለማሳየት ብቻ ነው።)

ማሳሰቢያ:- አንዳንድ የትርጉም ግጪቶችን ለመከላከል፣ በዚህ ስልጠና ላይ “ቅርጸት” የሚለው ቃል በአማርኛ ትርጉም ላይ በተለያየ መልኩ ለመጠቀም ተሞክሯል፤ ስለሆነም የቃሉን ትርጉም ሳይሆን አጻጻፉን ለመለየት ሲባል “Instance Variable” ለሚለው ቃል ቅር“ፀ” ማለት ቅርፀ የሚለውን የአጻጻፍ ስልት እንጠቀማለን እናም በዚህ ስልጠና ውስጥ ቅርጸት እና ቅርፀት አንድ አይነት እንዳልሆነ ከወዲሁ ልትረዱት ይገባል።

ዝርዝር 2.11: የተጠቃሚዎች መዘርዘሪያ ትይታ፡፡ app/views/teteqamis/index.html.erb
<p id="notice"><%= notice %></p>

<h1>Teteqamis</h1>

<table>
  <thead>
    <tr>
      <th>Sim</th>
      <th>Emelekt</th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <% @teteqamis.each do |teteqami| %>
      <tr>
        <td><%= teteqami.sim %></td>
        <td><%= teteqami.emelekt %></td>
        <td><%= link_to 'Show', teteqami %></td>
        <td><%= link_to 'Edit', edit_teteqami_path(teteqami) %></td>
        <td><%= link_to 'Destroy', teteqami, method: :delete,
                         data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

<br>

<%= link_to 'New Teteqami', new_teteqami_path %>

ትይታው ይዘቶቹን ወደ ሃ.ጽ.መ.ቋ ይቀይራቸዋል (በምስል 2.12 ውስጥ ቁጥር ሰባትን (7) መፈጸም ማለት ነው)፤ ከዛም በመቆጣጠሪያው ይመለሱና በድር አሳሹ ላይ ይታያሉ (በምስል 2.12 ውስጥ ቁጥር ስምንትን (8) መፈጸም ማለት ነው)።

መልመጃዎች

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

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

  1. ምስል 2.12 ስእላዊ መግለጫ ላይ በመመርኮዝ የ‘/ተጠቃሚወች/1/አርትዕ (/teteqamis/1/edit) ዓ.አ.ሃ.አ አሰራርን ቅደም ተከተል ጻፉ።
  2. ከላይ ለተሰጠው መልመጃ ጥቅም ላይ የሚውለውን ተጠቃሚ፣ ከውሂበጎታው ፈልጎ የሚያገኘውን ኮድ ፈልጋችሁ አግኙ። ጠቃሚ ምክር:- ይህ ኮድ በልዩ ስፍራ ላይ ይገኛል፤ set_teteqami ተብሎም ይጠራል፡፡
  3. የተጠቃሚ አርትዕ ገጽ የትይታ ፋይል ስም፣ ምን ተብሎ ይጠራል?

2.2.3 የዚህ የተጠቃሚዎች ሃብት ድክመቶች

ስለሬይልስ አንድ ጠቅለል ያለ ግንዛቤ ለማግኘት ቢረዳንም፣ የመወጣጫ የተጠቃሚ ሃብቱ፣ ብዙ ድክመቶች አሉት።

  • የውሂብ ብቃት ማስረገጫወች አለመኖር። የተጠቃሚ ቅርጸታችን ብቁ ያልሆኑ ውሂቦችን ማለት ባዶ ስሞችን እና ብቁ ያልሆኑ የኤመልእክት አድራሻዎችን ያለምንም ቅሬታ ይቀበላል።
  • ማረጋገጫ የለውም። ወደ ድረ-ጣቢያው መግቢያ ወይም ከድረ-ጣቢያው የመውጫ አገልግሎት የለም፣ እንዲሁም የሆነ ተጠቃሚ ማንኛውንም ድርጊት እንዳይፈጽም የሚከላከልበት መንገድ የለውም።
  • ፈተናወች የሉትም። ይህ በቴክኒካዊ መልኩ እውነት አይደለም (መወጣጫ የተወሰኑ ፈተናወችን ያካትታል) ግን የመነጩት ፈተናወች የውሂብ ማስረገጫ፣ ማረጋገጫ ወይም ሌላ ብጁ መስፈርቶችን አይፈትንም፡፡
  • ቅጥ ወይም ገጽታ የለውም። ቋሚ የጣቢያ ቅጥ እና ማሰሻ የለውም።
  • ለመረዳት ግልጽ አይደለም። የመወጣጫ ኮድ ከገባችሁ፣ ይህንን መጽሐፍ ማንበብ አይገባችሁ ይሆናል።

2.3 የአጪርጽሑፎች ሃብት

የተጠቃሚዎች ሃብትን አመንጪተን እና በደንብ ተመልክተን ጨርሰናል፤ አሁን ደግሞ ተራው፣ የተዛማጁ የአጪርጽሑፎች ሃብት ነው። የዚህ ክፍል የአጪርጽሑፎች ሃብትን በክፍል 2.2 ላይ ካሉት፣ ተዛማጅ የተጠቃሚዎች ሃብት ጋር እንድታነጻጽሩት አሳስባለሁ፤ ሁለቱ ሃብቶች በብዙ ነገሮች እንደሚመሳሰሉ ልታስተውሉ ይገባል። የሬይልስ አፕልኬሽን ሙሉየው.ሁ.ማ መዋቅር ይበልጥ የሚገባን፣ ይህንን አሰራር በመደጋገም ነው። በእርግጥም በዚህ ገና በሆነ ደረጃ ላይ እንኳን፣ የተጠቃሚዎች እና የአጪርጽሑፎች ትይዩ አወቃቀርን ማየቱ፣ ለዚህ ምዕራፍ ዋነኛው መንስኤ ከሆኑት ነገሮች ውስጥ አንዱ ነው፡፡

2.3.1 አጪርጽሑፎችን ላንድ አፍታ መቃኘት

ልክ እንደ ተጠቃሚዎች ሃብት ለአጪርጽሑፎች ሃብትም፣ የመወጣጫ ኮድን ለማመንጨት የምንጠቀመው የ‘ሬይልስ መወጣጫ አመንጪ (rails generate scaffold) ትእዛዝን ነው። ይህ ማለት ደግሞ፣ በምስል 2.3 ላይ ያለውን የውሂብ ቅርጸት እንፈጽማለን ማለት ነው።8

$ rails generate scaffold Achrtshuf yizet:text teteqami_id:integer
      invoke  active_record
      create    db/migrate/20211029173954_create_achrtshufs.rb
      create    app/models/achrtshuf.rb
      invoke    test_unit
      create      test/models/achrtshuf_test.rb
      create      test/fixtures/achrtshufs.yml
      invoke  resource_route
       route    resources :achrtshufs
      invoke  scaffold_controller
      create    app/controllers/achrtshufs_controller.rb
      invoke    erb
      create      app/views/achrtshufs
      create      app/views/achrtshufs/index.html.erb
      create      app/views/achrtshufs/edit.html.erb
      create      app/views/achrtshufs/show.html.erb
      create      app/views/achrtshufs/new.html.erb
      create      app/views/achrtshufs/_form.html.erb
      invoke    resource_route
      invoke    test_unit
      create      test/controllers/achrtshufs_controller_test.rb
      create      test/system/achrtshufs_test.rb
      invoke    helper
      create      app/helpers/achrtshufs_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/achrtshufs/index.json.jbuilder
      create      app/views/achrtshufs/show.json.jbuilder
      create      app/views/achrtshufs/_achrtshuf.json.jbuilder
      invoke  assets
      invoke    scss
      create      app/assets/stylesheets/achrtshufs.scss
      invoke  scss
   identical    app/assets/stylesheets/scaffolds.scss

ውሂበጎታችንን በአዲሱ የውሂብ ቅርጸት ለማዘመን፣ ልክ ክፍል 2.2 ላይ እንዳደረግነው፣ አንድ ፍልሰትን ማስኬድ አለብን:-

$ rails db:migrate
== 20211029173954 CreateAchrtshufs: migrating =================================
-- create_table(:achrtshufs)
   -> 0.0021s
== 20211029173954 CreateAchrtshufs: migrated (0.0023s) ========================

አሁን በክፍል 2.2.1 ላይ ተጠቃሚዎችን በፈጠርንበት ዓይነት መንገድ፣ አጪርጽሑፎችን ለመፍጠር የሚያስችል አንድ ችሎታ ላይ እንገኛለን። እንደምትገምቱት የመወጣጫ ማመንጫ፣ በዝርዝር 2.12 ላይ እንደሚታየው፣ የሬይልስ ማዘዋወሪያ ፋይልን፣ ከአንድ የአጪርጽሑፎች ሃብት ደንብ ጋር አድሶታል። 9 እንደ ተጠቃሚዎች ሁሉ፣ የ‘አጪርጽሑፎች :ሃብቶች (resources :achrtshufs) የማዘዋወሪያ ደንቡ በሰንጠረዥ 2.3 ላይ እንደሚታየው፣ በአጪርጽሑፎች መቆጣጠሪያ ውስጥ ካሉት ተግባሮች ጋር የአጪርጽሑፍ ዓ.አ.ሃ.አወችን ያመላክታል።

ዝርዝር 2.12: የሬይልስ ማዘዋወሪያወች፣ ከአንድ አዲስ የአጪርጽሑፎች ሃብት ደንብ ጋር። config/routes.rb
Rails.application.routes.draw do
  resources :achrtshufs
  resources :teteqamis
  root 'teteqamis#index'
end
ሃ.ጽ.ማ.ስ መጠይቅ ዓ.አ.ሃ.አ ተግባር ጥቅም
GET /achrtshufs index ሁሉንም አጪርጽሑፎች ለመዘርዘር የሚጠቅም ገጽ
GET /achrtshufs/1 show መታወቂያው 1 የሆነውን አጪርጽሑፍ ለማሳየት የሚጠቅም ገጽ
GET /achrtshufs/new new አንድ አዲስ አጪርጽሑፍን ለመስራት የሚጠቅም ገጽ
POST /achrtshufs create አንድ አዲስ አጪርጽሑፍን መፍጠር
GET /achrtshufs/1/edit edit መታወቂያው 1 የሆነውን አጪርጽሑፍ ለማረም የሚጠቅም ገጽ
PATCH /achrtshufs/1 update መታወቂያው 1 የሆነውን አጪርጽሑፍ ማዘመን
DELETE /achrtshufs/1 destroy መታወቂያው 1 የሆነውን አጪርጽሑፍ ማጥፋት
ሰንጠረዥ 2.3: ዝርዝር 2.12. ውስጥ ባሉ በአጪርጽሑፎች ሃብቶች ኮድ የቀረቡ ሙሉየው.ሁ.ማ ማዘዋወሪያወች።

የአጪርጽሑፎች መቆጣጠሪያው ራሱ በዝርዝር 2.13 ውስጥ በንድፋዊ መልኩ ይታያል። ልብ በሉ TeteqamisController ቦታ ላይ AchrtshufsController የሚለውን ከመተካቱ ውጪ፣ በዝርዝር 2.13 ውስጥ ያሉት ኮዶች ዝርዝር 2.8 ውስጥ ካሉት ኮዶች ጋር ፍጹም አንድ ዓይነት ናቸው። ይህ ለሁለቱም ሃብቶች የጋራ የሆነ የው.ሁ.ማ መዋቅር እንዳላቸው የሚያሳይ አንድ ነጸብራቅ ነው።

ዝርዝር 2.13: የአጪርጽሑፎች መቆጣጠሪያ በንድፋዊ መልኩ። app/controllers/achrtshufs_controller.rb
class AchrtshufsController < ApplicationController
  .
  .
  .
  def index
    .
    .
    .
  end

  def show
    .
    .
    .
  end

  def new
    .
    .
    .
  end

  def edit
    .
    .
    .
  end

  def create
    .
    .
    .
  end

  def update
    .
    .
    .
  end

  def destroy
    .
    .
    .
  end
end

የተወሰኑ እውነተኛ አጪርጽሑፎችን ለምስራት በምስል 2.14 ላይ እንደሚታየው፣ በአጪርጽሑፍ ማውጫ ገጽ (ምስል 2.13) ላይ “New Achrtshuf” የሚለው ላይ ጠቅ በማድረግ በአዲስ አጪርጽሑፎች ገጽ /achrtshufs/new ላይ የሚፈለገውን መረጃ እናስገባለን፡፡

images/figures/micropost_inde
ምስል 2.13: የአጪርጽሑፎቹ መዘርዘሪያ ገጽ (/achrtshufs)።
images/figures/demo_new_micropost
ምስል 2.14: የአዲስ አጪርጽሑፉ ገጽ (/achrtshufs/new).

አሁን አንድ ወይም ሁለት አጪርጽሑፎችን መፍጠር እንችላለን። ስንፈጥር ግን ቢያንስ አንዱ የ‘ተጠቃሚ_መታወቂያ (teteqami_id) ቁጥሩ 1 ሊሆን ይገባል፤ በክፍል 2.2.1 ላይ ከፈጠርነው ተጠቃሚ ጋር እንዲዛመድ። ውጤቱ በምስል 2.15 ላይ ያለውን መምሰል ይኖርበታል።

images/figures/demo_micropost_index
ምስል 2.15: የአጪርጽሑፍ መዘርዘሪያ ገጹ፣ ከሁለት አጪርጽሑፎች ጋር።

መልመጃዎች

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

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

  1. (ወ.ሉ.ቅን ለሚያውቁ አንባቢዎች) አንድ አዲስ አጪርጽሑፍ ፍጠሩ፣ ከዚያ የድር አሳሻችሁን የሃ.ጽ.መ.ቋ መመርመሪያ በመጠቀም ይህንን:- “Achrtshuf was successfully created.” መልእክት የያዘውን የወ.ሉ.ቅ መታወቂያ (CSS id) አግኙ። የድር አሳሻችሁን ስታድሱት ምን ተከሰተ?
  2. የተጠቃሚ-መታወቂያ እና የጽሑፍ ይዞታ የሌለው አንድ አጪርጽሑፍ ፍጠሩ።
  3. የሆሄው እርዝመት ከ 140 በላይ የሆነ አንድ አጪርጽሑፍን ፍጠሩ (ስለ ሩቢ ዊኪፒዲያ ላይ ከተጻፈው መጣጥፍ የመጀመሪያውን አንቀጽ መጠቀም ትችላላችሁ)።
  4. ባለፈው መልመጃ ላይ የፈጠራችኋቸው አጪርጽሑፎችን ሰርዙ።

2.3.2 አጪርጽሑፍን ወደ አጪር ይዞታ መቀየር

ማንኛውም አጪርጽሑፍ ልክ እንደ ስሙ፣ የተቀመጡን እርዝመት ለማስገደድ የሚያስችሉ አንዳንድ መንገዶች ሊኖሩት ይገባል፡፡ ይህንንም ማረጋገጫ (Validations) የተባለውን የሬይልስ ማረጋገጫ ከአንድ እርዝመት (length) ከተባለ፣ የእርዝመት ማረጋገጫ ጋር በመጠቀም፣ የአጪርጽሑፉ ሆሄ ከ 140 እንዳይበልጥ መገደብ እንችላለን (ትዊተርም መጀመሪያ ላይ ይህንኑ አሰራር ይጠቀም እንደነበር ይታወቃል)። በዚህ ጊዜ አፕ/ቅርጸቶች/አጪርጽሑፍ.አርቢ (app/models/achrltf.rb) ፋይልን በአንድ የጽሑፍ አርታኢ ወይም በቅ.ማ.አ ውስጥ በመክፈት፣ የዝርዝር 2.14 ን ይዞታ ወደ ፋይሉ መጨመር ይኖርባችኋል።

ዝርዝር 2.14: አጪርጽሑፎች ቢበዛ 140 ሆሄወች እንዲሆኑ መገደብ። app/models/achrtshuf.rb
class Achrtshuf < ApplicationRecord
  validates :yizet, length: { maximum: 140 }
end

ዝርዝር 2.14 ላይ ያለው ኮድ ሚስጥራዊ መስሎ ሊታይ ይችላል፤ ነገር ግን ወደ አዲሱ የአጪርጽሑፍ ገጽ ላይ ሄደን ለቅምጥ ይዘቱ፣ ከ 140 በላይ የሆኑ ሆሄወችን ስናስገባ ውጤቱ በቀላሉ ሊታይ ይችላል (በክፍል 6.2 ላይ ስለ ማረጋገጫ Validations በሰፊው እንመለከታለን)። ሬይልስ የአጪርጽሑፉ ሆሄ በጣም ረጅም መሆኑን ለማመላከት የስህተት መልእክቶችን ያቀርባል። (በክፍል 7.3.3 ላይ ስለነዚህ የስህተት መልእክቶች በሰፊው እንማራለን።)

images/figures/micropost_length_error
ምስል 2.16: ለአንድ ያልተሳካ የአጪርጽሑፍ ፈጠራ፣ የቀረቡ የስህተት መልእክቶች።

መልመጃዎች

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

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

  1. እንደ ባለፈው መልመጃ፣ አሁንም የሆሄው እርዝመት ከ 140 በላይ የሆነ አንድ አጪርጽሑፍን ፍጠሩ (ክፍል 2.3.1.1)። ባህሪው እንዴት ተለወጠ?
  2. (ወ.ሉ.ቅን ለሚያውቁ አንባቢዎች) በላይኛው መልመጃ ላይ የተሰራውን የስህተት መልእክት የወ.ሉ.ቅ መታወቂያ (CSS id) ለማወቅ፣ አሳሻችሁን የሃ.ጽ.መ.ቋ መመርመርያ ተጠቀሙ።

2.3.3 አንድ ተጠቃሚ ብዙ_አጪርጽሑፎች አሉት

ከሬይልስ ጠንካራ ጎኖች ውስጥ አንዱ፣ በተለያዩ የውሂብ ቅርጸቶች መካከል ዝምድናን (Associations) መፍጠሩ ነው። የተጠቃሚ ቅርጸትን በተመለከተ፣ እያንዳንዱ ተጠቃሚ ብዙ አጪርጽሑፎች ሊኖሩት ይችላል። በዝርዝር 2.15 እና በዝርዝር 2.16 ውስጥ የተጠቃሚ እና የአጪርጽሑፍ ቅርጸቶቹን በማዘመን ይህንን ዝምድና በኮድ መግለጽ እንችላለን፡፡

ዝርዝር 2.15: አንድ ተጠቃሚ ብዙ አጪርጽሑፎች አሉት። app/models/teteqami.rb
class Teteqami < ApplicationRecord
  has_many :achrtshufs
end
ዝርዝር 2.16: አጪርጽሑፉ የተጠቃሚው ነው። app/models/achrtshuf.rb
class Achrtshuf < ApplicationRecord
  belongs_to :teteqami
  validates :yizet, length: { maximum: 140 }
end

የዚህን ማህበር ውጤት በምስል 2.17 ውስጥ ማየት እንችላለን። የአጪርጽሑፎች (achrtshufs) ሰንጠረዥ ውስጥ ባለው የ‘ተጠቃሚ_መታወቂያ (teteqami_id) አምድ መሰረት ሬይልስ (ንቅ መዝገብን በመጠቀም) ከእያንዳዱ ተጠቃሚ ጋር የሚዛመደውን አጪርጽሑፍ ማወቅ ይችላል።

images/figures/micropost_user_association
ምስል 2.17: በአጪርጽሑፎች እና በተጠቃሚዎች መካከል ያለው ህብረት።

ምዕራፍ 13 እና በምዕራፍ 14 ላይ ተጠቃሚዎችን እና ሁሉንም የተጠቃሚዎች አጪርጽሑፎችን ለማሳየት፤ አንድ የትዊተር ዓይነት፣ የአጪርጽሑፍ ቀላቢን ለማዋቀር፣ የተጠቃሚዎችን እና የአጪርጽሑፎችን ማህበር እንጠቀማለን። ለአሁኑ ግን ሰሌዳውን በመጠቀም፣ በተጠቃሚ እና በአጪርጽሑፍ ማህበር ላይ ያደረገውን አስተዋጽኦ መገምገም እንችላለን፤ ይህም ከሬይልስ አፕልኬሽኖች ጋር ለመስተጋብር የሚጠቅም መሳረያ ነው። በዝርዝር 2.17 ላይ እንደተመለከተው፣ በመጀመሪያ ሰሌዳውን በማዘዥያ መስመር ላይ የሬይልስ ሰሌዳ (rails console) ትእዛዝን በመጥራት ሰሌዳውን እናስጀምረዋለን፤ ቀጥሎም የመጀመሪያ ተጠቃሚን (Teteqami.first) በመጠቀም፣ በውሂበጎታው ውስጥ ያለውን፣ የመጀመሪያ ተጠቃሚ ፈልገን ማግኘት እንችላለን (እዚህ ላይ ውጤቱን የመጀመሪያ_ተጠቃሚ በተባለ ተለዋዋጪ ላይ ያስቀምጥልናል)።10 (የመጨረሻዋን መስመር የጨመርዃት ከሰሌዳው እንዴት መውጣት (exit) እንደምንችል ለማሳየት ነው፤ ብዙ ስርዓተ ክወናዎች ላይ ተመሳሳይ ተግባርን ለመፈጸም “ተቆር-ዲን (Ctrl-D)” መጠቀም ይቻላል።) 11

ዝርዝር 2.17: የሬይልስ ሰሌዳን በመጠቀም የአፕልኬሽኑን ሁኔታ መመርመር።
$ rails console
>> የመጀመሪያ_ተጠቃሚ = Teteqami.first
   (0.5ms)  SELECT sqlite_version(*)
  Teteqamis Load (0.2ms) SELECT "teteqamis".* FROM "teteqamis" ORDER BY "teteqamis".
  "id" ASC LIMIT ?  [["LIMIT", 1]]
 => #<Teteqamis id: 1, sim: "Michael Hartl", emelekt: "michael@example.org",
 created_at: "2019-08-20 00:39:14", updated_at: "2019-08-20 00:41:24">
>> የመጀመሪያ_ተጠቃሚ.achrtshufs
  Achrtshuf Load (3.2ms)  SELECT "achrtshufs".* FROM "achrtshufs" WHERE
  "achrtshufs"."teteqami_id" = ? LIMIT ?  [["teteqami_id", 1], ["LIMIT", 11]]
 => #<ActiveRecord::Associations::CollectionProxy [#<Achrtshuf id: 1, yizet:
 "የመጀመሪያ አጪርጽሑፍ!", teteqami_id: 1, created_at: "2019-08-20 02:04:13",
 updated_at: "2019-08-20 02:04:13">, #<Achrtshuf id: 2, yizet:
 "ሁለተኛ አጪርጽሑፍ", teteqami_id: 1, created_at: "2019-08-20 02:04:30",
 updated_at: "2019-08-20 02:04:30">]>
>> achrtshuf = የመጀመሪያ_ተጠቃሚ.achrtshufs.first
  Achrtshuf Load (0.2ms)  SELECT "achrtshufs".* FROM "achrtshufs" WHERE
  "achrtshufs"."teteqami_id" = ? ORDER BY "achrtshufs"."id" ASC LIMIT ?
  [["teteqami_id", 1], ["LIMIT", 1]]
 => #<Achrtshuf id: 1, yizet: "የመጀመሪያ አጪርጽሑፍ!", teteqami_id: 1, created_at:
 "2019-08-20 02:04:13", updated_at: "2019-08-20 02:04:13">
>> achrtshuf.teteqami
 => #<Teteqamis id: 1, name: "Michael Hartl", emelekt: "michael@example.org",
 created_at: "2019-08-20 00:39:14", updated_at: "2019-08-20 00:41:24"
>> exit

ዝርዝር 2.17 ውስጥ ብዙ ነገር እየተከናወነ ነው፤ እናም የሚዛመዱትን አካላት ማግኘት ለቴክኒካዊ ብልህነት ጥሩ መልመጃ ነው (ሳጥን 1.2)። ውጽዓቱ ቀጥታ ተመላሽ ዋጋወቹን፣ እነሱም ጥሬ የሩቢ ቁሶችን እና እንዲሁም፣ እነሱን የሰራቸውን የተዋቀረ የመጠይቅ ቋንቋ (ተ.መ.ቋ) (Structured Query Language (SQL)) ኮድንም ያካትታል።

ዝርዝር 2.17 ተጠቃሚ.መጀመሪያ‘ን (Teteqami.first) በመጠቀም የመጀመሪያውን ተጠቃሚ ፈልጎ ከማግኘት በተጨማሪ፣ ሁለት ሌሎች ነገሮችን ያሳየናል:- (1) ይህን የመጀመሪያ_ተጠቃሚ.achrtshufs ኮድ በመጠቀም፣ የመጀመሪያው ተጠቃሚ አጪርጽሑፎችን መድረስ እንደሚቻል፤ ይህም መታወቂያው (teteqami_id) ከመጀመሪያው ተጠቃሚ (የመጀመሪያ_ተጠቃሚ) ጋር እኩል የሆኑትን አጪርጽሑፎች በሙሉ በራስሰር እንደሚመልስልን ያሳየናል (በኛ አባባል መታወቂያው 1 ይሆናል።) (2) achrtshuf.teteqami ‘ን በመጠቀም ደግሞ፣ ከአንድ የተወሰነ ቅምጥ ጋር የተጎዳኘ ተጠቃሚን እንዴት እንደሚመልስ ያሳየናል። በዝርዝር 2.17 ውስጥ የተሳተፈውን ሩቢ በምዕራፍ 4 ውስጥ በይበልጥ እንማረዋለን፡፡ በተጨማሪም በ‘ንቅ መዝገብ ውስጥ ስላሉ የማህበር ስራዎች በምዕራፍ 13 እና በምዕራፍ 14 ላይ በደንብ እንማራለን።

መልመጃዎች

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

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

  1. የተጠቃሚውን የመጀመሪያውን የአጪርጽሑፍ ይዘት ለማሳየት፣ የተጠቃሚ ማሳያ ገጹን አርሙ። (በፋይሉ ውስጥ ያሉትን ይዞታዎች እንደ ምሳሌ በመጠቀም፣ አገባቡን ለመገመት፣ የናንተን ቴክኒካዊ ብልሃት ተጠቀሙ (ሳጥን 1.2)።) በድር አሳሻችሁ ላይ ይህንን:- /teteqamis/1 በመጎብኘት መስራቱን አረጋግጡ፡፡
  2. ዝርዝር 2.18 ውስጥ ያለው ኮድ፣ አጪርጽሑፎች ባዶ መሆን አለመቻላቸውን ለማረጋገጥ፣ ለአጪርጽሑፎች ይዞታ መኖር አንድ ማረጋገጫን ያክላል። በምስል 2.18 ላይ የሚታየውን ባህሪ ማግኘታችሁን አረጋግጡ።
  3. (ምስል 2.19) በተጠቃሚ ቅርጸቱ ውስጥ፣ የስም እና የኤመልእክት ባሕሪወች ላይ፣ የስም እና የኤመልእክት መኖርን ለማረጋገጥ፣ ይህን_ሙሉ የሚለው ቃልን ትክክለኛ በሆነ ኮድ በመተካት ዝርዝር 2.19 ን አዘምኑ።
ዝርዝር 2.18: የአጪርጽሑፍ ይዘት መኖርን ማረጋገጫ ኮድ። app/models/achrtshuf.rb
class Achrtshuf < ApplicationRecord
  belongs_to :teteqami
  validates :yizet, length: { maximum: 140 },
                      presence: true
end
images/figures/micropost_content_cant_be_blank
ምስል 2.18: የአጪርጽሑፍ የመኖር ማረጋገጫው ያስገኘው ውጤት።
ዝርዝር 2.19: በተጠቃሚ ቅርጸት ላይ የመኖር ማረጋገጫወችን ማከል። app/models/teteqami.rb
class Teteqami < ApplicationRecord
  has_many :achrtshufs
  validates ይህን_ሙሉ, presence: true   # ይህን_ሙሉ የሚለውን ቃል በትክክለኛ ኮድ ሙሉ።
  validates ይህን_ሙሉ, presence: true   # ይህን_ሙሉ የሚለውን ቃል በትክክለኛ ኮድ ሙሉ።
end
images/figures/user_presence_validations
ምስል 2.19: በተጠቃሚ ቅርጸት ላይ የመኖር ማረጋገጫወች ያስገኙት ውጤት።

2.3.4 የውርስ ስርዓተ-መዓረጎች

ስለ ጨዋታ አፕልኬሽናችን የነበረንን ውይይት፣ በአንድ አጠር ባለ በሬይልስ የመቆጣጠሪያ እና የቅርጸት ክፍል ስርዓተ-መዓረጎች (Hierarchies) ገለጻ እንጨርሰዋለን። ይህ ውይይት ትርጉም ሊሰጣችሁ የሚችለው የቁስ ተኰር ቋንቋ (ቁ.ተ.ቋ) (object-oriented programming (OOP)) ጋር ትንሽ ልምድ ካላችሁ እና በተለይ ደግሞ ስለ ክፍሎች ትንሽ እውቀቱ ካላችሁ ብቻ ነው። ለአሁን ግራ የሚያጋባ ከሆነ አትጨነቁ፣ በክፍል 4.4 ውስጥ እነዚህን ሃሳቦች በበለጠ እንወያይባቸዋለን።

ይህንን ጉዳይ ለመመልከት በቅርጸቶች ውርስ አወቃቀር እንጀምራለን። ዝርዝር 2.20 ‘ን ከዝርዝር 2.21 ጋር ስናነጻጽር የተጠቃሚ ቅርጸቱም የአጪርጽሑፍ ቅርጸቱም ማለት ሁለቱም ከ‘ንቁመዝገብ::መሰረት (ActiveRecord::Base) እንደሚወርሱ እንመለከታለን። (ከግራ ማዕዘን ቅንፍ ምልክቱ በስተግራ በኩል ያለው <) ማለት ከ‘ንቁመዝገብ::መሰረት (ActiveRecord::Base) ይወርሳሉ። ይህም በ‘ንቅመዝገብ የተሰጠ የቅርጸቶች መሰረተ ክፍል (Base Class) ነው። ይህን ግንኙነት በግልጽ የሚያብራራ ስእላዊ መግለጫ በምስል 2.20 ላይ ይገኛል። የቅርጸት ቁሳችን ከውሂበጎታችን ጋር የመግባባት ብቃት የሚያገኙት ከ‘ንቁመዝገብ::መሰረት (ActiveRecord::Base) በመውረስ ነው፣ የውሂበጎታችንን አምዶችም የሚያዩት ልክ እንደ ሩቢ ባሕሪወች እና ወዘተረፈ ነው።

ዝርዝር 2.20: የ‘ተጠቃሚ (Teteqami) ክፍል ውርሻ በቢጫ ቀለም ተሰምሮ። app/models/teteqami.rb
class Teteqami < ApplicationRecord
  .
  .
  .
end
ዝርዝር 2.21: የ‘አጪርጽሑፍ (Achrtshuf) ክፍል ውርሻ በቢጫ ቀለም ተሰምሮ። app/models/achrtshuf.rb
class Achrtshuf < ApplicationRecord
  .
  .
  .
end
images/figures/demo_model_inheritance_4th_ed
ምስል 2.20: የተጠቃሚ እና የአጪርጽሑፍ ቅርጸቶች የውርስ ስርዓተ-መዓረግ።

የመቆጣጠሪያወች የውርስ መዋቅር በመሰረቱ ከቅርጸቶች የውርስ መዋቅር ጋር ተመሳሳይ ነው። ዝርዝር 2.22 ‘ን እና ዝርዝር 2.23 ‘ን ስናነጻጽር የተጠቃሚዎች መቆጣጠሪያውም የአጪርጽሑፎች መቆጣጠሪያውም ሁለቱም የሚወርሱት ከአፕልኬሽን መቆጣጠሪያው እንደሆነ እንመለከታለን። ዝርዝር 2.24 ‘ን ስንመረምር የ‘አፕልኬሽንመቆጣጠሪያ‘ው (ApplicationController) እራሱ ከ‘ተግባርመቆጣጠሪያ::መሰረት (ActionController::Base) እንደሚወርስ እንመለከታለን፤ ይህም በሬይልስ አክሽን ፓክ በተባለው ቤተኮድ የቀረበ የመቆጣጠሪያወች መሰረት ክፍል ነው። በእነዚህ ክፍሎች መካከል ያለው ግንኙነት በምስል 2.21 ላይ በሰእላዊ መግለጫ ቀርቧል።

ዝርዝር 2.22: የ‘ተጠቃሚዎችመቆጣጠሪያ (TeteqamisController) ክፍል ውርሻ በቢጫ ቀለም ተሰምሮ። app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
  .
  .
  .
end
ዝርዝር 2.23: የ‘አጪርጽሑፎችመቆጣጠሪያ (AchrtshufsController) ክፍል ውርሻ በቢጫ ቀለም ተሰምሮ። app/controllers/achrtshufs_controller.rb
class AchrtshufsController < ApplicationController
  .
  .
  .
end
ዝርዝር 2.24: የ‘አፕልኬሽንመቆጣጠሪያ (ApplicationController) ክፍል ውርሻ በቢጫ ቀለም ተሰምሮ። app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  .
  .
  .
end
images/figures/demo_controller_inheritance
ምስል 2.21: የተጠቃሚወች እና የአጪርጽሑፎች መቆጣጠሪያወች የውርስ ስርዓተ-መዓረግ።

እንደ ቅርጸት ውርስ ሁሉ፣ ሁለቱም የተጠቃሚዎች እና የአጪርጽሑፎች መቆጣጠሪያወች ከመሰረታዊ ክፍሉ እጅግ በጣም ብዙ ተግባራትን ስለወረሱ (በዚህ ረገድ ከ‘ተግባርመቆጣጠሪያ::መሰረት (ActionController::Base)) የቅርጸት ቁሶችን ለማንቀሳቀስ፣ ወደመጡበት የሚመለሱ የሃ.ጽ.ማ.ስ መጠይቆችን የማጣራት እና ትይታወችን ወደ ሃ.ጽ.መ.ቋ መቀየር የሚያስችል ብቃቶችን ይወርሳሉ። ሁሉም የሬይልስ መቆጣጠሪያወች ከ‘አፕልኬሽንመቆጣጠሪያ‘ው (ApplicationController) ስለሚወርሱ፣ በአፕልኬሽን መቆጣጠሪያ ላይ የተበየኑ ደንቦች በሙሉ፣ በአፕልኬሽኑ ውስጥ ላሉ ማለት ለእያንዳንዱ ተግባር ደንቡ በራስሰር ይጸድቅላቸዋል። ለዚህ የሚሆን ምሳሌ፣ በክፍል 9.1 ላይ በማሳያ አፕልኬሽኑ መቆጣጠሪያወች ሁሉ፣ ለመግባት እና ለመውጣት የሚያገለግሉ የረጅ ዘዴወችን እንዴት ማካተት እንደምንችል እንመለከታለን።

መልመጃዎች

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

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

  1. የአፕልኬሽን መቆጣጠሪያ ፋይል ይዘትን በመመርመር፣ አፕልኬሽንመቆጣጠሪያ‘ን (ApplicationController) ከ‘ተግባርመቆጣጠሪያ::መሰረት (ActionController::Base) እንዲወርስ የሚያደርገውን አንድ መስመር ኮድ ፈልጋችሁ አግኙ፡፡
  2. ApplicationRecord ከ‘ንቁመዝገብ።መሰረት (ActiveRecord::Base) እንዲወርስ የሚያደርግ፣ አንድ መስመር ኮድን የያዘ አንድ ተመሳሳይ ፋይል አለን? ጠቃሚ ምክር:- ምናልባት በ‘አፕ/ቅርጸቶች (app/models) ማውጫ ውስጥ፣ አፕልኬሽን_መዝገብ.አርቢ (application_record.rb) ተብሎ የሚጠራው ፋይል ውስጥ ሊገኝ ይችል ይሆናል።

2.3.5 የጨዋታ አፕልኬሽኑን ማሰማራት

የአጪርጽሑፎች ሃብትን ከማጠናቀቅ በኋላ፣ አሁን ማከማቻውን ወደ ጊትሃብ ለመግፋት ጥሩ ጊዜ ነው:-

$ git status    # ከማከል በፊት ሁኔታውን መፈተሽ ጥሩ ልማድ ነው።
$ git add -A
$ git commit -m "ጨዋታ አፕልኬሽን ተጨረሰ"
$ git push

እንደ ደንቡ፣ ብዙ ጊዜ ትናንሽ ማቀላቀሎችን ማድረግ ይኖርባችኋል፣ ነገር ግን ለዚህ ምዕራፍ አላማ ሲባል አንድ ትልቅ ነጠላ ማቀላቀልን በመጨረሻ ላይ ማድረጉ ምንም አይልም።

በዚህ ጊዜ እንዲሁ፣ ልክ ክፍል 1.4 ላይ እንደተደረገው፣ የጨዋታ አፕልኬሽኑን ወደ ሃረኩ ማሰማራት ትችላላችሁ:-

$ git push heroku

(ይህ በክፍል 2.1 ውስጥ የሃረኩ አፕልኬሽንን እንደ ፈጠራችሁ አድርጎ ይወስዳል፤ አለበለዚያ ግን ሃረኩ ፍጠር (heroku create) ከዚያም ጊት ዋናን ወደ ሃረኩ ግፋ (git push heroku main) የተባሉትን ሁለት ተከታታይ ትእዛዛት ማካሄድ ይኖርባችኋል። እንዲሁም ሃረኩ አፕ:መረጃን (heroku apps:info) በማስኬድ የሃረኩ አፕልኬሽናችሁን የድር ዓ.አ.ሃ.አ ማግኘት እንደምትችሉ ከክፍል 1.4.1 ትምህርታችን አስታውሱ (ዝርዝር 1.27))

ምስል 2.22 ላይ እንደሚታየው፣ በዚህን ጊዜ ሃረኩ ላይ ገጹን መጎብኘት አንድ የስህተት መልእክትን ያስገኛል፡፡

images/figures/heroku_error
ምስል 2.22: በሃረኩ ላይ አንድ የስህተት ገጽ።

የሃረኩ ዘገባ ፋይልን በመመርመር፣ ችግሩን ማመላከት እንችላለን:-

$ heroku logs

የዘገባ ፋይሉን ወደ ላይ ስትሸበልሉ፣ አንድ እንደዚህ ያለ ነገርን ያካተተ መስመር ማየት አለባችሁ፡-

ActionView::Template::Error (PG::UndefinedTable: ERROR:  relation "teteqamis" does
not exist

ይህ መልእክት አንድ የጎደለ የ‘ተጠቃሚዎች (teteqamis) ሰንጠረዥ መኖሩን የሚያመለክት አንድ ዓብይ ፍንጪን ይሰጣል፡፡ እንደ አጋጣሚ ሆኖ ግን፣ በዝርዝር 2.4 ውስጥ እንደዚህ ያለ ሁኔታ ሲያጋጥም እንዴት እንደምናስተናግደው ተምረን ነበር። ስለዚህ ማድረግ ያለብን ነገር ቢኖር፣ ውሂበጎታውን የሚያፈልሰውን ትእዛዝ ማስኬድ ብቻ ነው፡፡

በሃረኩ ላይ እንዲህ ዓይነቱን ትእዛዝ ለመፈጸም የተለመደው አሰራር፣ የ‘ሃረኩ አስኪድ (heroku run) ትእዛዝ ላይ የሬይልስ ትእዛዝን በቅድመ ቅጥያነት በማስቀመጥ ነው (ይህ ትእዛዝ የ‘አጪርጽሑፎች (achrtshufs) ሰንጠረዥንም ይፈጥራል):-

$ heroku run rails db:migrate

ይህ ትእዛዝ በሃረኩ ላይ ያለውን ውሂበጎታ፣ በአስፈላጊው የተጠቃሚ እና የአጪርጽሑፍ የውሂብ ቅርጸት ያዘምናል። ፍልሰቱን ካካሄዳችሁ በኋላ፣ የጨዋታ አፕልኬሽኑን ከአንድ እውነተኛ የፖስትግሬስተ.መ.ቋ ውሂበጎታ ደጀን ጋር በምርት ውስጥ መጠቀም አለባችሁ።(ምስል 2.23)።12

በመጨረሻም፣ አፕልኬሽኑ በትክክል እንዲጪን ለማድረግ፣ በክፍል 2.3.3.1 ውስጥ ያሉትን መልመጃዎች ሰርታችሁ ከሆነ፣ ማለት የመጀመሪያው ተጠቃሚ አጪርጽሑፍን ለማሳየት የተጠቀማችሁበትን ኮድ ማስወገድ ይኖርባችኋል፡፡ ጉዳዩ እንዲህ ከሆነ፣ የማያስፈልገውን ኮድ ሰርዙ፣ ከዚያ አቀላቅሉ እና በድጋሚ ወደ ሃረኩ ግፉ፡፡

images/figures/toy_app_production
ምስል 2.23: የጨዋታ አፕልኬሽኑን በምርት ላይ ማስኬድ።

መልመጃዎች

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

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

  1. በምርት አፕልኬሽኑ ላይ ጥቂት ተጠቃሚዎችን ፍጠሩ።
  2. በምርት አፕልኬሽኑ ላይ ለመጀመሪያው ተጠቃሚ ጥቂት አጪርጽሑፎችን ፍጠሩ።
  3. ከ 140 ሆሄወች በላይ እርዝመት ያለው አንድ አጪርጽሑፍ ለመፍጠር በመሞከር፣ ዝርዝር 2.14 ያለው ማረጋገጫ በምርት አፕልኬሽኑ ላይ እንደሚሰራ አረጋግጡ፡፡

2.4 መደምደሚያ

የአንድ የሬይልስ አፕልኬሽንን አጠቃላይ እይታን አሁን ጨርሰናል። በዚህ ምዕራፍ ውስጥ የበለጸገው የጨዋታ አፕልኬሽን ብዙ ጠንካራ እና በአንጻሩ ደግሞ ይሄ ነው የማይባል ደካማ ጎኖች አሉት።

ጥንካሬዎቹ

  • የሬይልስን አጠቃላይ እይታን ማቅረቡ፣
  • የቅ.ት.መ (MVC) አሰራርን ማስተዋወቁ፣
  • የው.ሁ.ማ (REST) መዋቅርን ማስተዋወቁ፣
  • የውሂብ ቅርጸትን ማስተዋወቁ እና
  • በምርት ላይ አንድ በውሂበጎታ-የተደገፈ፣ በቀጥታ የሚሰራ የድር አፕልኬሽንን በስራ ላይ ማዋሉ ናቸው።

ድክመቶቹ

  • ብጁ ገጽታ ወይም ቅጥ አለመኖሩ
  • ቛሚ ገጾች አለመኖራቸው (ማለት እንደ “የመነሻ” እና “የስለ”)
  • የተጠቃሚዎችን መሕለፈቃል አለመጠየቁ፣
  • የተጠቃሚዎች ምስል አለመኖሩ፣
  • መግቢያ አለመኖሩ፣
  • ጥበቃ አለመኖሩ፣
  • ራስሰሬ የተጠቃሚ እና የአጪርጽሑፍ ማህበር አለመኖሩ፣
  • “የመከተል” ወይም “የተከታይ” ሃሳብ አለመኖሩ፣
  • የአጪርጽሑፍ ቀላቢ አለመኖሩ፣
  • ትርጉም ያላቸው ፈተናዎች አለመኖራቸው እና
  • ግልጽ አለመሆኑ ናቸው።

የዚህ ስልጠና ቀሪው ክፍል፣ ጠንካራ ጎኖችን በማደለብ እና ድክመቶችን ደግሞ በማስወገድ ላይ የተመደበ ይሆናል፡፡

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

  • መወጣጫ ውሂብን ለመቀረጽ እና በድር በኩል ከእሱ ጋር ለመስተጋብር የሚያገለግሉ ኮዶችን በራስሰር እንደሚፈጥር፣
  • መወጣጫ ቶሎ ለመጀመር ጥሩ፣ ለመረዳት ግን ከባድ እንደሆነ፣
  • ሬይልስ የድር አፕልኬሽኖችን ለማዋቀር ቅርጸት-ትይታ-መቆጣጠሪያን (ቅ.ት.መ (MVC)) እንደሚጠቀም፣
  • በሬይልስ እንደተተረጎመው፣ ከውሂብ ቅርጸት ጋር ለመስተጋብር የው.ሁ.ማ መዋቅር አንድ መደበኛ የዓ.አ.ሃ.አወች ስብስብን እና የመቆጣጠሪያ ተግባሮችን እንደሚያካትት፣
  • ሬይልስ፣ በውሂብ ቅርጸት ባህሪያት ዋጋወች ላይ ገደቦችን ለማስቀመጥ፣ የውሂብ ማረጋገጫዎችን እንደሚደግፍ፣
  • ሬይልስ በተለያዩ የውሂብ ቅርጸቶች መካከል፣ ማህበሮችን ለመፍጠር የሚያገለግሉ አብሮገነብ13 ሥልቶችን ይዞ እንደመጣ እና
  • በማዘዥያ መስመሩ ላይ፣ የሬይልስ ሰሌዳን በመጠቀም፣ ከሬይልስ አፕልኬሽን ጋር መተገባብር እንደምንችል ተምረናል።
2. አጪርጽሑፎች እንደ አሰራራቸው ብዛታቸው ትንሽ ስለሆነ፣ የሃረግ (string) የውሂብ ዓይነት የነሱን ብዛት በደንብ ሊይዝ ይችላል፤ ነገር ግን ጽሑፍ (text) የተባለውን የውሂብ ዓይነት መጠቀሙ፣ አላማችንን በተሻለ መልኩ ይገልጸዋል። በሌላ በኩልም ከጊዜ በኋላ የሆሄያት ብዛትን መጨመር ብንፈልግ፣ እንደፈለግን የመጨመር እድሉን ይሰጠናል። በእርግጥም ትዊተር ከጊዜ በኋላ ከ 140 ሆሄወች ወደ 280 ሆሄወች የመቀየሩ ሁኔታ፣ የዚህ ዓይነቱ አሰራር ምሳሌ ይሆናል፡፡ በውሂበጎታ ውስጥ የ‘ሃረግ (string) የውሂብ ዓይነት 255 (\( 2^8-1 \)) ሆሄወችን ይይዛል። ይህም 140 ሆሄ ላለው አጪርጽሑፍ በቂ ሲሆን፤ 280 ሆሄ ላለው አጪርጽሑፍ ግን በቂ አይደለም። የ‘ጽሑፍ (text) የውሂብ ዓይነትን መጠቀሙ፣ ሁለቱንም ጉዳዮች በአንድነት ለማስተናገድ ያስችላል፡፡
3. የሃይለ ጽሑፍ ማዘዋወሪያ ስምምነት (ሃ.ጽ.ማ.ስ) (HTTP Hypertext Transfer Protocol)
4. የመወጣጫ ስም አመሰራረት የተለመደውን የቅርጸቶች (Models) ስም አመሰራረትን ይከተላል፤ እነዚህም ነጠላ ናቸው። ነገር ግን የሃብቶች (Resources) እና የመቆጣጠሪያወች (Controllers) ስያሜ የብዙ ስም መጠሪያን ይጠቀማሉ። ስለሆነም በነጠላው ተጠቃሚ (Teteqami) ከመባል ይልቅ የብዙ መጠርያ ስምን በመጠቀም ተጠቃሚዎች (Teteqamis) የሚለውን የአጻጻፍ ስልት ይጠቀማሉ።
5. አንዳንድ ማስረጃወች ትይታው (view) በቀጥታ አሳሹ ውስጥ በአፓቸ (Apache) ወይም በኢንጅንኤክስ (Nginx) በድር አገልጋዩ በኩል ሃ.ጽ.መ.ቋን እንደሚያቀርብ ያሳያሉ። የአተገባበሩ ዝርዝር ምንም ይሁን ምን፣ መቆጣጠሪያውን ልክ ሁሉም የአፕልኬሽኑ መረጃወች የሚፈሱበት ማዕከላዊ ነገር፣ እንደሆነ አድርጌ ማየቱን፣ ጠቃሚ ሆኖ አግኝቸዋለሁ።
6. ፌልዲንግ፣ ሮይ ቶማስ። በስነ-ህንፃ ቅጦች እና በአውታረ መረብ ላይ የተመሰረቱ የሶፍትዌር ዲዛይኖች። በእ.ኤ.አ 2000፣ የዶክትሬት ዲግሪ፣ ከካሊፎርኒያ ዩኒቨርሲቲ፣ ኢርቪን።
7. Create Read Update Delete (CRUD) ፈጠረ፣ ነበበ፣ ዘመነ፣ ሰረዘ (ፍ.አ.አ.ሰ) ማለት ነው፡፡
8. ልክ እንደ ተጠቃሚ መወጣጫ፣ ለአጪርጽሑፎች ያለን የመወጣጫ ማስገኛ፣ ሬይልስ ለቅርጸት አሰራር የሚጠቀመውን የነጠላ ስም አሰራርን ይከተላል፤ ስለዚህም አጪርጽሑፍ አመንጪ (generate Achrtshuf) የሚለውን ትእዛዝ እንጠቀማለን።
9. የመወጣጫ ኮዱ ከዝርዝር 2.12 ጋር ሲነጻጸር፣ ተጨማሪ ምንም ጽሑፍ የሌላቸው ነጻ አዲስ መስመሮች ሊኖረው ይችላል። ይህ ሊያሳስባችሁ አይገባም ምክንያቱም ሩቢ ተጨማሪ አዲስ መስመሮችን እንደሚተዋቸው ብቻ ልትገነዘቡ ይገባል።
10. የሩቢ ስሪት ከጊዜ ወደ ጊዜ የተለያየ ስለሚሆን፣ የምሳሌ ማቅረቢያው ሰሌዳ >> የሚል ግባትን ይጠቀማል። የናንተ የሰሌዳ ግባት ግን 2.7.4 :001 > ሊል ይችል ይሆናል።
11. “D” የሚያመለክተው፣ የቁልፍ-ሰሌዳ ላይ ያለውን ቁልፍ ነው እንጅ፣ ዓብይ ፊደሉን አይደለም። ስለዚህ “D” ‘ን ዓብይ ፊደል ለማድረግ “ተቆር-ዲን (Ctrl-D)” መጫን አያስፈልጋችሁም።
12. የምርት ውሂበጎታው ያለምንም ተጨማሪ ዝግጅት መስራት አለበት፤ ነገር ግን አንዳንድ የተወሰነ ዝግጅት የሚገባቸው ነገሮች እንዳሉ በሃረኩ ሰነድ ላይ በይፋ ተመልክቷል። ይህንን በዝርዝር በክፍል 7.5.3 ላይ እንመለከተዋለን፡፡
13. አብሮገነብ (Built-in):- ከፕሮግራሙ ጋር ተሰርቶ የቀረበ፣ አብሮ የመጣ፣ በተፈጥሮ የተካተተ በይነገጽ፣ ስልት/ዘዴ ወይም ኮድ ማለት ነው፡፡