በዚህ ምዕራፍ ውስጥ፣ ጥቂት የሬይልስ ችሎታወችን ለማሳየት፣ አንድ ጨዋታ የተባለ የማሳያ አፕልኬሽንን እናበለጽጋለን። የዚህ ምዕራፍ ዋናው አላማ፣ የሩቢ ኦን ሬይልስ ፕሮግራምን ማለት የአንድ ድር አበለጻጸግን አጠቃላይ ግንዛቤ ለማግኘት፣ መወጣጫ በመባል የሚታወቀውን፣ የኮድ ማመንጫ በመጠቀም፣ ቶሎ ቶሎ ኮዶችን ማመንጨት ነው። ይህ መወጣጫም በርካታ ተግባራትን በራስሰር ይፈጥራል። በሳጥን 2.1 ላይ እንደተገለጸው፣ ቀሪው የመጽሐፉ ክፍሎች ተቃራኒውን ስልት ይጠቀማሉ፤ ነገር ግን ከመቅጽበት አስደሳች ውጤትን ለማግኘት እና በፍጥነት ለመስራት፣ ከመወጣጫ ስልት ጋር የሚስተካከል የአሰራር ዘዴ የለም። የማሳያ አፕልኬሽኑን በምንሰራበት ጊዜ ክብደት እየጨመረ በሄደ ቁጥር፣ እግረ መንገዳችን ላይ የሚያጋጥሙንን አዳዲስ ሃሳቦች እናብራራለን። ከዚህ የሚገኘው የጨዋታ አፕልኬሽን በዓ.አ.ሃ.አወቹ በኩል እንድንተጋበር/እንድንገናኝ እና በሬይልስ የሚወደደውን የመጀመሪያውን አንድ የው.ሁ.ማ (REST) መዋቅር ምሳሌን ጨምሮ፣ የሬይልስ አፕልኬሽንን ውስጣዊ አወቃቀር እንድናይ ያስችለናል።
የጨዋታ አፕልኬሽኑ፣ ከሱ ቀጥለን እንደምንሰራው የማሳያ አፕልኬሽን፣ የአፕልኬሽኑን ተጠቃሚዎች እና ከተጠቃሚወቹ ጋር የሚዛመዱትን አጪርጽሑፎች ይይዛል (ማለት በጥቂቱ የትዊተር አፕ ቅጥን የያዘ ይሆናል)። ተግባራዊነቱ ሙሉ በሙሉ ያልዳበረ እና እንጪጪ ይሆናል፣ በተጨማሪም ብዙወቹ ሂደቶቹ አስማት ይመስላሉ፣ ነገር ግን በዚህ አትጨነቁ፣ ከምዕራፍ 3 ጀምረን አንድ ይህንን እራሱን የሚመስል አፕልኬሽን ከባዶ ተነስተን ማበልጸግ እንጀምራለን፤ እና ይህንን አፕልኬሽን ሰርተን ስንጨርስ በዚሁ ሞያ ላይ ለመጪው ጊዜ ሊያገለግሏችሁ የሚችሉ አስፈላጊ ማጣቀሻወችን እሰጣችኋለሁ። አሁን ግን ዕምነትና ትነሽ ትእግስት ይኑራችሁ። የዚህ ስልጠና ዋናው አላማ ስለ ሬይልስ ሰፊ ዕውቀት እንዲኖራችሁ ማድረግ እና እናንተን በመወጣጫ ከተዘጋጀ አቅርቦት ባሻገር ማድረስ ነው።
ገና ከጅማሬው የሬይልስ ፈጣሪ በሆነው ዴቪድ ሄይንማየር ሃንሰን በተዘጋጀችው፣ በ 15 ደቂቃ ውስጥ የተሰራ ድርን በሚያሳይ አንድ ቪዲዮ ምክንያት፣ ብዙዎች ሬይልስን ለመጠቀም፣ ይሄ ነው የማይባል ጉጉት አድሮባቸው ነበር። ያ እና ተከታታዮቹ ቪዲዮወች የሬይልስ ችሎታን ለማቛደስ ጥሩ ምሳሌዎች ናቸው፤ እናም እነሱን እንድትመለከቷቸው ከወዲሁ ምክሬን እለግሳለሁ፡፡ በነገራችን ላይ አበልጻጊው ያን የመሰለ ድንቅ የአስራ አምስት ደቂቃ ስራ፣ ለማከነወን የተጠቀመው መወጣጫ የተባለውን ገጸባህሪ እንደነበር ልትገነዘቡ ይገባል፤ ይህም በከፍተኛ ደረጃ በሬይልስ የ‘መወጣጫ ፍጠር (generate scaffold
) ትእዛዝ ምትሃታዊ ፈጠራ የመነጨ ኮድ ላይ ጥገኛ የሆነ ነው። አንድ የሩቢ ኦን ሬይልስ ስልጠናን መጻፍ በሚፈለግበት ጊዜ፣ የመወጣጫ አቀራረብ ላይ ለመታመን ያስከጅላል፤ የመወጣጫ አሰራሩ ፈጣን፣ ቀላል እና በጣም አታላይ ነው፤ ሆኖም የመወጣጫ ኮድ ብዛት እና ውስብስብነት ለአዲስ ሬይልስ አበልጻጊ አስቸጋሪ ሊሆን ይችላል። ይህም ቢሆን ልትጠቀሙበት ትችሉ ይሆናል፤ ነገር ግር ልትረዱት አትችሉም። የመወጣጫን ዘዴ መጠቀም አደጋ ላይ እንድትጋለጡ ያደርጋችኋል፤ በቀላሉ የሚቀጪ አነስተኛ የሬይልስ ዕውቀት እና አንድ ልዩ ኮድ የማመንጨት ችሎታ ያለው ሰው ሁናችሁ ትቀራላችሁ።
እኛ በሩቢ ኦን ሬይልስ ስልጠና ውስጥ፣ ከመወጣጫ አሰራር ጋር ጪራሽ አፍ እና ቂጥ (ተቃራኒ) የሆነ አሰራርን እንከተላለን። በምዕራፍ 2 ላይ መወጣጫን በመጠቀም አንድ የጨዋታ አፕልኬሽን ብናዘጋጅም ዋናው ትኩረታችን ግን፣ የሬይልስ ስልጠና ስር መሰረት በሆነው፣ የማሳያ አፕልኬሽኑ ላይ ነው፤ እናም ለዚህ አፕልኬሽን የሚያስፈልገውን ኮድ፣ በምዕራፍ 3 ላይ መጻፍ እንጀምራለን፡፡ በያንዳንዱ በማሳያ አፕልኬሽኑ የዝግጅት ሂደት ላይ፣ የተመጠኑ እና ለመረዳት የቀለሉ ሆኖም ዕውቀታችሁን ለመፈተን ብቃት ያላቸው፣ አዲስና እንግዳ ኮዶችን እንጽፋለን። ከዚህ የምታካብቱት ውጤት አንድ ጥልቅ እና እንደልብ የሚገራ የሬይልስ እውቀት ሲሆን፣ እሱም ማንኛውንም አይነት የድር አፕልኬሽን ለመጻፍ አንድ ጥሩ ዳራን/ችሎታን ይሰጣችኋል።
በዚህ ክፍል ውስጥ፣ ለጨዋታ አፕልኬሽናችን የሚሆነውን እቅድ እነድፋለን፡፡ በክፍል 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 ላይ የተዘረዘሩትን እንቁዎች መጠቀም ይኖርባችኋል (ምንም እንኳን ተመሳሳይ እንቁዎች ቢመስሉም)፡፡
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
በመጨረሻም፣ አፕልኬሽኑን ለማሰማራት ጊዜው ገና አይደለም፣ ለዚህም በዝርዝር 2.2 እና በዝርዝር 2.3 ላይ እንደታዩት ክፍል 1.2.4 ውስጥ የ “ዓለም እንዴት ነሽ!” ሂደቶች ላይ የተጠቀምናቸውን ሂደቶች እንድትከተሉ እመክራችኋለሁ።
selamta
) ተግባርን መጨመር። app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
def selamta
render html: "ዓለም እንዴት ነሽ!"
end
end
config/routes.rb
Rails.application.routes.draw do
root 'application#selamta'
end
ለውጦቹን ከቅርንጫፉ ጋር ቀላቅሉ እና፣ ከዚያ በአንድ ጊዜ ቅርንጫፉን ወደ ሃረኩ እና ወደ ጊትሃብ ግፉት። የሁለቱንም ማለት የሃረኩ እና የጊትሃብ ቅጂዎችን አንድ ዓይነት እንዲሆኑ ማድረጉ አንድ ጥሩ ሃሳብ ነው።
$ git commit -am "ሰላምታን መጨመር"
$ heroku create
$ git push && git push heroku main
ወደ ጊትሃብ እና ሃረኩ ቅርንጫፉን በአንድ ጊዜ ስንገፋ፣ ሁለቱን የጊት ግፋ (push
) ትእዛዛትን ለማጣመር፣ እዚህ ላይ ሁለት እናወችን ማለት ኤምፐርሳንድ የተባለውን የስሌት ምልክትን &&
ተጠቅመናል፤ እዚህ ላይ ሁለተኛው ትእዛዝ የሚፈጸመው፣ የመጀመሪያው ከተሳካ ብቻ ይሆናል (ይህ የስሌት ምልክት &&
“እና” ተብሎ ይነበባል)።1
ልክ እንደ ክፍል 1.4 ለአሁኑ ችላ መባል የሚገባቸው፣ አንዳንድ የማስጠንቀቂያ መልእክቶችን ልታዩ ትችላላችሁ፡፡ በክፍል 7.5 ላይ እንደሚሆን እናደርጋቸዋለን፡፡ ከሃረኩ አፕ ዓ.አ.ሃ.አ በስተቀር ውጤቱ ከምስል 1.31 ጋር አንድ ዓይነት መሆን አለበት።
አሁን አፕልኬሽኑን መስራት ለመጀመር ዝግጁ ነን። አንድ የድር አፕልኬሽንን ለመስራት የመጀመሪያው ሂደት፣ ለአፕልኬሽኑ አስፈላጊ የሆነውን መዋቅር የሚያሳይ አንድ የውሂብ ቅርጸትን (Data Model) መፍጠር ነው፤ ይህም በአፕልኬሽናችን መካከል ያሉትን ግንኙነቶ ጨምሮ፣ ለአፕልኬሽናችን የሚያስፈልጉ መዋቅሮችን የሚወክል አንድ መወከያ ነው። በእኛ ሁኔታ፣ የጨዋታ አፕልኬሽኑ ተጠቃሚዎች እና አጪርጽሑፎችን ብቻ የያዘ፣ አንድ የትዊተር ዓይነት ማይክሮብላግ ይሆናል። ስለዚህ በዚህ ክፍል ውስጥ፣ በአፕልኬሽኑ ላይ አንድ የተጠቃሚዎች ቅርጸትን በመስራት እንጀምር እና ከዚያ በክፍል 2.1.2 ላይ አንድ የአጪርጽሑፎች ቅርጸትን እንጨምረለን።
ብዙ ዓይነት የድር መመዝገቢያ ቅጾች እንዳሉ ሁሉ፣ የአንድ ተጠቃሚ የውሂብ ቅርጸትን ለመስራትም፣ እንዲሁ ብዙ ምርጫዎች አሉ፤ እኛ ግን ነገሮችን ለማቅለል፣ አንድ ቀለል ያለ መንገድን እንጠቀማለን፡፡ የጨዋታ አፕልኬሽናችን ተጠቃሚዎች፣ የራሳቸው ብቻ የሆነ (የውሂብ አይነቱ ሙሉ ቁጥር (integer
)) መታወቂያ (id
) የተባለ አንድ ልዩ ጠቋሚ፣ አንድ ማንም ሊያየው የሚችል ስም (sim
) (የውሂብ አይነቱ ሃረግ (string
)) እና እንዲሁም ከተጠቃሚ ስሙ በብዛቱ እጥፍ የሆነ፣ አንድ የ‘ኤመልእክት (emelekt
) አድራሻ (ይሄም የውሂብ አይነቱ ሃረግ (string
)) ይኖራቸዋል። (እዚህ ላይ ይህ አፕልኬሽን የመሕለፈቃል ባሕሪ (Attribute) እንደሌለው ልብ በሉ፤ ይሄ ሁኔታም ነው “የጨዋታ” አፕልኬሽን ለመሆን ያበቃው። ከምዕራፍ 6 ጀምሮ ስለ መሕለፈቃል አሰራር እንማራለን።) የተጠቃሚዎች የውሂብ ቅርጸት በምስል 2.2 ላይ ይታያል።
ከክፍል 6.1.1 ጀምሮ እንደምንመለከተው፣ በምስል 2.2 ውስጥ ያለው የ‘ተጠቃሚዎች (teteqamis
) መሰየሚያ፣ በውሂበጎታው ውስጥ ካለው ሰንጠረዥ ጋር ይጎዳኛል፤ እናም የ‘መታወቂያ (id
) የ‘ስም (sim
) እና የ‘ኤመልእክት (emelekt
) ባሕሪወቹ፡ በሰንጠረዡ (Table) ውስጥ ልክ እንደ አምዶች (Columns) ይወሰዳሉ።
በመግቢያው ላይ እንደምታስታውሱት፣ አጪርጽሑፍ ማለት አንድ አጪር መልእክት ማለት ሲሆን፤ በተለይ ደግሞ “ትዊተር” የሚባለው ቃል፣ በትዊተር የተሰጠ ምርት ተኮር አጠቃላይ ስያሜ ነው፡፡ የአጪርጽሑፍ የውሂብ ቅርጸት፣ ከተጠቃሚዎች የውሂብ ቅርጸት የቀለለ ነው። የአጪርጽሑፍ የውሂብ ቅርጸቱ አንድ የ‘መታወቂያ (id
) እና ለአጪርጽሑፉ መጻፊያ የሚሆን አንድ የ‘ይዘት (yizet
) መስክ (የውሂብ አይነቱ ጽሑፍ (text
)) ብቻ ይኖረዋል።2 ይሁን እንጂ አሁን አንድ ችግር አለ። እያዳንዱን አጪርጽሑፍ ከባለቤቱ (ከተጠቃሚው) ጋር ማዛመድ (Associate) እንፈልጋለን። ይህን ለማከናወን የአጪርጽሑፉን ባለቤት የመታወቂያ፣ ማለት የ‘ተጠቃሚ_መታወቂያ‘ውን (teteqami_id
) በመዝገብ ላይ ማስፈር ይኖርብናል። ውጤቱ በምስል 2.3 ላይ ተመልክቷል።
በክፍል 2.3.3 (እንዲሁም በምዕራፍ 13 ውስጥ ከዚህ በበለጠ በተሟላ መልኩ) የ‘ተጠቃሚ_መታወቂያ (teteqami_id
) ባሕሪ፣ አንድ ተጠቃሚ ከእሱ ጋር የሚዛመዱትን ብዙ አጪርጽሑፎች እንዴት ግልጽ እና ቀላል በሆነ ሁኔታ እንደሚገልጽልን እንመለከታለን።
በዚህ ክፍል ውስጥ፣ በክፍል 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
) በመጠቀም፣ በመጀመሪያ የውሂብጎታውን ማፍለስ ይኖርብናል፡፡
$ 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 ውስጥ ካለው መዋቅር ጋር አንድ አይነት የሆነ መዋቅርን ማከል አለባችሁ።
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 ውስጥ የተጠቃሚዎች ሃብት መወጣጫን በማመንጨት ላይ፣ ሬይልስ ተጠቃሚዎችን ለማንቀሳቀስ የሚያገለግሉ ቁጥራቸው ብዙ የሆነ ገጾችን ፈጥሯል። ለምሳሌ:- ሁሉንም ተጠቃሚዎች ለመዘርዘር /ተጠቃሚዎች (/teteqamis) የተባለ ዓ.አ.ሃ.አን እና አዲስ ተጠቃሚን ለመፍጠር /ተጠቃሚዎች/አዲስ (/teteqamis/new) የተባለ ዓ.አ.ሃ.አን አመንጪቶልናል። ቀሪው የዚህ ክፍል ክፍለ ጊዜ፣ እነዚህን የተጠቃሚ ገጾች ለመቃኘት የተመደበ ይሆናል። በጉዟችን ላይ ይህን ሰንጠረዥ 2.1 መጣቀሱ ሊረዳ ይችላል፤ ይህም በገጾቹ እና በዓ.አ.ሃ.አወቹ መካከል ያለውን ዝምድና ያሳያል።
ዓ.አ.ሃ.አ | ተግባር | ጥቅም |
/teteqamis | index |
ሁሉን ተጠቃሚዎች ለመዘርዘር የሚጠቅም ገጽ |
/teteqamis/1 | show |
መታወቂያው 1 የሆነውን ተጠቃሚ ለማሳየት የሚጠቅም ገጽ |
/teteqamis/new | new |
አንድ አዲስ ተጠቃሚን ለመስራት የሚጠቅም ገጽ |
/teteqamis/1/edit | edit |
መታወቂያው 1 የሆነውን ተጠቃሚ ለማረም የሚጠቅም ገጽ |
ማውጫ (index
) በተባለው፣ በአፕልኬሽናችን ውስጥ በ‘/ተጠቃሚዎች (/teteqamis) ላይ በሚገኘው፣ ያሉትን ተጠቃሚዎች በሙሉ መዘርዘር በሚያስችለው ገጽ እንጀምራለን። ወደዚህ ገጽ ለመሄድ በአሳሻችሁ የአድራሻ አሞሌ ላይ ጠቅ አድርጉ እና በስረ ዓ.አ.ሃ.አው መጨረሻ (ምስል 2.4) ላይ “/teteqamis” ን አክሉ፤ እናም የተሟላው ዓ.አ.ሃ.አ የዚህን አይነት ቅጽ የያዘ ይሆናል ማለት ነው:- https://www.msalie.com/teteqamis
ከወዲሁ እንደምትገምቱት፣ በመጀመሪያ ምንም ተጠቃሚ አይኖረንም (ምስል 2.5)።
አንድ አዲስ ተጠቃሚን ለመፍጠር፣ በምስል 2.5 ላይ እንደሚታየው “New Teteqamis” የሚለውን አገናኝ ጠቅ ማድረግ እንችላለን፤ አዲሱን (new
) ገጽ በ‘/ተጠቃሚዎች/አዲስ (/teteqamis/new) ላይ መጎብኘቱ ደግሞ፣ ልክ በምስል 2.6 ላይ እንደሚታየው ዓይነት ውጤትን ይሰጣል፤ ይህም በምዕራፍ 7 ላይ የተጠቃሚ መመዝገቢያ ገጽ በመሆን ያገለግለናል።
የስም እና የኤመልእክቱን ዋጋ በጽሁፉ መስክ ውስጥ ካስገባን በኋላ፣ “Create Teteqamis” የሚለውን አዝራር ጠቅ በማድረግ አንድ አዲስ ተጠቃሚን መፍጠር እንችላለን፡፡ ውጤቱን ምስል 2.7 ላይ እንደምናየው፣ የተጠቃሚ ማሳያ (show
) ገጽን በ‘/ተጠቃሚዎች/1 (/teteqamis/1) ላይ እናገኛለን። (በአረንጋዴ የተጻፈው የእንኳን ደህና መጡ መልእክት የተከናወነው በብልጪታ (Flash) ነው፤ ስለሱ በክፍል 7.4.2 ላይ እንማራለን።) አስተውሉ! በ‘/ተጠቃሚዎች/1 (/teteqamis/1) ዓ.አ.ሃ.አ ላይ 1
ቁጥር የሚያመለክተው እንደምትገምቱት፣ በምስል 2.2 ላይ ያለውን የተጠቃሚውን የ‘መታወቂያ (id
) ባሕሪ ብቻ ነው። ይህ ገጽ በክፍል 7.1 ላይ፣ የአንድ ተጠቃሚ መገለጫ (Profile) ገጽ በመሆን ያገለግለናል (በዚህ ስልጠና ውስጥ የመገለጫ ገጽ ማለት የአንድ ተጠቃሚ አጪር ግለ ታሪክን የያዘ ገጽ ማለት ነው። ስለሆነም ከዚህ በኋላ ባለው ትምህርት ላይ ይህንኑ ቃል እንጠቀማለን)።
የአንድ ተጠቃሚ መረጃን ለመቀየር “Edit” የሚለውን አገናኝ ጠቅ አድርገን የ‘አርትዕ (edit
) ገጽን በ‘/ተጠቃሚዎች/1/አርትዕ (/teteqamis/1/edit) ላይ እንጎበኛለን (ምስል 2.8)። የምንፈልገውን መረጃ ካስተካከልን በኋላ፣ የተጠቃሚውን ማዘመኛ ማለት “Update Teteqami” የሚለውን አዝራር ጠቅ ስናደርግ በአፕልኬሽናችን ውስጥ ያለውን የተጠቃሚ መረጃ አዘመንን ማለት ነው (ምስል 2.9)። (ምዕራፍ 6 ላይ በዝርዝር ልናየው እንደምንችለው፣ ይህ የተጠቃሚ ውሂብ በአንድ የውሂበጎታ ደጀን ውስጥ ይከማቻል፡፡) በክፍል 10.1 ላይ ተጠቃሚን የማረም እና የማዘመን ተግባራዊነትን በማሳያ አፕልኬሽናችን ላይ እንጨምራለን።
አዲስ (new
) ገጽን በ /teteqamis/new ላይ በድጋሜ በመጎብኘት አሁን ደግሞ አንድ ሁለተኛ ተጠቃሚን እንፈጥር እና ከዚያ ሁለተኛውን የተጠቃሚ የመረጃ ስብስብን እናስረክባለን። የተገኘው የተጠቃሚው ማውጫ (index
) ገጽ በምስል 2.10 ላይ ይታያል። ክፍል 7.1 ሁሉንም ተጠቃሚዎች ለማሳየት፣ አንድ በይበልጥ የተለቃለቀ የመዘርዘሪያ ገጽን ያበለጽጋል።
ተጠቃሚዎችን እንዴት መፍጠር፣ ማሳየት እና ማረም እንደምንችል እስካሁን ተመልክተናል፤ አሁን ደግሞ ከዚህ ቀደም የፈጠርናቸውን ተጠቃሚዎች እንዴት ማጥፋት እንደምንችል (ምስል 2.11) እንመለከታለን። ይህንን ማድረግ የምንችለው፣ በምስል 2.11 ላይ ጠቁሮ የምናየውን (መደምሰሻ) ጠቅ በማድረግ ነው፤ ይህንን ስናደርግ ሁለተኛው ተጠቃሚ ጠፍቶ፣ አንድ ተጠቃሚ ብቻ ወደላበት ገጽ ይመራናል። (አስተውሉ! ይህ ተግባር ካልሰራ፣ በድር አሳሽችሁ ውስጥ ጃቫስክሪፕት መንቃቱን አረጋግጡ። ሬይልስ ጃቫስክሪፕትን በመጠቀም አንድ ተጠቃሚን ለማጥፋት የሚያስፈልገውን መጠይቅ ያቀርባል፡፡) ክፍል 10.4 አጠቃቀሙን በአንድ ልዩ የአስተዳደር ተጠቃሚዎች ክፍል ውስጥ በመገደብ፤ የተጠቃሚዎች ስረዛን ለማሳያ አፕልኬሽኑ ያክላል።
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
የተጠቃሚዎች ሃብትን አጠቃላይ እይታን ባጪሩ ተመልክተናል፤ አሁን ደግሞ በክፍል 1.2.3 ውስጥ ከተዋወቅነው፣ ከቅርጸት-ትይታ-መቆጣጠሪያ (Model-View-Controller) (ቅ.ት.መ (MVC)) ንድፍ ውስጥ አንዱን ክፍል ብቻ እንመረምራለን። የቅ.ት.መ (MVC) አሰራርን ለመረዳት የምንጠቀመው ስልት፣ በቅ.ት.መ (MVC) አንጻር አንድ ተራ የድር አሳሽ የተጠቃሚ መዘርዘሪያ ገጹን ማለት /teteqamis ን ሲመታ የሚገኙ ውጤቶችን በመግለጽ ይሆናል (ምስል 2.12)።
በምስል 2.12 ላይ የተመለከቱት ፍጻሜወች የቅደም ተከተል ማጠቃለያ እነሆ:-
index
) ተግባር ያዘዋውረዋል።
index
) ተግባር (ሁሉንም ተጠቃሚዎች (Teteqami.all
)) ፈልጎ እንዲያገኝ፣ የተጠቃሚ ቅርጸቱን (Teteqamis model) ይጠይቃል።
@teteqamis
) በተባለ ተለዋዋጪ ላይ ይዞ፣ ወደ ማውጫ (index
) ትይታ ገጹ ያስተላልፋል።
አሁን ከላይ ያሉትን ቅደም ተከተሎች ጠለቅ ባለ ዝርዝር እንመልከት። የምንጀምረው አንድ በድር አሳሹ በተሰጠ መጠይቅ ላይ መሰረት በማድረግ ይሆናል። ማለትም አንድ ዓ.አ.ሃ.አን በአድራሻ አሞሌው ላይ በመጻፍ፣ ወይም አንድ አገናኝን ጠቅ በማድረግ በተገኘ ውጤት ይሆናል (በምስል 2.12 ውስጥ ቁጥር አንድን (1) መፈጸም ማለት ነው)። ይህ መጠይቅ የሬይልስ ማዘዋወሪያ (Rails Router) ጋር ይደርሳል (በምስል 2.12 ውስጥ ቁጥር ሁለትን (2) መፈጸም ማለት ነው)፣ ይህም ሬይልስ የዓ.አ.ሃ.አው መጠይቅ ላይ በመመርኮዝ ዓ.አ.ሃ.አውን ትክክለኛ ወደሆነው የመቆጣጠሪያ ተግባር (Controller Action) ይልከዋል (በሳጥን 3.2 ላይ ይህ ምን ዓይነት መጠይቅ እንደሆነ እንመለከታለን)። ለተጠቃሚዎች ሀብቶች፣ የመቆጣጠሪያ ተግባሮችን፣ የተጠቃሚ ዓ.አ.ሃ.አወች ካርታን እንዲፈጥር የሚያደርገው ኮድ በዝርዝር 2.6 ውስጥ ይገኛል፡፡ ይህ ኮድ በሰንጠረዥ 2.1 ላይ ያየነውን የዓ.አ.ሃ.አ እና የተግባር ጥምረትን ያሰናዳልናል። (:ተጠቃሚወች (:teteqamis
) የሚለው እንግዳው ስርዓተ-ምልክት ወካይ (Symbol) ይባላል፣ ይህንንም በክፍል 4.3.3 ላይ እንማረዋለን።)
config/routes.rb
Rails.application.routes.draw do
resources :teteqamis
root 'application#selamta'
end
የማዘዋወሪያወች ፋይልን በመመልከት ላይ እያለን፣ እግረ መንገዳችንን የተጠቃሚወች መዘርዘሪያ ገጹን ከስር ማዘዋወሪያው ጋር እናቆራኘው እና ከዚያ “የህዝባር” ምልክቱ ወደ /ተጠቃሚዎች (/teteqamis) እንደሚወስድ እናድርገው። የስር ማዘዋወሪያውን ዝርዝር 2.3 ላይ እንዲህ አድርገን እንዳከልን አስታውሱ:-
root 'application#selamta'
ስለዚህም በአፕልኬሽን መቆጣጠሪያ ውስጥ፣ የስር ማዘዋወሪያው ወደ ሰላምታ ተግባሩ ተጉዞ ነበረ። በአሁኑ ጊዜ፣ በተጠቃሚዎች መቆጣጠሪያ ውስጥ የ‘ማውጫ (index
) ተግባርን መጠቀም እንፈልጋለን፣ ይህንንም በዝርዝር 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 ላይ በሰፊው እንመለከታቸዋለን።)
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 የሆነውን ተጠቃሚ ማጥፋት |
ስለ ሩቢ ኦን ሬይልስ የድር አበለጻጸግ ብዙ የምታነቡ ከሆነ፣ ስለ “ው.ሁ.ማ (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))።
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
) ያዘጋጃል፡፡
app/models/teteqami.rb
class Teteqami < ApplicationRecord
end
በዝርዝር 2.11 ላይ እንደሚታየው፣ አንዴ የ‘@ተጠቃሚዎች (@teteqamis
) ተለዋዋጩ ከተበየነ በኋላ፣ መቆጣጠሪያው ትይታውን ይጠራዋል (በምስል 2.12 ውስጥ ቁጥር ስድስትን (6) መፈጸም ማለት ነው)። በዚህ @
ወካይ የሚጀምሩ ተለዋዋጮች ቅርፀ ተለዋዋጮች (Instance Variables) ይባላሉ፤ እነሱም በትይታ ውስጥ በራስሰር ይገኛሉ። በዚህ ጊዜ፣ በዝርዝር 2.11 ላይ ያለው የ index.html.erb
ትይታ በ‘@ተጠቃሚዎች (@teteqamis
) ዝርዝር ላይ ይደጋገም እና ለእያንዳንዱ አባል አንድ የሃ.ጽ.መ.ቋ መስመርን ያመነጫል። (አስተውሉ፣ አሁን ይህን ኮድ እንድትረዱት አይጠበቅባችሁም። ይሄ የቀረበው ምሳሌውን ለማሳየት ብቻ ነው።)
ማሳሰቢያ:- አንዳንድ የትርጉም ግጪቶችን ለመከላከል፣ በዚህ ስልጠና ላይ “ቅርጸት” የሚለው ቃል በአማርኛ ትርጉም ላይ በተለያየ መልኩ ለመጠቀም ተሞክሯል፤ ስለሆነም የቃሉን ትርጉም ሳይሆን አጻጻፉን ለመለየት ሲባል “Instance Variable” ለሚለው ቃል ቅር“ፀ” ማለት ቅርፀ የሚለውን የአጻጻፍ ስልት እንጠቀማለን እናም በዚህ ስልጠና ውስጥ ቅርጸት እና ቅርፀት አንድ አይነት እንዳልሆነ ከወዲሁ ልትረዱት ይገባል።
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) መፈጸም ማለት ነው)።
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
set_teteqami
ተብሎም ይጠራል፡፡
ስለሬይልስ አንድ ጠቅለል ያለ ግንዛቤ ለማግኘት ቢረዳንም፣ የመወጣጫ የተጠቃሚ ሃብቱ፣ ብዙ ድክመቶች አሉት።
የተጠቃሚዎች ሃብትን አመንጪተን እና በደንብ ተመልክተን ጨርሰናል፤ አሁን ደግሞ ተራው፣ የተዛማጁ የአጪርጽሑፎች ሃብት ነው። የዚህ ክፍል የአጪርጽሑፎች ሃብትን በክፍል 2.2 ላይ ካሉት፣ ተዛማጅ የተጠቃሚዎች ሃብት ጋር እንድታነጻጽሩት አሳስባለሁ፤ ሁለቱ ሃብቶች በብዙ ነገሮች እንደሚመሳሰሉ ልታስተውሉ ይገባል። የሬይልስ አፕልኬሽን ሙሉየው.ሁ.ማ መዋቅር ይበልጥ የሚገባን፣ ይህንን አሰራር በመደጋገም ነው። በእርግጥም በዚህ ገና በሆነ ደረጃ ላይ እንኳን፣ የተጠቃሚዎች እና የአጪርጽሑፎች ትይዩ አወቃቀርን ማየቱ፣ ለዚህ ምዕራፍ ዋነኛው መንስኤ ከሆኑት ነገሮች ውስጥ አንዱ ነው፡፡
ልክ እንደ ተጠቃሚዎች ሃብት ለአጪርጽሑፎች ሃብትም፣ የመወጣጫ ኮድን ለማመንጨት የምንጠቀመው የ‘ሬይልስ መወጣጫ አመንጪ (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 ላይ እንደሚታየው፣ በአጪርጽሑፎች መቆጣጠሪያ ውስጥ ካሉት ተግባሮች ጋር የአጪርጽሑፍ ዓ.አ.ሃ.አወችን ያመላክታል።
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.13 ውስጥ በንድፋዊ መልኩ ይታያል። ልብ በሉ TeteqamisController
ቦታ ላይ AchrtshufsController
የሚለውን ከመተካቱ ውጪ፣ በዝርዝር 2.13 ውስጥ ያሉት ኮዶች ዝርዝር 2.8 ውስጥ ካሉት ኮዶች ጋር ፍጹም አንድ ዓይነት ናቸው። ይህ ለሁለቱም ሃብቶች የጋራ የሆነ የው.ሁ.ማ መዋቅር እንዳላቸው የሚያሳይ አንድ ነጸብራቅ ነው።
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 ላይ የሚፈለገውን መረጃ እናስገባለን፡፡
አሁን አንድ ወይም ሁለት አጪርጽሑፎችን መፍጠር እንችላለን። ስንፈጥር ግን ቢያንስ አንዱ የ‘ተጠቃሚ_መታወቂያ (teteqami_id
) ቁጥሩ 1
ሊሆን ይገባል፤ በክፍል 2.2.1 ላይ ከፈጠርነው ተጠቃሚ ጋር እንዲዛመድ። ውጤቱ በምስል 2.15 ላይ ያለውን መምሰል ይኖርበታል።
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
ማንኛውም አጪርጽሑፍ ልክ እንደ ስሙ፣ የተቀመጡን እርዝመት ለማስገደድ የሚያስችሉ አንዳንድ መንገዶች ሊኖሩት ይገባል፡፡ ይህንንም ማረጋገጫ (Validations) የተባለውን የሬይልስ ማረጋገጫ ከአንድ እርዝመት (length
) ከተባለ፣ የእርዝመት ማረጋገጫ ጋር በመጠቀም፣ የአጪርጽሑፉ ሆሄ ከ 140 እንዳይበልጥ መገደብ እንችላለን (ትዊተርም መጀመሪያ ላይ ይህንኑ አሰራር ይጠቀም እንደነበር ይታወቃል)። በዚህ ጊዜ አፕ/ቅርጸቶች/አጪርጽሑፍ.አርቢ (app/models/achrltf.rb
) ፋይልን በአንድ የጽሑፍ አርታኢ ወይም በቅ.ማ.አ ውስጥ በመክፈት፣ የዝርዝር 2.14 ን ይዞታ ወደ ፋይሉ መጨመር ይኖርባችኋል።
app/models/achrtshuf.rb
class Achrtshuf < ApplicationRecord
validates :yizet, length: { maximum: 140 }
end
በዝርዝር 2.14 ላይ ያለው ኮድ ሚስጥራዊ መስሎ ሊታይ ይችላል፤ ነገር ግን ወደ አዲሱ የአጪርጽሑፍ ገጽ ላይ ሄደን ለቅምጥ ይዘቱ፣ ከ 140 በላይ የሆኑ ሆሄወችን ስናስገባ ውጤቱ በቀላሉ ሊታይ ይችላል (በክፍል 6.2 ላይ ስለ ማረጋገጫ Validations በሰፊው እንመለከታለን)። ሬይልስ የአጪርጽሑፉ ሆሄ በጣም ረጅም መሆኑን ለማመላከት የስህተት መልእክቶችን ያቀርባል። (በክፍል 7.3.3 ላይ ስለነዚህ የስህተት መልእክቶች በሰፊው እንማራለን።)
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
ብዙ_አጪርጽሑፎች
አሉትከሬይልስ ጠንካራ ጎኖች ውስጥ አንዱ፣ በተለያዩ የውሂብ ቅርጸቶች መካከል ዝምድናን (Associations) መፍጠሩ ነው። የተጠቃሚ ቅርጸትን በተመለከተ፣ እያንዳንዱ ተጠቃሚ ብዙ አጪርጽሑፎች ሊኖሩት ይችላል። በዝርዝር 2.15 እና በዝርዝር 2.16 ውስጥ የተጠቃሚ እና የአጪርጽሑፍ ቅርጸቶቹን በማዘመን ይህንን ዝምድና በኮድ መግለጽ እንችላለን፡፡
app/models/teteqami.rb
class Teteqami < ApplicationRecord
has_many :achrtshufs
end
app/models/achrtshuf.rb
class Achrtshuf < ApplicationRecord
belongs_to :teteqami
validates :yizet, length: { maximum: 140 }
end
የዚህን ማህበር ውጤት በምስል 2.17 ውስጥ ማየት እንችላለን። የአጪርጽሑፎች (achrtshufs
) ሰንጠረዥ ውስጥ ባለው የ‘ተጠቃሚ_መታወቂያ (teteqami_id
) አምድ መሰረት ሬይልስ (ንቅ መዝገብን በመጠቀም) ከእያንዳዱ ተጠቃሚ ጋር የሚዛመደውን አጪርጽሑፍ ማወቅ ይችላል።
በምዕራፍ 13 እና በምዕራፍ 14 ላይ ተጠቃሚዎችን እና ሁሉንም የተጠቃሚዎች አጪርጽሑፎችን ለማሳየት፤ አንድ የትዊተር ዓይነት፣ የአጪርጽሑፍ ቀላቢን ለማዋቀር፣ የተጠቃሚዎችን እና የአጪርጽሑፎችን ማህበር እንጠቀማለን። ለአሁኑ ግን ሰሌዳውን በመጠቀም፣ በተጠቃሚ እና በአጪርጽሑፍ ማህበር ላይ ያደረገውን አስተዋጽኦ መገምገም እንችላለን፤ ይህም ከሬይልስ አፕልኬሽኖች ጋር ለመስተጋብር የሚጠቅም መሳረያ ነው። በዝርዝር 2.17 ላይ እንደተመለከተው፣ በመጀመሪያ ሰሌዳውን በማዘዥያ መስመር ላይ የሬይልስ ሰሌዳ (rails console
) ትእዛዝን በመጥራት ሰሌዳውን እናስጀምረዋለን፤ ቀጥሎም የመጀመሪያ ተጠቃሚን (Teteqami.first
) በመጠቀም፣ በውሂበጎታው ውስጥ ያለውን፣ የመጀመሪያ ተጠቃሚ ፈልገን ማግኘት እንችላለን (እዚህ ላይ ውጤቱን የመጀመሪያ_ተጠቃሚ
በተባለ ተለዋዋጪ ላይ ያስቀምጥልናል)።10 (የመጨረሻዋን መስመር የጨመርዃት ከሰሌዳው እንዴት መውጣት (exit
) እንደምንችል ለማሳየት ነው፤ ብዙ ስርዓተ ክወናዎች ላይ ተመሳሳይ ተግባርን ለመፈጸም “ተቆር-ዲን (Ctrl-D)” መጠቀም ይቻላል።) 11
$ 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 ላይ በደንብ እንማራለን።
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
ይህን_ሙሉ
የሚለው ቃልን ትክክለኛ በሆነ ኮድ በመተካት ዝርዝር 2.19 ን አዘምኑ።
app/models/achrtshuf.rb
class Achrtshuf < ApplicationRecord
belongs_to :teteqami
validates :yizet, length: { maximum: 140 },
presence: true
end
app/models/teteqami.rb
class Teteqami < ApplicationRecord
has_many :achrtshufs
validates ይህን_ሙሉ, presence: true # ይህን_ሙሉ የሚለውን ቃል በትክክለኛ ኮድ ሙሉ።
validates ይህን_ሙሉ, presence: true # ይህን_ሙሉ የሚለውን ቃል በትክክለኛ ኮድ ሙሉ።
end
ስለ ጨዋታ አፕልኬሽናችን የነበረንን ውይይት፣ በአንድ አጠር ባለ በሬይልስ የመቆጣጠሪያ እና የቅርጸት ክፍል ስርዓተ-መዓረጎች (Hierarchies) ገለጻ እንጨርሰዋለን። ይህ ውይይት ትርጉም ሊሰጣችሁ የሚችለው የቁስ ተኰር ቋንቋ (ቁ.ተ.ቋ) (object-oriented programming (OOP)) ጋር ትንሽ ልምድ ካላችሁ እና በተለይ ደግሞ ስለ ክፍሎች ትንሽ እውቀቱ ካላችሁ ብቻ ነው። ለአሁን ግራ የሚያጋባ ከሆነ አትጨነቁ፣ በክፍል 4.4 ውስጥ እነዚህን ሃሳቦች በበለጠ እንወያይባቸዋለን።
ይህንን ጉዳይ ለመመልከት በቅርጸቶች ውርስ አወቃቀር እንጀምራለን። ዝርዝር 2.20 ‘ን ከዝርዝር 2.21 ጋር ስናነጻጽር የተጠቃሚ ቅርጸቱም የአጪርጽሑፍ ቅርጸቱም ማለት ሁለቱም ከ‘ንቁመዝገብ::መሰረት (ActiveRecord::Base
) እንደሚወርሱ እንመለከታለን። (ከግራ ማዕዘን ቅንፍ ምልክቱ በስተግራ በኩል ያለው <
) ማለት ከ‘ንቁመዝገብ::መሰረት (ActiveRecord::Base
) ይወርሳሉ። ይህም በ‘ንቅመዝገብ የተሰጠ የቅርጸቶች መሰረተ ክፍል (Base Class) ነው። ይህን ግንኙነት በግልጽ የሚያብራራ ስእላዊ መግለጫ በምስል 2.20 ላይ ይገኛል። የቅርጸት ቁሳችን ከውሂበጎታችን ጋር የመግባባት ብቃት የሚያገኙት ከ‘ንቁመዝገብ::መሰረት (ActiveRecord::Base
) በመውረስ ነው፣ የውሂበጎታችንን አምዶችም የሚያዩት ልክ እንደ ሩቢ ባሕሪወች እና ወዘተረፈ ነው።
Teteqami
) ክፍል ውርሻ በቢጫ ቀለም ተሰምሮ። app/models/teteqami.rb
class Teteqami < ApplicationRecord
.
.
.
end
Achrtshuf
) ክፍል ውርሻ በቢጫ ቀለም ተሰምሮ። app/models/achrtshuf.rb
class Achrtshuf < ApplicationRecord
.
.
.
end
የመቆጣጠሪያወች የውርስ መዋቅር በመሰረቱ ከቅርጸቶች የውርስ መዋቅር ጋር ተመሳሳይ ነው። ዝርዝር 2.22 ‘ን እና ዝርዝር 2.23 ‘ን ስናነጻጽር የተጠቃሚዎች መቆጣጠሪያውም የአጪርጽሑፎች መቆጣጠሪያውም ሁለቱም የሚወርሱት ከአፕልኬሽን መቆጣጠሪያው እንደሆነ እንመለከታለን። ዝርዝር 2.24 ‘ን ስንመረምር የ‘አፕልኬሽንመቆጣጠሪያ‘ው (ApplicationController
) እራሱ ከ‘ተግባርመቆጣጠሪያ::መሰረት (ActionController::Base
) እንደሚወርስ እንመለከታለን፤ ይህም በሬይልስ አክሽን ፓክ በተባለው ቤተኮድ የቀረበ የመቆጣጠሪያወች መሰረት ክፍል ነው። በእነዚህ ክፍሎች መካከል ያለው ግንኙነት በምስል 2.21 ላይ በሰእላዊ መግለጫ ቀርቧል።
TeteqamisController
) ክፍል ውርሻ በቢጫ ቀለም ተሰምሮ። app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
.
.
.
end
AchrtshufsController
) ክፍል ውርሻ በቢጫ ቀለም ተሰምሮ። app/controllers/achrtshufs_controller.rb
class AchrtshufsController < ApplicationController
.
.
.
end
ApplicationController
) ክፍል ውርሻ በቢጫ ቀለም ተሰምሮ። app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
.
.
.
end
እንደ ቅርጸት ውርስ ሁሉ፣ ሁለቱም የተጠቃሚዎች እና የአጪርጽሑፎች መቆጣጠሪያወች ከመሰረታዊ ክፍሉ እጅግ በጣም ብዙ ተግባራትን ስለወረሱ (በዚህ ረገድ ከ‘ተግባርመቆጣጠሪያ::መሰረት (ActionController::Base
)) የቅርጸት ቁሶችን ለማንቀሳቀስ፣ ወደመጡበት የሚመለሱ የሃ.ጽ.ማ.ስ መጠይቆችን የማጣራት እና ትይታወችን ወደ ሃ.ጽ.መ.ቋ መቀየር የሚያስችል ብቃቶችን ይወርሳሉ። ሁሉም የሬይልስ መቆጣጠሪያወች ከ‘አፕልኬሽንመቆጣጠሪያ‘ው (ApplicationController
) ስለሚወርሱ፣ በአፕልኬሽን መቆጣጠሪያ ላይ የተበየኑ ደንቦች በሙሉ፣ በአፕልኬሽኑ ውስጥ ላሉ ማለት ለእያንዳንዱ ተግባር ደንቡ በራስሰር ይጸድቅላቸዋል። ለዚህ የሚሆን ምሳሌ፣ በክፍል 9.1 ላይ በማሳያ አፕልኬሽኑ መቆጣጠሪያወች ሁሉ፣ ለመግባት እና ለመውጣት የሚያገለግሉ የረጅ ዘዴወችን እንዴት ማካተት እንደምንችል እንመለከታለን።
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
ApplicationController
) ከ‘ተግባርመቆጣጠሪያ::መሰረት (ActionController::Base
) እንዲወርስ የሚያደርገውን አንድ መስመር ኮድ ፈልጋችሁ አግኙ፡፡
ApplicationRecord
ከ‘ንቁመዝገብ።መሰረት (ActiveRecord::Base
) እንዲወርስ የሚያደርግ፣ አንድ መስመር ኮድን የያዘ አንድ ተመሳሳይ ፋይል አለን? ጠቃሚ ምክር:- ምናልባት በ‘አፕ/ቅርጸቶች (app/models
) ማውጫ ውስጥ፣ አፕልኬሽን_መዝገብ.አርቢ (application_record.rb
) ተብሎ የሚጠራው ፋይል ውስጥ ሊገኝ ይችል ይሆናል።
የአጪርጽሑፎች ሃብትን ከማጠናቀቅ በኋላ፣ አሁን ማከማቻውን ወደ ጊትሃብ ለመግፋት ጥሩ ጊዜ ነው:-
$ 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 ላይ እንደሚታየው፣ በዚህን ጊዜ ሃረኩ ላይ ገጹን መጎብኘት አንድ የስህተት መልእክትን ያስገኛል፡፡
የሃረኩ ዘገባ ፋይልን በመመርመር፣ ችግሩን ማመላከት እንችላለን:-
$ 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 ውስጥ ያሉትን መልመጃዎች ሰርታችሁ ከሆነ፣ ማለት የመጀመሪያው ተጠቃሚ አጪርጽሑፍን ለማሳየት የተጠቀማችሁበትን ኮድ ማስወገድ ይኖርባችኋል፡፡ ጉዳዩ እንዲህ ከሆነ፣ የማያስፈልገውን ኮድ ሰርዙ፣ ከዚያ አቀላቅሉ እና በድጋሚ ወደ ሃረኩ ግፉ፡፡
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
የአንድ የሬይልስ አፕልኬሽንን አጠቃላይ እይታን አሁን ጨርሰናል። በዚህ ምዕራፍ ውስጥ የበለጸገው የጨዋታ አፕልኬሽን ብዙ ጠንካራ እና በአንጻሩ ደግሞ ይሄ ነው የማይባል ደካማ ጎኖች አሉት።
ጥንካሬዎቹ
ድክመቶቹ
የዚህ ስልጠና ቀሪው ክፍል፣ ጠንካራ ጎኖችን በማደለብ እና ድክመቶችን ደግሞ በማስወገድ ላይ የተመደበ ይሆናል፡፡
string
) የውሂብ ዓይነት የነሱን ብዛት በደንብ ሊይዝ ይችላል፤ ነገር ግን ጽሑፍ (text
) የተባለውን የውሂብ ዓይነት መጠቀሙ፣ አላማችንን በተሻለ መልኩ ይገልጸዋል። በሌላ በኩልም ከጊዜ በኋላ የሆሄያት ብዛትን መጨመር ብንፈልግ፣ እንደፈለግን የመጨመር እድሉን ይሰጠናል። በእርግጥም ትዊተር ከጊዜ በኋላ ከ 140 ሆሄወች ወደ 280 ሆሄወች የመቀየሩ ሁኔታ፣ የዚህ ዓይነቱ አሰራር ምሳሌ ይሆናል፡፡ በውሂበጎታ ውስጥ የ‘ሃረግ (string
) የውሂብ ዓይነት 255 (\( 2^8-1 \)) ሆሄወችን ይይዛል። ይህም 140 ሆሄ ላለው አጪርጽሑፍ በቂ ሲሆን፤ 280 ሆሄ ላለው አጪርጽሑፍ ግን በቂ አይደለም። የ‘ጽሑፍ (text
) የውሂብ ዓይነትን መጠቀሙ፣ ሁለቱንም ጉዳዮች በአንድነት ለማስተናገድ ያስችላል፡፡Teteqami
) ከመባል ይልቅ የብዙ መጠርያ ስምን በመጠቀም ተጠቃሚዎች (Teteqamis
) የሚለውን የአጻጻፍ ስልት ይጠቀማሉ።generate Achrtshuf
) የሚለውን ትእዛዝ እንጠቀማለን።>>
የሚል ግባትን ይጠቀማል። የናንተ የሰሌዳ ግባት ግን 2.7.4 :001 >
ሊል ይችል ይሆናል።