ምዕራፍ 7 ምዝገባ

አሁን አንድ የሚሰራ የተጠቃሚ ቅርጸት ስላለን፣ በድረጣቢያው ላይ ተጠቃሚዎች እንዲመዘገቡ የሚያስችል አንድ ችሎታን የማከሉ ጊዜው አሁን ነው። የተጠቃሚ ምዝገባ መረጃን ወደ አፕልኬሽናችን ለማስረከብ አንድ የሃ.ጽ.መ.ቋ ቅጽን እንጠቀማለን (ክፍል 7.2)፤ ከዛ እሱም አንድ አዲስ ተጠቃሚን ለመፍጠር እና ባሕሪወቹን በውሂበጎታው ውስጥ ለማስቀመጥ የሚጠቅም ይሆናል(ክፍል 7.4)። በምዝገባው ሂደት ማብቂያ ላይ፣ አዲስ የተፈጠረውን የተጠቃሚ መረጃ ከአንድ የመገለጫ ገጽ ጋር ማቅረቡ አስፈላጊ ይሆናል፤ ስለሆነም ተጠቃሚዎችን ለማሳየት አንድ ገጽ በመፍጠር እንጀምራለን፤ ይህም የተጠቃሚዎች የው.ሁ.ማ መዋቅር ትግበራን ለማጠናቀቅ ለሚደረገው ግስገሳ ልክ እንደ አንድ የመጀመሪያ ሂደት ሆኖ ያገለግላል (ክፍል 2.2.2)። በሂደቱ ላይ፣ እጥር ምጥን ያሉ እና መረጃወችን የሚሰጡ የውህደት ፈተናዎችን ለመጻፍ፣ በክፍል 5.3.4 ላይ በሰራነው የውህደት ፈተና ላይ እንቀጥላለን።

በዚህ ምዕራፍ ውስጥ፣ ብቁ የኤመልእክት አድራሻዎች ያላቸው የአዲስ ተጠቃሚዎች እድልን ለመጨመር በምዕራፍ 6 የተጠቃሚ ቅርጸት ማስረገጫዎች ጫንቃ ላይ እንወድቃለን፡፡ በምዕራፍ 11 ላይ በተጠቃሚ ምዝገባ ላይ አንድ የተለየ የመለያ ማግበሪያ ዝግጅትን በማከል የኤመልእክት ብቃትን እናረጋግጣለን፡፡

ምንም እንኳን ይህ ስልጠና በባለሙያ ደረጃ ላይ እያለ፣ በተቻለ መጠን ቀላል እንዲሆን የተቀየሰ ቢሆንም፣ ድርን ማበልጸግ ግን አንድ የተወሳሰበ ርዕሰ ጉዳይ ነው፤ እናም ምዕራፍ 7 አስቸጋሪነቱን በጉልህ ያሳያል፡፡ ስለዚህ ይህንን ምዕራፍ ከመቼውም በበለጠ፣ ጊዜ ሰጥታችሁ በጥንቃቄ እንድታነቡት እና እንድትረዱት በጥብቅ እመክራችኋለሁ፤ እናም አስፈላጊ ከሆነም ከልሱት። (አንዳንድ አንባቢያን እያንዳንዱን ምዕራፍ ሁለት ጊዜ ማንበቡ በጣም እንደጠቀማቸው አስታውቀዋል)። በዚህ ስልጠና ሆነ ከዚህ ስልጠና በፊት ከሚወሰዱ ቅድመ ስልጠና ዝግጅቶች (በተለይም በሩቢ ላይ መሰረታዊ እውቀትን ለማግኘት የሚያስፈልገውን ተማር) ላይ ተጨማሪ ድጋፍ ለማግኘት በበቂ ተማር ውስጥ ላሉት ስልጠናዎች መመዝገብን ታስቡበት ይሆናል፡፡

7.1 ተጠቃሚዎችን ማሳየት

በዚህ ክፍል ውስጥ በምስል 7.11 ስእላዊ መግለጫ ላይ እንደሚታየው፣ የአንድ ተጠቃሚ ስምን እና ምስልን ለማሳየት አንድ የተጠቃሚ መገለጫ ገጽን ለመስራት የሚያበቃንን የመጀመሪያ እርምጃ በመራመድ እንጀምራለን። ለተጠቃሚው የመገለጫ ገጾች የመጨረሻ ግባችን፣ በምስል 7.22 ላይ የሚታየውን ስእላዊ መግለጫ ተግባራዊ ለማድረግ የተጠቃሚውን የመገለጫ ስእል፣ መሰረታዊ ውሂብ እና የአጪርጽሑፎች ዝርዝርን ማሳየት ይሆናል፡፡ (ምስል 7.2 የሎረም ኢፕሰም ጽሑፍ ምሳሌን ያካትታል፤ አንድ መነበብ የሚገባው አስገራሚ ታሪክን ያዘለ ስለሆነ ከቻላችሁ ብታነቡት መልካም ነው።) ይህንን ስራ እና የማሳያ አፕልኬሽኑን በምዕራፍ 14 ላይ እንፈጽማለን፡፡

የስሪት ቁጥጥርን እየተጠቀማችሁ ከሆነ፣ እንደተለመደው አንድ የርእስ ቅርንጫፍን አድርጉ፡-

$ git checkout -b ምዝገባ
images/figures/profile_mockup_profile_name_bootstrap
ምስል 7.1: በዚህ ክፍል ውስጥ የሚሰራ የአንድ ተጠቃሚ መገለጫ ስእላዊ መግለጫ፡፡
images/figures/profile_mockup_bootstrap
ምስል 7.2: በመጨረሻ ላይ ይሆናል ተብሎ የተገመተው የአንድ መገለጫ ገጽ ስእላዊ መግለጫ።

7.1.1 ማረም እና የሬይልስ አካባቢ

በዚህ ክፍል ውስጥ ያሉ የመገለጫ ገጾች በአፕልኬሽናችን ውስጥ የመጀመሪያዎቹ እውነተኛ ተለዋዋጪ ገጾች ይሆናሉ፡፡ ምንም እንኳን ትይታው ልክ እንደ አንድ ገጽ ኮድ ሆኖ ቢኖርም፣ እያንዳንዱ የመገለጫ ገጽ ግን ከአፕልኬሽኑ ውሂበጎታ ተፈልጎ የወጣ መረጃን በመጠቀም ይበጃል። በማሳያ አፕልኬሽናችን ላይ ተለዋዋጪ ገጾችን በማከል ዝግጅት ላይ፣ በጣቢያችን ገጽታ (ዝርዝር 7.1) ላይ አንዳንድ የማረም ዘዴ መረጃን ለማከል አሁን አንድ ጥሩ አጋጣሚ ነው። ይህ አብሮገነቡን የ‘አርም (debug) ዘዴን እና የ‘ሰሚአሴቶች (params) ተለዋዋጪን (በክፍል 7.1.2 ላይ የበለጠ የምንማረውን) በመጠቀም ስለ እያንዳንዱ ገጽ አንዳንድ ጠቃሚ መረጃዎችን ያሳያል።

ዝርዝር 7.1: አንዳንድ የማረም መረጃን በጣቢያው ገጽታ ላይ ማከል። app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  .
  .
  .
  <body>
    <%= render 'layouts/rasgie' %>
    <div class="container">
      <%= yield %>
      <%= render 'layouts/grgie' %>
      <%= debug(params) if Rails.env.development? %>
    </div>
  </body>
</html>

አንድ የተሰማራ አፕልኬሽን ውስጥ የእርም መረጃውን ለተጠቃሚወች ማሳየት ስለማንፈልግ፣ ዝርዝር 7.1 የእርም መረጃውን በማበልጸጊያ አካባቢ ብቻ ለመገደርብ:-

if Rails.env.development?

’ን ይጠቀማል። ይህም በሬይልስ ውስጥ በነባሪነት ከተበየኑት ሶስቱ አካባቢወች ውስጥ አንዱ ነው (ሳጥን 7.1)፡፡3 በተለይ፣ የ‘ሬይልስ.አካባቢ.ብልጸጋነውን? (Rails.env.development?) እውነት (true) የሚሆነው በአንድ የማበልጸጊያ አካባቢ ውስጥ ብቻ ነው፡፡ ስለዚህም ይህ ክት ሩቢ

<%= debug(params) if Rails.env.development? %>

በምርትም ሆነ በፈተና አፕልኬሽኖች ውስጥ አይገባም፡፡ (የእርም መረጃን በፈተናወች ውስጥ ማስገባቱ ምንም ዓይነት ጉዳት አያደርስም፣ ምንም ጥሩ ነገርም አይሰራም፤ ስለሆነም የእርም መረጃ እይታን ለማበልጸጊያ ብቻ መወሰኑ በጣም ጥሩ ይሆናል፡፡)

ሳጥን 7.1. የሬይልስ አካባቢዎች

ሬይልስ ሶስት አካባቢዎችን ታጥቆ ይመጣል፤ እነሱም የ‘ፈተና (test) የማበልጸጊያ (development) እና የ‘ምርት (production) አካባቢዎች ናቸው። ለሬይልስ ሰሌዳ ነባሪው አካባቢ የ‘ማበልጸጊያ (development) አካባቢው ነው:-

  $ rails console
  Loading development environment
  >> Rails.env
  => "development"
  >> Rails.env.development?
  => true
  >> Rails.env.test?
  => false

እዚህ ላይ መመልከት እንደምትችሉት፣ ሬይልስ አንድ የሬይልስ (Rails) ቁስን፣ ከአንድ የ‘አካባቢ (env) ባሕሪ ጋር እና ተዛማጅ የአካባቢ ቡሊያን ዘዴን ይሰጣል፤ ስለሆነም ለምሳሌ የ‘ሬይልስ.አካባቢ.ፈተናነውን? (Rails.env.test?) በአንድ የፈተና አካባቢ ውስጥ እውነት‘ን (true) ሲመልስ ካልሆነ ግን ውሸት‘ን (false) ይመልሳል።

በአንድ ሰሌዳ ውስጥ አንድ የተለየ አካባቢን ለማካሄድ ከፈላጋችሁ (ለምሳሌ የሆነ ፈተናን ለማረም)፣ የአካባቢ ተለዋዋጩን ልክ እንደ አንድ ሰሚአሴት ወደ ሰሌዳ ትእዛዙ ማሳለፍ ትችላላችሁ:-

  $ rails console test
  Loading test environment
  >> Rails.env
  => "test"
  >> Rails.env.test?
  => true

የሬይልስ አገልጋይ ነባሪው አካባቢ የ‘ማበልጸጊያ (development) አካባቢው ቢሆንም፣ ሰሌዳውን ግን የተለያየ አካባቢን ልታስኬዱበት ትችላላችሁ:-

  $ rails server --environment production

በምርት ውስጥ እየሄደ ያለውን አፕልኬሽናችሁን ከተመለከታችሁ፣ ያለ አንድ የምርት ውሂበጎታ አይሰራም፣ ይህንንም ሬይልስ ውጎ:አፍልስ‘ን (rails db:migrate) በማስኬድ ውሂበጎታውን መፍጠር እንችላለን፡-

  $ rails db:migrate RAILS_ENV=production

በነገራችን ላይ፣ ማሳያ አፕልኬሽናችሁን ሃረኩ ላይ አሰማርታችሁ ከሆነ፣ ሃረኩ ሬይልስ ሰሌዳን አስኪድ‘ን (heroku run rails console) በመጠቀም አካባቢውን መቃኘት ትችላላችሁ፡-

  $ heroku run rails console
  >> Rails.env
  => "production"
  >> Rails.env.production?
  => true

በተፈጥሮ፣ ሃረኩ አንድ የምርት ጣቢያዎች ስርዓተ-መሳርያ እንደመሆኑ መጠን፣ እያንዳንዱን አፕልኬሽን በአንድ የምርት ማበልጸጊያ ውስጥ ያስኬዳል፡፡

ዝርዝር 7.2 ውስጥ እንደሚታየው፣ የአርም መረጃ ውጤቱ ጥሩ ገጽታ እንዲኖረው ለማድረግ በምዕራፍ 5 ውስጥ በተፈጠረው ብጁ ቅጠሉህ ላይ አንዳንድ ደንቦችን እናክላለን።

ዝርዝር 7.2: የማረም ማስረጃ እይታ ሳጥንን የሚያሳምር ኮድ ማከል፣ አንድ የአ.ቆ.ሉ.ቅ ውስጠድብልቅን ጨምሮ። app/assets/stylesheets/bju.scss
@import "bootstrap-sprockets";
@import "bootstrap";

/* ውስጠድብልቅ፣ ተለዋዋጮች፣ ወዘተ... */

$gray-medium-light: #eaeaea;

@mixin መጠነ_ሳጥን {
  -moz-box-sizing:    border-box;
  -webkit-box-sizing: border-box;
  box-sizing:         border-box;
}
.
.
.
/* ድብልቅ */

.debug_dump {
  clear: both;
  float: left;
  width: 100%;
  margin-top: 45px;
  @include መጠነ_ሳጥን;
}

ይህ የአ.ቆ.ሉ.ቅ ውስጠድብልቅ (Sass Mixin) መገልገያን ያስተዋውቃል፣ በዚህ ሁኔታ ላይ ደግሞ መጠነ_ሳጥን ይባላል፡፡ ውስጠድብልቅ አንድ ላይ የተሰባሰቡ የቅ.ቋ ደንቦችን እንዲታሸጉ እና ለብዙ ሃ.ጽ.መ.ቋ አባላቶች ጥቅም ላይ እንዲውሉ ይህንን ኮድ:-

.debug_dump {
  .
  .
  .
  @include መጠነ_ሳጥን;
}

ወደዚህ ኮድ ይለውጣሉ:-

.debug_dump {
  .
  .
  .
  -moz-box-sizing:    border-box;
  -webkit-box-sizing: border-box;
  box-sizing:         border-box;
}

ይህንን ውስጠድብልቅ በክፍል 7.2.1 ውስጥ በድጋሜ ጥቅም ላይ እናውለዋለን፡፡ የአርም ሳጥኑን በተመለከተ የመጨረሻ ውጤቱ በምስል 7.34 ውስጥ ይታያል።

images/figures/home_page_with_debug
ምስል 7.3: የማሳያ አፕልኬሽኑ የመነሻ ገጽ ከአርም መረጃ ጋር።

ምስል 7.3 ላይ ያለው የአርም ውጽዓት ስለሚቀርበው ገጽ ጠቃሚ መረጃን ይሰጣል:-

---
controller: quami_getss
action: menesha

ይህ አንድ የያ.መ.ቋ.አ (YAML)5 ሰሚአሴቶች (params) አቀራረብ ሲሆን፣ እሱም በመሰረቱ አንድ ተርታ ነው፣ እናም በአሁኑ ሁኔታ የገጹን መቆጣጠሪያ እና ተግባሩን ይለያል፡፡ በክፍል 7.1.2 ላይ ሌላ ምሳሌን አንመለከታለን፡፡

መልመጃዎች

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

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

  1. በአሳሻችሁ ላይ የ/ስለኛ (/silegna) አድራሻን ጎብኙ እና የማረሚያውን መረጃ በመጠቀም የ‘ሰሚአሴቶች (params) ተርታውን መቆጣጠሪያ እና ተግባሩን ለማወቅ ሞክሩ።
  2. በሬይልስ ሰሌዳ ላይ፣ የመጀመሪያውን ተጠቃሚ ከውሂበጎታው ካወጣችሁ በኋላ፣ ዋጋውን ከተጠቃሚ (ተጠቃሚ) ተለዋዋጪ ጋር መድቡ። ከዚያ የ‘ puts ተጠቃሚ.attributes.to_yaml ዘዴን በሰሌዳው ላይ አካሂዱ። ያገኛችሁት ውጽዓት ምንድን ነው? እንደገና የ y ዘዴን ለመጠቀም፣ y ተጠቃሚ.attributes ዘዴን በሰሌዳው አስኪዱ እና ውጤቱን ከ puts ተጠቃሚ.attributes.to_yaml ውጤት ጋር አነጻጽሩ፡፡

7.1.2 የተጠቃሚዎች ሃብት

አንድ የተጠቃሚ የመገለጫ ገጽን ለመስራት፣ አንድ ተጠቃሚ በውሂበጎታው ውስጥ መኖር አለበት፣ ይህም መጀመሪያ የተፈጠረው ዶሮ ነው? ወይስ እንቁላል? ከተባለው ዓይነት ችግር ጋር ያስተዋውቀናል፤ አንድ የሚሰራ የመመዝገቢያ ገጽ ከመኖሩ በፊት፣ ጣቢያው እንዴት አንድ ተጠቃሚ ሊኖረው ይችላል? ደስ የሚለው ነገር ግን፣ ይህ ችግር አስቀድሞ ተፈቷል፤ በክፍል 6.3.4 ውስጥ የሬይልስ ሰሌዳን በመጠቀም አንድ የተጠቃሚ መዝገብን በውሂበጎታው ውስጥ አስፍረናል፤ ስለሆነም በውሂበጎታው ውስጥ አንድ ተጠቃሚ መኖር አለበት፡-

$ rails console
>> Teteqami.count
=> 1
>> Teteqami.first
=> #<Teteqami id: 1, sim: "Michael Hartl", emelekt: "michael@misalei.com",
created_at: "2019-08-22 03:15:38", updated_at: "2019-08-22 03:15:38",
password_digest: [FILTERED]>

(በአሁኑ ወቅት በውሂበጎችሁ ውስጥ አንድ ተጠቃሚ ከለላችሁ፣ ከመቀጠላችሁ በፊት ይህንን ክፍል 6.3.4 ‘ን በመጎብኘት የሚገባችሁን ማሟላት አለባችሁ፡፡) ከሰሌዳው ውጻዓት ላይ የተጠቃሚው መታወቂያ 1 መሆኑን እናያለን እና አሁን አላማችን የዚህን ተጠቃሚ መረጃ ለማሳየት አንድ ገጽን መስራት ይሆናል። በሬይልስ አፕሊኬሽኖች ውስጥ የተወደደውን የው.ሁ.ማ መዋቅር ደንቦችን እንከተላለን (ሳጥን 2.2)፣ ይህ ማለትም ውሂብን ሊፈጠር፣ ሊታይ፣ ሊዘመን ወይም ሊጠፋ እንደሚችል ሃብቶች (Resources) አድርጎ መወከል ማለት ነው፤ እነዚህ ዘዴዎች ደግሞ ከአራቱ መሰረታዊ የሃ.ጽ.ማ.ስ ተግባራት ማለት አሳይ፣ (POST) ዓግኝ (GET) ዓዘምን (PATCH) እና ሠርዝ (DELETE) ጋር ይዛመዳሉ (ሳጥን 3.2)።

የው.ሁ.ማ መርሆዎችን በምትከተሉበት ጊዜ፣ ሃብቶች በተለምዶ የሃብቱን ስም እና አንድ ልዩ ጠቋሚን በመጠቀም ይጣቅሳሉ። በተጠቃሚዎች (አሁን እኛ እንደ አንድ የተጠቃሚዎች ሃብት (resources) በማሰብ ላይ ያለነው) አውድ ውስጥ ይህ ማለት፣ ለ/ተጠቃሚዎች/1 (/teteqamis/1) ዓ.አ.ሃ.አ አንድ የ‘ዓግኝ (GET) መጠይቅን በመስጠት መታወቂያው 1 የሆነውን ተጠቃሚ ማየት አለብን ማለት ነው፡፡ እዚህ ላይ የ‘አሳይ (show) ተግባሩ በመጠየቅ አይነቱ ላይ ግልጽ ነው፤ የሬይልስ ው.ሁ.ማ ገጸባህሪያት በተግባር ላይ በሚውሉበት ጊዜ፣ የዓግኝ (GET) መጠይቆች በራስሰር በ‘አሳይ (show) ተግባር ይስተናገዳሉ፡፡

ክፍል 2.2.1 ውስጥ፣ መታወቂያው 1 ለሆነ አንድ ተጠቃሚ ገጹ /ተጠቃሚዎች/1 (/teteqamis/1) የተባለ ዓ.አ.ሃ.አ እንዳለው አይተናል፡፡ አለመታደል ሆኖ ግን፣ አሁን ያንን ዓ.አ.ሃ.አ መጎብኘቱ አንድ ስህተትን ይሰጣል (ምስል 7.4)፡፡

images/figures/users_1_error
ምስል 7.4: /ተጠቃሚዎች/1 (/teteqamis/1) አሁን ባለበት ሁኔታ ላይ፡፡

በማዘዋወርያ ፋይሎች (አዋቅር/ማዘዋወርያወች/አርቢ (config/routes.rb)) ውስጥ አንድ ነጠላ መስመር ኮድን በማከል የ/ተጠቃሚዎች/1 (/teteqamis/1) ማዘዋወሪያን እንዲሰራ ማድረግ እንችላለን:-

resources :teteqamis

ውጤቱ በዝርዝር 7.3 ላይ ይታያል፡፡

ዝርዝር 7.3: በማዘዋወሪያወች ፋይል ውስጥ አንድ የተጠቃሚ ሃብቶችን ማከል። config/routes.rb
Rails.application.routes.draw do
  root 'quami_getss#menesha'
  get  '/erdata',     to: 'quami_getss#erdata'
  get  '/silegna',    to: 'quami_getss#silegna'
  get  '/agignun',    to: 'quami_getss#agignun'
  get  '/temezgeb',   to: 'teteqamis#new'
  resources :teteqamis
end

ምንም እንኳን አሁን የእኛ ፍላጎት ተጠቃሚዎችን ለማሳየት አንድ ገጽን መስራት ቢሆንም፣ ይህ ነጠላ መስመር ማለት የተጠቃሚዎች ሃብቶች (resources :teteqamis) ግን አንድ የሚሰራ /ተጠቃሚዎች/1 (/teteqamis/1) ዓ.አ.ሃ.አን ብቻ አያክልም፤ የማሳያ አፕልኬሽናችንን እንዲሁም፣ የተጠቃሚ ዓ.አ.ሃ.አወችን ለማመንጨት ከበርካታ ስዩም ማዘዋወርያወች (ክፍል 5.3.3) ጎንለጎን ለአንድ ሙሉየው.ሁ.ማ የተጠቃሚዎች ሀብቶች6 ከሚያስፈልጉ ሁሉም ተግባሮች ጋር ያስታጥቃል። በውጤቱ የተገኙት ተዛማጅ ተግባሮች፣ ስዩም ማዘዋወርያወች እና ዓ.አ.ሃ.አዎች በሙሉ በሰንጠረዥ 7.1 ላይ ይታያሉ፡፡ (ሰንጠረዥ 7.1 ‘ን ከሰንጠረዥ 2.2 ጋር አነጻጽሩት) በሚቀጥሉት ሶስት ምዕራፎች ላይ፣ ተጠቃሚዎችን አንድ ሙሉየው.ሁ.ማ ሃብት ለማድረግ አስፈላጊ የሆኑትን ተግባራት ሁሉ በማከናወን ሂደት ላይ በሰንጠረዥ 7.1 ውስጥ ያሉትን ሁሉ እንሸፍናልን፡፡

የሃ.ጽ.ማ.ስ መጠይቅ ዓ.አ.ሃ.አ ተግባር ስዩም ማዘዋወርያ ጥቅም
GET /teteqamis index teteqamis_path ሁሉንም ተጠቃሚወች መዘርዘሪያ ገጽ
GET /teteqamis/1 show teteqami_path(teteqami) ተጠቃሚ ማሳያ ገጽ
GET /teteqamis/new new new_teteqami_path አንድ አዲስ ተጠቃሚ መስሪያ ገጽ (temezgeb)
POST /teteqamis create teteqamis_path አንድ አዲስ ተጠቃሚ መፍጠር
GET /teteqamis/1/edit edit edit_teteqami_path(user) መታወቂያው 1 የሆነውን ተጠቃሚ የማረሚያ ገጽ
PATCH /teteqamis/1 update teteqami_path(teteqami) ተጠቃሚን ማዘመን
DELETE /teteqamis/1 destroy teteqami_path(teteqami) ተጠቃሚን መሰረዝ
ሰንጠረዥ 7.1: ዝርዝር 7.3 ውስጥ በተጠቃሚዎች ሀብቶች የተሰጡ ሙሉየው.ሁ.ማ ማዘዋወርያወች፡፡

ዝርዝር 7.3 ውስጥ ካለው ኮድ ጋር ማዘዋወርያው ይሰራል፣ እዚያ ላይ ግን እስካሁን ድረስ ምንም ገጽ የለም (ምስል 7.5)፡፡ ይህንን ለማስተካከል፣ በክፍል 7.1.4 ላይ በምናስፋፋው፣ በአንድ መሰረታዊ የመገለጫ ገጽ እንጀምራለን።

images/figures/user_show_unknown_action
ምስል 7.5: የ/ተጠቃሚዎች/1 (/teteqamis/1) ዓ.አ.ሃ.አ ከማዘዋወርያው ጋር፣ ነገር ግን ገጽ የለውም።

አንድ ተጠቃሚን ለማሳየት፣ በሬይልስ አሰራር ዘንድ እንደ ደንብ ሁኖ የሚያገለግለውን የፋይል ማስቀመጫ ቦታን እንጠቀማለን፤ ይህም app/views/teteqamis/show.html.erb ነው። በዝርዝር 5.38 ውስጥ ማመንጫውን ተጠቅመን እንደፈጠርነው የ‘አዲስ.ሃጽመቋ.ክሩ (new.html.erb) ትይታ፣ የ‘አሳይ.ሃጽመቋ.ክሩ (show.html.erb) ትይታ አልተፈጠረም፤ ስለሆነም ፋይሉን እራሳችሁ በእጃችሁ ፈጥራችሁ7 ከዚያ ይዘቱን ዝርዝር 5.38 ላይ በሚታየው ኮድ መሙላት ይኖርባችኋል።

ዝርዝር 7.4: የተጠቃሚ መረጃን ለማሳየት የሚውል አንድ ቁራጪ ትይታ app/views/teteqamis/show.html.erb
<%= @teteqami.sim %>, <%= @teteqami.emelekt %>

አንድ @ተጠቃሚ (@teteqami) ተብሎ የሚጠራ ቅርፀ ተለዋዋጪ መኖርን ከግምት ውስጥ በማስገባት፣ ትይታው የተጠቃሚውን ስም እና የኤመልእክት አድራሻውን ለማሳየት ክት ሩቢን ይጠቀማል፡፡ በርግጥ የተጠቃሚ ማሳያ ገጹ፣ በመጨረሻ ላይ አሁን ካለበት ሁኔታ በጣም የተለየ ገጽታ ይኖረዋል (እናም የኤመልእክት አድራሻውን በይፋ ለማንም/ለህዝብ አያሳይም)።

የተጠቃሚ ትይታ ማሳያው እንዲሰራ ለማድረግ፣ በተጠቃሚዎች መቆጣጠሪያ ውስጥ ባለው ተዛማጅ የአሳይ (show) ተግባር ውስጥ አንድ የ@ተጠቃሚ (@teteqami) ተለዋዋጪን መበየን አለብን። ያው እናንተ እንደምትገምቱት በዝርዝር 7.5 ላይ እንደሚታየው፣ ተጠቃሚውን ከውሂበጎታው ፈልጎ ለማግኘት በተጠቃሚ ቅርጸቱ (ክፍል6.1.4) ላይ የ‘ፈልግ (find) ዘዴን እንጠቀማለን፡፡

ዝርዝር 7.5: የተጠቃሚዎች መቆጣጠሪያ ከአንድ የአሳይ (show) ተግባር ጋር። app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController

  def show
    @teteqami = Teteqami.find(params[:id])
  end

  def new
  end
end

እዚህ ጋር የተጠቃሚውን መታወቂያ ከውሂበጎታው ፈልጎ ለማግኘት ሰሚአሴቶች‘ን (params) ተጠቅመናል። ለተጠቃሚዎች መቆጣጠሪያ ተገቢውን መጠይቅ በምናቀርብበት ጊዜ፣ የ‘ሰሚአሴቶች[:መታወቂያ]‘ው (params[:id]) የተጠቃሚው መታወቂያ 1 ይሆናል። ስለዚህ ውጤቱ በክፍል 6.1.4 ላይ መታወቂያው 1 የሆነውን ተጠቃሚ ከውሂበጎታው ለማግኘት የተጠበምንበትን የ‘ፈልግ (find) ዘዴ ምሳሌ ማለት ከ‘ተጠቃሚ.ፈልግ(1) (Teteqami.find(1)) ጋር ተመሳሳይ ነው ማለት ነው፡፡ (እዚህ ላይ በመሰረቱ የ‘ሰሚአሴቶች[:መታወቂያ] (params[:id]) ዋጋ "1" ሃረግ ነው፤ ነገር ግን ፈልግ (find) ይህንን ወደ አንድ ሙሉ ቁጥር የመቀየር ብልሃት አለው።)

የተጠቃሚ ትይታ እና ተግባር ከተበየነ በኋላ፣ በምስል 7.6 ላይ እንደሚታየው የ/ተጠቃሚዎች/1 (/teteqamis/1) ዓ.አ.ሃ.አው በትክክል ይሰራል፡፡ (የቢክሪፕት እንቁን ካከላችሁ በኋላ የሬይልስ አገልጋይን እንደገና ካላስጀመራችሁ፣ በዚህ ወቅት እንደዚያ ማድረግ ሊኖርባችሁ ይችላል፡፡ ይህ ዓይነቱ ነገር “ባለሙያው በማንም ላይ ጥገኛ ሳይሆን ራሱን ችሎ ችግርን የመፍታት አቅም ሊኖረው ይገባዋል” ለሚለው አባባል አንድ ጥሩ ምሳሌ ይሆናል (ሳጥን 1.2)፡፡) በምስል 7.6 ውስጥ ያለው የአርም መረጃ የ‘ሰሚአሴቶች[:መታወቂያ] (params[:id]) ዋጋን የሚያረጋግጥ መሆኑን ልብ በሉ:-

---
action: show
controller: teteqamis
id: '1'

ለዚህ ነው በዝርዝር 7.5 ውስጥ ያለው የ

Teteqami.find(params[:id])

ኮድ መታወቂያው 1 የሆነውን ተጠቃሚ ፈልጎ የሚያገኘው፡፡

images/figures/user_show
ምስል 7.6: የተጠቃሚ ማሳያው ገጽ አንድ የተጠቃሚዎች ሃብት ከታከለበት በኋላ።

መልመጃዎች

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

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

  1. ዝርዝር 7.4 ላይ ያለው የተጠቃሚ ማሳያ ገጹ ላይ፣ ክት ሩቢን በመጠቀም፣ የ‘ተፈጠረ_በ (created_at) እና “ያስማተኛውን” የ‘ተዘመነ_በ (updated_at) ባሕሪን አክሉ፡፡
  2. ክት ሩቢን በመጠቀም፣ ጊዜ.አሁን‘ን (Time.now) በተጠቃሚ ማሳያ ገጹ ላይ አክሉ፡፡ አሳሹን እንደገና በምታስጀምሩበት ጊዜ በሰዓቱ ላይ ምን ዓይነት ለውጥ አያችሁ?

7.1.3 አራሚ

ክፍል 7.1.2 ውስጥ በ‘አርም (debug) ውስጥ ያለው መረጃ በአፕልኬሽናችን ውስጥ ምን እየተከናወነ እንዳለ ለማወቅ እንዴት እንደሚረዳን ተመልክተናል፣ ነገር ግን ባይባግ የተባለ እንቁን በመጠቀም የማረም መረጃን በበለጠ በቀጥታ ለማግኘት የሚያገለግል አንድ መንገድም አለ (ዝርዝር 3.2)፡፡ ይህ እንዴት እንደሚሰራ ለመመልከት በዝርዝር 7.6 ላይ እንደሚታየው፣ አንድ አራሚ (debugger) የሚል መስመር የያዘ ኮድን በአፕልኬሽናችን ውስጥ ማከል ብቻ ይኖርብናል፡፡

ዝርዝር 7.6: የተጠቃሚዎች መቆጣጠሪያው ከአንድ አራሚ ጋር። app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController

  def show
    @teteqami = Teteqami.find(params[:id])
    debugger
  end

  def new
  end
end

አሁን /ተጠቃሚዎች/1 (/teteqamis/1) ዓ.አ.ሃ.አን በምንጎበኝበት ጊዜ የሬይልስ አገልጋይ አንድ የ (byebug) መቀበያን ያሳያል (ምስል 7.7)፡-

(byebug)
images/figures/byebug
ምስል 7.7: የባይባግ (byebug) መቀበያ በሬይልስ አገልጋይ ውስጥ።

የአፕልኬሽኑን ሁኔታ ለማወቅ የተለያዩ ትእዛዞችን በመስጠት፣ ባይባግን (byebug) ልክ እንደ አንድ የሬይልስ ሰሌዳ አድርገን ልናስተናግደው እንችላለን:-

(byebug) @teteqami.sim
"Michael Hartl"
(byebug) @teteqami.emelekt
"michael@misalie.com"
(byebug) params[:id]
"1"

መቀበያውን ለመልቀቅ እና አፕልኬሽኑ ስራውን እንዲቀጥል ለማድረግ “ተቆር-ዲን (Ctrl-D)” ተጫኑ እና ከዚያ የ‘አራሚ (debugger) ኮዱን ከ‘አሳይ (show) ተግባሩ ላይ አስወግዱ (ዝርዝር 7.7)።

ዝርዝር 7.7: የተጠቃሚዎች መቆጣጠሪያው ያለ አራሚ። app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController

  def show
    @teteqami = Teteqami.find(params[:id])
  end

  def new
  end
end

በአንድ የሬይልስ አፕልኬሽን ውስጥ በአንድ ነገር ላይ ግራ በምትጋቡበት ጊዜ ችግሩን ሊፈጥር ይችላል ብላችሁ በምታስቡት ኮድ አጠገብ አራሚ‘ን (debugger) ማድረጉ አንድ ጥሩ ልምድ ነው፡፡ ባይባግን በመጠቀም የስርዓቱን ሁኔታ መመርመሩ፣ የአፕልኬሽኑን ስህተቶች ለመከታተል እና በይነተገናኝ በሆነ መንገድ አፕልኬሽኑን ለማረም እጅግ የሚጠቅም ዘዴ ነው፡፡

መልመጃዎች

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

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

  1. ልክ በዝርዝር 7.6 ላይ እንደሚታየው፣ አራሚ‘ን (debugger) በአሳይ (show) ተግባር ውስጥ በማስቀመጥ በአሰሻችሁ ላይ የ/ተጠቃሚዎች/1 (/teteqamis/1) አድራሻን ጎብኙ። የ‘ሰሚአሴቶች (params) ተርታው የያ.መ.ቋ.አ ዋጋ ቅርጽን ያሳይ ዘንድ አስቀምጥ‘ን (puts) ተጠቀሙ። ያገኛችሁት ውጤት በጣቢያው ዝግጁገጽታ ላይ ካለው የ‘አርም (debug) ዘዴ መረጃ ጋር ሲነጻጸር ምን ይመልሳል? ጠቃሚ ምክር:- ተገቢውን ትእዛዝ ለማግኘት በክፍል 7.1.1.1 ውስጥ የተሰጠውን መልመጃ በደንብ ተመልከቱ፡፡
  2. አራሚ‘ን (debugger) በ‘አዲስ (new) ተግባር ውስጥ በማስቀመጥ በአሰሻችሁ ላይ የተጠቃሚዎች/አዲስ (/teteqamis/new) አድራሻን ጎብኙ። ከዚያ በአገልጋዩ ሰሌዳ ላይ የ‘@ተጠቃሚ (@teteqami) ተለዋዋጪ ዋጋን ለማግኘት ሞክሩ።

7.1.4 አንድ የአምሳያ ስእል እና አንድ የጎን-አሞሌ

ባለፈው ክፍል ውስጥ አንድ መሰረታዊ የተጠቃሚ ገጽን በይነናል፣ አሁን የመጀመሪያው የተጠቃሚ ገጽ የጎን-አሞሌ ላይ፣ የእያንዳንዱን ተጠቃሚ አንድ የመገለጫ8 ስእልን በማካተት ገጹን በመጠኑ እናስፋፋዋለን። በተጠቃሚው መገለጫ ገጽ ላይ አንድ “በዓለም አቀፍ ደረጃ የታወቀ አምሳያ” ወይም አምሳያን (Gravatar) በማከል እንጀምራለን። ግራቫታር ተጠቃሚዎች ምስሎችን ግራቫታር ጣቢያ ላይ እንዲጪኑ እና እነሱ ከሚቆጣጠሯቸው የኤመልእክት አድራሻዎች ጋር ምስሎቹን እንዲያጎዳኙ (እንዲያገናኙ) የሚያስችል አንድ የነጻ አገልግሎት ሰጪ ርድጅት ነው። በዚህ ምክንያትም፣ የአምሳያ ሰእሎች መጠናቸውን የማስተካከል፣ ማከማቻ ቦታቸውን የማዘጋጀት እና ጣቢያው ላይ የመጫን ችግርን ሳያስከትሉ የተጠቃሚ መገለጫ ምስሎችን ለማካተት አንድ ምቹ መንገድን ይፈጥራል፤ ስለዚህ እኛ ማድረግ ያለብን ነገር ቢኖር፣ የተጠቃሚውን የኤመልእክት አድራሻ በመጠቀም፣ ትክክለኛ የአምሳያ ስእል ዓ.አ.ሃ.አውን መስራት ብቻ ይሆናል፣ ከዚያም ተዛማጁ የአምሳያ ምስል ወደ ተጠቃሚው መገለጫ ገጽ ላይ በራስሰር ይመጣልናል ማለት ነው። (በክፍል 13.4 ውስጥ አንድ የተብጀ የምስል ሰቀላን እንዴት ማስተናገድ እንደምንችል እንማራለን፡፡)

ዝርዝር 7.8 ላይ እንደሚታየው፣ እቅዳችን ለአንድ የተሰጠ ተጠቃሚ አንድ የአምሳያ ምስልን ለመመለስ አንድ አምሳያ_ለ (amsaya_le) የተባለ ረጅ ተግባርን መበየን ነው፡፡

ዝርዝር 7.8: የተጠቃሚው ማሳያ ትይታ ከስም እና ከአምሳያ ጋር። app/views/teteqamis/show.html.erb
<% provide(:title, @teteqami.sim) %>
<h1>
  <%= amsaya_le @teteqami %>
  <%= @teteqami.sim %>
</h1>

በማንኛውም ረጅ ፋይል ውስጥ የተበየኑ ዘዴዎች በራስሰር በሁሉም ትይታ ላይ በነባሪነት ይገኛሉ፣ ነገር ግን ለአመቺነት ሲባል የ‘አምሳያ_ለ (amsaya_le) ዘዴውን ከተጠቃሚዎች መቆጣጠሪያ ጋር ከተዛመዱ ረጅወች ፋይል ውስጥ እናስገባዋለን። በግራቫታር ሰነድ ውስጥ እንደተጠቀሰው፣ የግራቫታር ዓ.አ.ሃ.አዎች፣ በአንድ ተጠቃሚ የኤመልእክት አድራሻ የኤምዲ5 (MD5) ክትፍ ላይ የተመሰረቱ ናቸው። በሩቢ ውስጥ የኤምዲ5 የአከታተፍ ስልተ-ቀመር በ‘ፈጪ (Digest) ቤተኮድ ውስጥ አንዱ ክፍል የሆነውን የ‘አስራስድስትዮሽፈጪ (hexdigest) ዘዴን በመጠቀም የተተገበረ ነው:-

>> emelekt = "MHARTL@example.COM"
>> Digest::MD5::hexdigest(emelekt.downcase)
=> "1fda4469bcbec3badf5418269ffc5968"

የኤመልእክት አድራሻዎች መልከፊደል-ግድየለሽ (ክፍል 6.2.4) ሲሆኑ፣ የኤምዲ5 ክትፎች ግን እንደዛ ስላልሆኑ፣ ፊደሎችን ወደ ንዑስ-ፊደል እንደተቀየሩ ለማረጋገጥ የ‘ንዑስ-ፊደል (downcase) ዘዴን በ‘አስራስድስትዮሽፈጪ (hexdigest) ነጋሪአሴት ላይ አሳልፈናል፡፡ (በዝርዝር 6.32 ላይ የኤመልእክት አድራሻውን ወደ ንዑስ-ፊደል እንዲቀይር በሚያዘጋጀው መልሰጥሪ ምክንያት ይህ በዚህ ስልጠና ላይ ልዩነት አይፈጥርም፣ የ‘አምሳያ_ለ (amsaya_le) ዘዴው ከሌሎች ምንጮች ከሚመጡ የኤመልእክት አድራሻዎች ላይ ጥቅም ላይ የሚውል ከሆነ ግን ፊደሎቹን ሁሉ ወደ ንዑስ-ፊደል መቀየሩ አንድ ጥሩ ልምድ ነው፡፡) ከ‘አምሳያ_ለ (amsaya_le) ረጅ የተገኘው ውጤት በዝርዝር 7.9 ውስጥ ይታያል፡፡

ዝርዝር 7.9: አንድ የ‘አምሳያ_ለ (amsaya_le) ረጅ ዘዴን መበየን፡፡ app/helpers/teteqamis_helper.rb
module TeteqamisHelper

  # ለተሰጠው ተጠቃሚ አምሳያን ይመልሳል።
  def amsaya_le(teteqami)
    amsaya_meleya  = Digest::MD5::hexdigest(teteqami.emelekt.downcase)
    amsaya_aahaa = "https://secure.gravatar.com/avatar/#{amsaya_meleya}"
    image_tag(amsaya_aahaa, alt: teteqami.sim, class: "አምሳያ")
  end
end

ዝርዝር 7.9 ውስጥ ያለው ኮድ፣ አንድ የ‘ አምሳያ ቅ.ቋ ክፍልን እና ከተጠቃሚው ስም ጋር እኩል የሆነ አንድ የአማራጪ ጽሁፍን (ማለት የማየት ችግር ላለባቸው ተጠቃሚዎች ማለት አንድ የማያ-ገጽ አንባቢን ለሚጠቀሙ ተጠቃሚዎች አመች ከሆነ) ከአንድ የስእል መላያ ጋር ይመልሳል።

የተገኘው የመገለጫ ገጽ በምስል 7.8 ላይ እንደሚታየው ሁኖ መታየት አለበት፡፡ ማይክል@ምሳሌ.ኮም (michael@example.com) የሚለው የኤመልእክት አድራሻ አንድ እውነተኛ አድራሻ ስላልሆነ እና ከአንድ ብጁ አምሳያ ጋር መገኛኘት ስለማይችል፣ የሚታየው የአምሳያ ምስል አንድ አጠቃላይ የሆነ ነባሪ ምስል ብቻ ነው። (በርግጥም የምሳሌ.ኮም (example.com) ግዝአትን ጎራ ብላችሁ ብትቃኙ፣ ይህ ግዝአት እንደዚህ ላሉ ምሳሌዎች የተጠበቀ መሆኑን ትገነዘባላችሁ።) በነገራችን ላይ በክፍል 5.1.2 ውስጥ ያሉትን መልመጃዎች ካጠናቀቃችሁ፣ የአምሳያ ምስሉ በትክክል ይታይ ዘንድ ቅ.ቋውን ከዝርዝር 5.11 ላይ ማስወገዳችሁን አረጋግጡ፡፡

images/figures/profile_with_gravatar
ምስል 7.8: የተጠቃሚ መገለጫ ገጹ ከነባሪው አምሳያ ጋር።

አንድ ብጁ አምሳያን በአፕልኬሽናችን ላይ ለማሳየት፣ አንድ ከግራቫታር ጋር የተመዘገበ የተጠቃሚ የኤመልእክት አድራሻ ያስፈልገናል፣ ይህንን ለማድረግ በኔ ቁጥጥር9 ስር ባለው የኤመልእክት አድራሻ ለመለወጥ የ‘አዘምን (update) ዘዴን (ክፍል 6.1.5) እንጠቀማለን።

$ rails console
>> ተጠቃሚ = Teteqami.first
>> ተጠቃሚ.update(sim: "Abnetawi Teteqami",
?>             emelekt: "example@railstutorial.org",
?>             password: "abaguche",
?>             password_confirmation: "abaguche")
=> true

ምስል 7.9 ላይ እንደሚታየው፣ ከሬይልስ ስልጠና አርማ ጋር ያዛመድኩትን አንድ የኤመልእክት አድራሻ ማለት example@railstutorial.org ‘ን ከተጠቃሚው ጋር መድበነዋል፡፡

images/figures/profile_custom_gravatar
ምስል 7.9: የተጠቃሚ ማሳያ ገጹ ከአንድ ብጁ አምሳያ ጋር።

ምስል 7.1 ላይ የተመለከተው ስእላዊ መግለጫ ለመጠናቀቅ የሚያስፈልገው የመጨረሻው ነገር፣ የመጀመሪያው የተጠቃሚ የጎን-አሞሌው ስሪት ይሆናል። እሱን ለመተግበር የ‘ጎንታ (aside) መለያን እንጠቀማለን፣ ይህ የጎንታ መለያ በአንድ ገጽ ላይ ለይዘት (እንደ ለጎን-አሞሌወች) ሟሟያ ሆኖ ቢያገለግልም፣ እራሱን የቻለ አንድ ወጥ ገጽ ሁኖ ሊጠቅምም ይቻላል። የቡትስትራፕ አካል የሆኑ የ‘ረድፍ (row) እና የ‘መሃከለኛ-4-አምዶች (col-md-4) ክፍሎችንም እናክላለን፡፡ የተጠቃሚ ማሳያ ገጽን የሚያሻሽለው ኮድ በዝርዝር 7.10 ውስጥ ይታያል።

ዝርዝር 7.10: የተጠቃሚ አሳይ (show) ትይታ ላይ አንድ የጎን-አሞሌን ማከል። app/views/teteqamis/show.html.erb
<% provide(:title, @teteqami.sim) %>
<div class="row">
  <aside class="col-md-4">
    <section class="ተጠቃሚ_መረጃ">
      <h1>
        <%= amsaya_le @teteqami %>
        <%= @teteqami.sim %>
      </h1>
    </section>
  </aside>
</div>

የሃ.ጽ.መ.ቋ አባላቶችን እና የቅ.ቋ ክፍሎችን ቦታ ቦታቸውን አሳያዝን፣ አሁን የመገለጫ ገጹን (የጎን-አሞሌውን እና አምሳያውን ጨምሮ) ዝርዝር 7.1110 ላይ በሚታየው ዓ.ቆ.ሉ.ቅ ቅጥ ማድረግ እንችላለን፡፡ (የተቃቀፉት የቅ.ቋ ደንቦች የሚሰሩበት ምክንያት፣ በንብረት ቧንቧመስመር ጥቅም ላይ በዋለው የአ.ቆ.ሉ.ቅ ፕሮግራም ብቻ መሆኑን ልታስተውሉት ይገባል፡፡) የተገኘው ገጽ በምስል 7.10 ውስጥ ይታያል፡፡

ዝርዝር 7.11: የጎን-አሞሌውን ጨምሮ፣ የተጠቃሚ እይታ ገጽን በዓ.ቆ.ሉ.ቅ ቅጥ ማድረግ። app/assets/stylesheets/bju.scss
.
.
.
/* ጎን-አሞሌ */

aside {
  section.ተጠቃሚ_መረጃ {
    margin-top: 20px;
  }
  section {
    padding: 10px 0;
    margin-top: 20px;
    &:first-child {
      border: 0;
      padding-top: 0;
    }
    span {
      display: block;
      margin-bottom: 3px;
      line-height: 1;
    }
    h1 {
      font-size: 1.4em;
      text-align: left;
      letter-spacing: -1px;
      margin-bottom: 3px;
      margin-top: 0px;
    }
  }
}

.አምሳያ {
  float: left;
  margin-right: 10px;
}

.እርምተ_አምሳያ {
  margin-top: 15px;
}
images/figures/user_show_sidebar_css
ምስል 7.10: የተጠቃሚ ትይታ ገጹ ከአንድ የጎን-አሞሌ እና ከቅ.ቋ ጋር።

መልመጃዎች

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

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

  1. ከኤመልእክት አድራሻችሁ ጋር የተዛመደ አንድ አምሳያ ከሌላችሁ ባሁኑ ሰዓት ሊኖርባችሁ ይገባል፡፡ ከምስሉ ጋር የተገናኘው የኤምዲ5 (MD5) ክትፉ ምንድን ነው?
  2. ክፍል 7.1.4 ላይ የተበየነው የ‘አምሳያ_ለ (amsaya_le) የረጅ ኮድን፣ ዝርዝር 7.12 ላይ ተሻሽሎ በቀረበው የ‘አምሳያ_ለ (amsaya_le) የረጅ ኮድ እንዲሻሻል አድርጉ፡፡ ኮዱ አንድ መጠን (meten) የተባለ፣ ለአምሳያ መጠን አማራጫዊ ሰሚአሴት ስላለው፣ የአምሳያ መጠኑ 50 የሆነ አንድ አምሳያን በተጠቃሚ ትይታው ላይ እንዲታይ ለማድረግ፣ አምሳያ_ለ ተጠቃሚ, መጠን፡ 50 (amsaya_le teteqami, meten: 50) ብሎ መጻፍ ይቻላል። ይህ ኮድ እንደተጠበቀው በትክክል መስራቱን አረጋግጡ፡፡ (ይህንን የተሻሻለ የረጅ ዘዴ፣ በክፍል 10.3.1 ውስጥ ስራ ላይ እናውለዋለን፡፡)
  3. በሁለተኛው መልመጃ ላይ ስንገለገልበት የነበረው የተርታ አማራጪ አሁንም ቢሆን በተለመደ መልኩ ጥቅም ላይ ሊውል ይችላል፤ ነገር ግን ከሩቢ 2.0 ጀምሮ በዝርዝር 7.13 ላይ እንደተመለከተው፣ በምትኩ የቁልፍቃል ነጋሪአሴቶችን መጠቀም እንችላለን፡፡ ስለዚህ የ‘አምሳያ_ለ (amsaya_le) ረጅ ዘዴውን ዝርዝር 7.13 ላይ ባለው የ‘አምሳያ_ለ (amsaya_le) ረጅ መተካት ይቻላል፡፡ በዝርዝር 7.13 እና በዝርዝር 7.12 መካከል ያለው ልዩነት ምንደን ነው?
ዝርዝር 7.12: በ‘አምሳያ_ለ (amsaya_le) ረጅ ላይ አንድ የአማራጪ ተርታን ማከል። app/helpers/teteqamis_helper.rb
module TeteqamisHelper

  # ለተሰጠው ተጠቃሚ አምሳያን ይመልሳል።
  def amsaya_le(teteqami, options = { meten: 80 })
    meten         = options[:meten]
    amsaya_meleya  = Digest::MD5::hexdigest(teteqami.emelekt.downcase)
    amsaya_aahaa = "https://secure.gravatar.com/avatar/#{amsaya_meleya}?s=#{meten}"
    image_tag(amsaya_aahaa, alt: teteqami.sim, class: "አምሳያ")
  end
end
ዝርዝር 7.13: በ‘አምሳያ_ለ (amsaya_le) ረጅ ላይ የቁልፍቃል ነጋሪአሴቶችን መጠቀም። app/helpers/teteqamis_helper.rb
module TeteqamisHelper

  # ለተሰጠው ተጠቃሚ አምሳያን ይመልሳል።
  def amsaya_le(teteqami, meten: 80)
    amsaya_meleya  = Digest::MD5::hexdigest(teteqami.emelekt.downcase)
    amsaya_aahaa = "https://secure.gravatar.com/avatar/#{amsaya_meleya}?s=#{meten}"
    image_tag(amsaya_aahaa, alt: teteqami.sim, class: "አምሳያ")
  end
end

7.2 የመመዝገቢያ ቅጽ

አሁን አንድ የሚሰራ (ነገር ግን ያላለቀ) የተጠቃሚ መገለጫ ገጽ ስላለን፣ ለጣቢያችን አንድ የመመዝገቢያ ቅጽ ለመስራት ዝግጁዎች ነን፡፡ በምስል 5.11 ላይ እንደሚታየው፣ (በምስል 7.11 ላይም በድጋሜ ታይቷል) የመመዝገቢያ ገጹ በአሁኑ ጊዜ ባዶ ነው፤ አዲስ ተጠቃሚዎችን ለመመዝገብ አይጠቅምም፡፡ የዚህ ክፍል ዓላማ በምስል 7.12 ላይ ያለውን የመመዝገቢያ ቅጽ ስእላዊ መግለጫን ወደሚሰራ የመመዝገቢያ ቅጽ በመቀየር ይህንን አሳዛኝ ሁኔታ መለወጥ መጀመር ነው፡፡

images/figures/blank_signup_page_recap
ምስል 7.11: የመመዝገቢያ ገጹ (/ተመዝገብ (/temezgeb)) ወቅታዊው ሁኔታ።
images/figures/signup_mockup_bootstrap
ምስል 7.12: የተጠቃሚ መመዝገቢያ ገጹ ስእላዊ መግለጫ።

7.2.1 ከቅጽ_ጋር‘ን መጠቀም

የመመዝገቢያው ገጽ ዋናው አካል ቅጹ ነው፤ ይህም አስፈላጊ የመመዝገቢያ መረጃዎችን (ማለት ስምን፤ ኤመልእክትን፤ መሕለፈቃልን፤ እና የመሕለፈቃል ማረጋገጫን) ለማስረከብ ይጠቅማል፡፡ በሬይልስ ውስጥ የቁሱን ባሕሪወች በመጠቀም አንድ ቅጽን ለመገንባት አንድ የንቅ መዝገብ ቁስ የሚጠቀመውን የ‘ቅጽ_ጋር (form_with) ረጅ ዘዴን በመጠቀም ቅጹን መስራት እንችላለን፡፡

የመመዝገቢያ ገጹ /ተመዝገብ (/temezgeb) በተጠቃሚዎች መቆጣጠሪያ (ዝርዝር 5.43) ውስጥ ወደ አዲስ (new) ተግባር እንደተዘዋወረ በማስታወስ፣ አሁን የመጀመሪያ ደረጃ ስራችን ለ‘ቅጽ_ጋር (form_with) ነጋሪአሴት የሚያስፈልገውን አንድ የተጠቃሚ ቁስ መፍጠር ነው፡፡ የተበየነው የ‘@ተጠቃሚ (@teteqami) ተለዋዋጪ በዝርዝር 7.14 ውስጥ ይታያል፡፡

ዝርዝር 7.14: የ‘@ተጠቃሚ (@teteqami) ተለዋዋጪን በ‘አዲስ (new) ተግባር ውስጥ ማከል። app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController

  def show
    @teteqami = Teteqami.find(params[:id])
  end

  def new
    @teteqami = Teteqami.new
  end
end

ቅጹ ራሱ በዝርዝር 7.15 ውስጥ ይታያል፡፡ ቅጹን በክፍል 7.2.2 ውስጥ በዝርዝር እንመለከተዋለን፣ እስኪ መጀመሪያ ግን በዝርዝር 7.16 ውስጥ ባለው ዓ.ቆ.ሉ.ቅ በጥቂቱ ቅጥ እናድርግለት፡፡ (ዝርዝር 7.2 ላይ የ‘ መጠነ_ሳጥን ውስጠድብልቅን በድጋሜ መጠቀማችንን አስተውሉ፡፡) አንዴ እነዚህ የቅ.ቋ ደንቦች ከተተገበሩ በኋላ፣ የመመዝገቢያ ገጹ በምስል 7.13 ላይ የሚታየውን ገጽታ ይይዛል፡፡

ዝርዝር 7.15: አንድ የአዲስ ተጠቃሚዎች መመዝገቢያ ቅጽ። app/views/teteqamis/new.html.erb
<% provide(:title, 'ይመዝገቡ') %>
<h1>ይመዝገቡ</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_with(model: @teteqami, local: true) do || %>
      <%= .label :sim, 'ስም' %>
      <%= .text_field :sim %>

      <%= .label :emelekt, 'ኤመልእክት' %>
      <%= .email_field :emelekt %>

      <%= .label :password, 'መሕለፈቃል' %>
      <%= .password_field :password %>

      <%= .label :password_confirmation, "አረጋግጥ" %>
      <%= .password_field :password_confirmation %>

      <%= .submit "ለኔ መለያ ፍጠር", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>
ዝርዝር 7.16: ለመመዝገቢያ ቅጹ የሚሆን ቅ.ቋ። app/assets/stylesheets/bju.scss
.
.
.
/* ቅጾች */

input, textarea, select, .uneditable-input {
  border: 1px solid #bbb;
  width: 100%;
  margin-bottom: 15px;
  @include መጠነ_ሳጥን;
}

input {
  height: auto !important;
}
images/figures/signup_form
ምስል 7.13: የተጠቃሚ መመዝገቢያ ቅጽ።

መልመጃዎች

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

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

  1. ውጤቱን በተመለከተ የጥምር ተለዋዋጪ ስሙ ምንም ዓይነት ለውጥ እንደማያመጣ ለማረጋገጥ፣ የተባለውን የጥምር ተለዋዋጪ በሙሉ፣ ማቲው በሚል የጥምር ተለዋዋጪ ተኩ። የተባለውን የጥምር ተለዋዋጪ ማቲው በሚል የጥምር ተለዋዋጪ መተካቱ ለምን የተሳሳተ ምርጫ ሊሆን ይችላል?

7.2.2 የመመዝገቢያ ቅጹ የሃ.ጽ.መ.ቋ አቋቋም

ዝርዝር 7.15 ውስጥ የተበየነውን የቅጽ አመሰራረት ለመረዳት፣ ቅጹን በትንሹ ከፋፍሎ ማየቱ ጠቃሚ ይሆናል፡፡ በመጀመሪያ የውጩን መዋቅር እንመለከታለን፣ ይህም በአንድ ቅጽ_ጋር (form_with) ተከፍቶ በአንድ ጨርስ (end) የተዘጋ ጥሪን ያካትታል:-

<%= form_with(model: @teteqami, local: true) do || %>
  .
  .
  .
<% end %>

የ‘አድርግ (do) ቁልፍቃል መኖሩ ቅጽ_ጋር (form_with) ከአንድ ተለዋዋጪ ጋር አንድ ጥምርን እንደሚወስድ ያመላክታል፣ እኛም ይህንን ተለዋዋጪ ብለን ሰይመነዋል ( “ቅጽ” የሚለውን ቃል አሳጥሮ ለመጥራት የተጠቀምንበት ፊደል ነው)። የተርታ ነጋሪአሴቱ ለ‘ሰፈር፡ እውነት (local: true) መሆኑን ልብ በሉ፤ ቅጽ_ጋር (form_with) በነበሪነት አንድ የ “ሩቅ” ዳባሪ የማርቀቂያ ቋንቋ (ዳ.ማ.ቋ) (Extensible Markup Language (XML)) መጠይቅን ይልካል፣ እኛ ግን ቅጹን በመሙላት ላይ የሚያግጥሙ የስህተት መልእክቶች በትክክል እንዲሰጡ፤ አንድ መደበኛ “የሰፈር” ቅጽ መጠይቅ እንዲሆን እንፈልጋለን (ክፍል 7.3.3)።

የሬይልስ ረጅ ዘዴን በተመለከተ እንደ ተለመደው ስለ ኮዱ ውስጣዊ አሰራር በዝርዝር ማወቅ አያስፈልገንም፣ ማወቅ ያለብን ነገር ቢኖር፣ የተባለው ቁስ ከአንድ ተዛማጅ የሃ.ጽ.መ.ቋ ቅጽ አባል፣ ማለት ከጽሑፍ መስክ፣ ከሬድዮ አዝራር፣ ወይም ከመሕለፈቃል መስክ ጋር ሲጠራ፣ የ‘@ተጠቃሚ (@teteqami) ቁስ ባሕሪን ለማቀናበር ለዛ አባል ተለይቶ የተነደፈውን ኮድ እንደሚመልስ ማወቅ ብቻ ይሆናል። በሌላ አማርኛ ይሄ:-

<%= .label :sim, 'ስም' %>
<%= .text_field :sim %>

የአንድ ተጠቃሚ ቅርጸት የ‘ስም (sim) ባሕሪን ለማዘጋጀት፣ አንድ የተሰየመ የጽሑፍ መስክ አባልን ለመስራት፣ አስፈላጊውን ሃ.ጽ.መ.ቋ ይፈጥራል። እዚህ ላይ ሁለተኛው ሰሚአሴት ላይ ስም የተባለ አንድ ብጁ ጽሑፍን እንዳዘጋጀን ልታስተውሉ ይገባል። ይህም ቅጹ ሙሉ በሙሉ በአማርኛ እንዲቀርብ ያበቃዋል።

በአሳሻችሁ ላይ ተቆር-ጠቅን (Ctrl-click) በማድረግ እና “የአባል መርምር (inspect element)” ተግባርን በመጠቀም ሃ.ጽ.መ.ቋውን እየተመለከታችሁ ከሆነ፣ የገጹ ምንጪ ልክ በዝርዝር 7.17 ላይ የሚታየውን መምሰል ይኖርበታል። እስኪ ስለ መዋቅሩ ለመወያየት ትንሽ ጊዜ እንውሰድ፡፡

ዝርዝር 7.17: የቅጹ ሃ.ጽ.መ.ቋ በምስል 7.13 ላይ።
<form action="/teteqamis" accept-charset="UTF-8" class="new_teteqami"
      id="new_teteqami" method="post">
  <input type="hidden" name="authenticity_token"
  value="9KpJwDhv0DVHyy6c49DY4+PGty0TT8+btOSCqf7mD15kfH+6+RS=">
  <label for="teteqami_sim">ስም</label>
  <input id="teteqami_sim" name="teteqami[sim]" type="text" />

  <label for="teteqami_emelekt">ኤመልእክት</label>
  <input id="teteqami_emelekt" name="teteqami[emelekt]" type="email" />

  <label for="password">መሕለፈቃል</label>
  <input id="teteqami_password" name="teteqami[password]"
         type="password" />

  <label for="teteqami_password_confirmation">አረጋግጥ</label>
  <input id="teteqami_password_confirmation"
         name="teteqami[password_confirmation]" type="password" />

  <input class="btn btn-primary" name="commit" type="submit"
         value="ለኔ መለያ ፍጠር" />
</form>

በሰነዱ ውስጣዊ መዋቅር እንጀምራለን፡፡ ዝርዝር 7.15 ’ን ከዝርዝር 7.17 ጋር በምናነጻጽርበት ወቅት ክት ሩቢው:-

<%= .label :sim, 'ስም' %>
<%= .text_field :sim %>

ይህንን ሃ.ጽ.መ.ቋ ሲሰራ

<label for="sim">Sim</label>
<input type="text" name="sim" id="sim">

ይሄ

<%= .label :emelekt, 'ኤመልእክት' %>
<%= .email_field :emelekt %>

ይህንን ሃ.ጽ.መ.ቋ ሲሰራ

<label for="teteqami_emelekt">ኤመልእክት</label>
<input id="teteqami_emelekt" name="teteqami[emelekt]" type="email" />

ይሄ ደግሞ

<%= .label :password, 'መሕለፈቃል' %>
<%= .password_field :password %>

ይህንን ሃ.ጽ.መ.ቋ ሲሰራ እንመለከታለን።

<label for="password">መሕለፈቃል</label>
<input id="teteqami_password" name="teteqami[password]"
         type="password" />

ምስል 7.14 ላይ እንደሚታየው፣ የጽሑፍ እና የኤመልእክት መስኮቹ (ዓይነት="ጽሁፍ" (type="text") እና ዓይነት="ኤመልእክት" (type="email")) ይዘታቸውን ብቻ በገሃድ ሲያሳዩ፣ የመሕለፈቃል መስኮቹ (ዓይነት="መሕለፈቃል" (type="password")) ግን ለደህንነት ሲባል የሚገቡትን ሆሄወች ይደብቃሉ፡፡ (አንድ የኤመልእክት መስክን የመጠቀም አንዱ ትልቅ ጥቅም፣ አንዳንድ ስርዓቶች እሱን ከጽሑፍ መስክ በተለየ መልኩ ማስተናገዳቸው ነው፤ ለምሳሌ ዓይነት="ኤመልእክት" (type="email") የሚለው ኮድ፣ አንዳንድ ተንቀሳቃሽ መሳሪያዎችን የኤመልእክት አድራሻዎችን ለማስገባት አንድ የተመቻቸ ልዩ ቁልፈሰሌዳን እንዲያሳዩ ያደርጋቸዋል፡፡)

images/figures/filled_in_form
ምስል 7.14: የ‘ጽሑፍ (text) እና የ‘መሕለፈቃል (password) መስኩ የተሞላ አንድ ቅጽ።

ክፍል 7.4 ላይ እንደምናየው፣ አንድ ተጠቃሚን ለመፍጠር ቁልፉ በእያንዳንዱ ግብዓት (input) ውስጥ ያለው ልዩው የ‘ስም (name) ባሕሪው ነው:-

<input id="teteqami_sim" name="teteqami[sim]" - - - />
.
.
.
<input id="teteqami_password" name="teteqami[password]" - - - />

ክፍል 7.3 ላይ እንደምናየው፣ እነዚህ የ‘ስም name ዋጋወች ሬይልስን፣ በተጠቃሚው የገቡ ዋጋወችን በመጠቀም፣ ተጠቃሚዎችን ለመፍጠር፣ አንድ የተርታ ማስጀመሪያ (በ‘ሰሚአሴት (params) ተለዋዋጪ በኩል) እንዲገነባ ያስችሉታል፡፡

ሁለተኛው አስፈላጊው አካል ደግሞ ራሱ የ‘ቅጹ (form) መለያው ነው፡፡ ሬይልስ የ‘@ተጠቃሚ (@teteqami) ቁስን በመጠቀም የ‘ቅጽ (form) መለያውን ይፈጥራል፤ እያንዳንዱ የሩቢ ቁስ የገዛ ራሱን ክፍል (ክፍል 4.4.1) ስለሚያውቅ፣ ሬይልስም @ተጠቃሚ (@teteqami) የ‘ተጠቃሚ (Teteqami) ክፍል መሆኑን ያውቃል፤ ይህ በንዲህ እያለ፣ @ተጠቃሚ (@teteqami) አንድ አዲስ ተጠቃሚ ስለሆነ፣ ሬይልስ በ‘አስቀምጥ (post) ዘዴ አንድ ቅጽ መገንባት እንዳለበትም ያውቃል፣ ይህም አንድ አዲስ ቁስን ለመፍጠር ትክክለኛው ግስ ነው (ሳጥን 3.2):-

<form action="/teteqamis" class="new_teteqami" id="new_teteqami" method="post">

እዚህ ላይ የ‘ክፍል (class) እና የ‘መታወቂያ (id) ባሕሪወቹ ብዙም ጠቀሜታ የላቸውም፤ አስፈላጊ የሆኑት ተግባር="/ተጠቃሚወች" (action="/teteqamis") እና ዘዴ="አስቀምጥ" (method="post") ናቸው። እነዚህ አንድ ላይ በመሆን፣ አንድ የሃ.ጽ.ማ.ስ ዓስቀምጥ (POST) መጠይቅን ለ/ተጠቃሚወች (/teteqamis) ዓ.አ.ሃ.አ ለመስጠት መመሪያዎችን ይመሰርታሉ፡፡ ይህ ምን ዓይነት ውጤት እንደሚያስገኝ በሚቀጥሉት ሁለት ክፍሎች ውስጥ እንመለከተዋለን፡፡

በ‘ቅጹ (form) መለያ ውስጥ የሚታየውን ኮድ አስተውላችሁ ይሆናል፤ በአሳሹ ላይ የማይታየው ይህ ኮድ በሬይልስ ውስጣዊ አሰራር ጥቅም ላይ የሚውል ስለሆነ ምን እንደሚሰራ ማወቁ ለናንተ አስፈላጊ አይደለም:-

<input name="authenticity_token" type="hidden"
       value="NNb6+J/j46LcrgYUC60wQ2titMuJQ5lLqyAbnbAUkdo=" />

በአጪሩ የጣቢያ ሰበር የማጪበርበር መጠይቅ (ጣ.ሰ.ማ.ጥ) (cross-site request forgery (CSRF)) ተብሎ የሚጠራውን አንድ ጥቃት ለማስቆም ሬይልስ የሚጠቀምበትን አንድ የርግጠኝነት ይስሙላን (authenticity token) ያካትታል፡፡ እንደዚህ ያሉ ነገሮችን በጥልቅ ለማወቅ መሞከሩን ችላ ማለቱ ትክክል እንደሆነ ማወቁ የአንድ ቴክኒካዊ ችሎታ ጥሩ ምልክት ነው (ሳጥን 1.2)፡፡11

መልመጃዎች

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

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

  1. በሃ.ጽ.መ.ቋ ላይ መሰረታዊ እውቀትን ለማግኘት የሚያስፈልገውን ተማር ላይ፣ በእጅ ከተጻፉት ሃ.ጽ.መ.ቋ ውስጥ የ‘ቅጽ (form) መለያን ብቻ አይሸፍንም። ለምን?

7.3 ያልተሳካ ምዝገባ

ምስል 7.13 ውስጥ የቅጹን ሃ.ጽ.መ.ቋ በአጪሩ ብንመረምርም (በዝርዝር 7.17 ላይ የታየውን) እንኳን ስለ ቅጹ ዝርዝሮች ግን በጥልቀት አልተመለከትንም እና ቅጹ በምዝገባ ውድቀት አውድ ላይ እያለ መመልከቱ በበለጠ እንድንረዳው ይረዳናል። በዚህ ክፍል ውስጥ፣ ልክ በምስል 7.15 ላይ እንዳለው ስእላዊ መግለጫ፣ ብቁ ያልሆነ ግባትን የሚያስረክብ እና የመመዝገቢያ ገጹን ከአንድ የስህተቶች ዝርዝር ጋር እንደገና የሚያቀርብ አንድ የመመዝገቢያ ቅጽን እንፈጥራለን፡፡

images/figures/signup_failure_mockup_bootstrap
ምስል 7.15: የምዝገባ ውድቀት ገጹ ስእላዊ መግለጫ።

7.3.1 አንድ የሚሰራ ቅጽ

ክፍል 7.1.2 ላይ የ‘ተጠቃሚዎች: ሃብቶች‘ን (resources:teteqamis) በማዘዋወሪያዎች (routes.rb) ፋይል (ዝርዝር 7.3) ውስጥ ማከሉ የኛ የሬይልስ አፕልኬሽን ለሰንጠረዥ 7.1 ሙሉየው.ሁ.ማ ዓ.አ.ሃ.አወች በራስሰር ምላሽ መስጠቱን እንደሚያረጋግጥ አስታውሱ፡፡ በተለይ፣ ለ/ተጠቃሚዎች (/teteqamis) የ‘ዓስቀምጥ (POST) መጠይቅ በ‘ፍጠር (create) ተግባር እንደተስተናገደ ያረጋግጣል። ለ‘ፍጠር (create) ተግባሩ ስልታችን አዲስ.ተጠቃሚ‘ን (Teteqami.new) በመጠቀም አንድ አዲስ የተጠቃሚ ቁስን ለመፍጠር የቅጹን ማስረከቢያ መጠቀም፣ እና ተጠቃሚው ተገቢወቹን መስፈርት ካሟላ፣ ወደ ውሂበጎታው ማስቀመጥ፣ ካላሟላ ደግሞ ተጠቃሚው ምናልባት እንደገና ማስረከቡን ይፈትን ዘንድ፣ የምዝገባ ገጹን ማቅረብ ይሆናል። እስኪ የምዝገባ ቅጹን የኮድ መልሰ በማየት እንጀምር:-

<form action="/teteqamis" class="new_teteqami" id="new_teteqami" method="post">

ክፍል 7.2.2 ላይ እንደተጠቀሰው፣ ይህ ሃ.ጽ.መ.ቋ ለ/ተጠቃሚዎች (/teteqamis) ዓ.አ.ሃ.አ አንድ የ‘ዓስቀምጥ (POST) መጠይቅን ይሰጣል፡፡

ወደ አንድ የሚሰራ የመመዝገቢያ ቅጽ የሚያመራንን የመጀመሪያ እርምጃ የምናደርገው፤ በዝርዝር 7.18 ውስጥ አንድ ኮድን በማከል ነው፡፡ ይህ ዝርዝር በመጀመሪያ በከፊሎች አውድ (ክፍል 5.1.3) ላይ ያየናውን የ‘አቅርብ (render) ዘዴን ሁለተኛ አጠቃቀም ያካትታል፤ እንደምታዩት አቅርብ (render) በመቆጣጠሪያ ተግባሮች ውስጥም ይሰራል። በ‘ተጠቃሚ.አስቀምጥ (@teteqami.save) ዋጋ ላይ በመመርኮዝ የውድቀት እና የስኬት ጉዳዮችን በተናጠል እንድናስተናግድ የሚረዳንን አንድ የ‘ከሆነ-ካልሆነ (if-else) ቅርንጫፍ መዋቅርን ለማስተዋወቅ፣ ይህንን አጋጣሚ እንደተጠቀምን ልብ በሉ፡፡ ይህ (በክፍል 6.1.3 ላይ እንዳየነው) የ‘ከሆነ-ካልሆነ ቅርንጫፍ @ተጠቃሚ.አስቀምጥ (@teteqami.save) ከተሳካ እውነት‘ን (true) ካልተሳካ ደግሞ ሃሰት‘ን (false) ይመልሳል።

ዝርዝር 7.18: የምዝገባ ውድቀትን የሚያስተናግድ አንድ የ‘ፍጠር (create) ተግባር። app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController

  def show
    @teteqami = Teteqami.find(params[:id])
  end

  def new
    @teteqami = Teteqami.new
  end

  def create
    @teteqami = Teteqami.new(params[:teteqami])  # ይህ የመጨረሻው ትግበራ አይደለም!
    if @teteqami.save
      # አንድ ስኩ ማስቀመጥን አስተናጋጅ
    else
      render 'new'
    end
  end
end

አስተያየቱን አስተውሉ፤ ይህ የመጨረሻው ትግበራ እንዳልሆነ ይገልጻል። ነገር ግን እኛን ለማስጀመር በቂ ነው፣ እናም በክፍል 7.3.2 ውስጥ ትግበራውን እንጨርሰዋለን፡፡

ዝርዝር 7.18 ውስጥ ያለው ኮድ እንዴት እንደሚሰራ ለመረዳት በጣም ጥሩው መንገድ፣ ቅጹ ላይ አንዳንድ ብቁ ያልሆኑ የምዝገባ ውሂቦችን ማስረከብ ነው፡፡ ያንን የማድረጉ ውጤት በምስል 7.16 ላይ ይታያል፣ የተሟላው የአርም መረጃውም በምስል 7.17 ላይ ይታያል፡፡

images/figures/signup_failure
ምስል 7.16: ብቃት የሌለው ውሂብን በማስረከብ ምክንያት የተከሰተ የምዝገባ አለመሳካት፡፡
images/figures/signup_failure_rails_debug
ምስል 7.17: ከአርም የተሰጠ ያልተሳካ የምዝገባ መረጃ።

ሬይልስ አንድ ርክብን እንዴት እንደሚያስተናግድ ለማየት የተሻለ ግንዛቤ እንዲኖረን፣ እስኪ ከሰሚአሴቶች ተርታ ውስጥ የ‘ተጠቃሚ (teteqami) ክፍልን ከአርም መረጃው ላይ በደንብ እንመልከት (ምስል 7.17):-

"teteqami" => { "sim" => "Loulseged Abebe",
            "emelekt" => "lulei@biquyalhone",
            "password" => "[FILTERED]",
            "password_confirmation" => "[FILTERED]"
          }

ይህ ተርታ እንደ ሰሚአሴቶች (params) አካል ሁኖ ወደ ተጠቃሚዎች መቆጣጠሪያ ያልፋል፣ እናም በክፍል 7.1.2 ውስጥ የ‘ሰሚአሴቶች (params) ተርታው የእያንዳንዱን መጠይቅ እንደሚይዝ አይተናል። ልክ እንደ /ተጠቃሚዎች/1 (/teteqamis/1) ባለ አንድ ዓ.አ.ሃ.አ ላይ የ‘ሰሚአሴቶች:መታወቂያ‘ው (params[:id]) ዋጋ፣ የተዛማጁ የተጠቃሚ መታወቂያ (id) ነው (በዚህ ምሳሌ ውስጥ 1 ይሆናል)። በምዝገባ ቅጽ ላይ ለመመዝገብ ሰሚአሴቶች (params) በምትኩ አንድ የተርታወች ተርታን ይይዛል፣ ይህም በመጀመሪያ፣ በክፍል 4.3.3 ውስጥ የሰሚአሴት ግንባታ ላይ በአንድ ሰሌዳ ክፍለ ጊዜ ላይ ሆን ተብሎ አንድ ሰሚአሴቶች የተባለ የተለዋዋጪ ስያሜ ተሰጥቶት ነበር፡፡ በዝርዝር 7.17 ላይ እንደሚታየው፣ የአርም መረጃ ቅጹ በተረከበ ጊዜ ከቅጹ የተረከበውን አንድ የ‘ተጠቃሚ (teteqami) ተርታ ባሕሪ ከዋጋው ጋር በማዛመድ ያሳያል፣ ቁልፎቹ የመጡት ደግሞ የ‘ግብዓት (input) መለያው ላይ ከሚገኘው የ‘ስም (name) ባሕሪዎች ነው፡፡ ለምሳሌ "ተጠቃሚ[ኤመልእክት]" ("teteqami[emelekt]") የሚል ስያሜ ያለው የ

<input id="teteqami_emelekt" sim="teteqami[emelekt]" type="email" />

ዋጋ በትክክል የ‘ተጠቃሚ‘ው (teteqami) ተርታ የ‘ኤመልእክቱ (emelekt) ባሕሪ ነው ማለት ነው፡፡

የተርታ ቁልፎች በማረሚያው ውጽአት ላይ እንደ ሃረግ ቢታዩም፣ በተጠቃሚዎች መቆጣጠሪያ ውስጥ ግን ልክ እንደ ወካይ አድርገን ልንደርስባቸው እንችላለን፤ ስለሆነም ሰሚአሴቶች[:ተጠቃሚ] (params[:teteqami]) አንድ የተጠቃሚ የባሕሪዎች ተርታ ነው ማለት ነው፤ እንዳውም፣ በክፍል 4.4.5 ላይ እንደተመለከተው እና በዝርዝር 7.18 ውስጥ እንደሚታየው፣ በትክክል ለ‘አዲስ.ተጠቃሚ (Teteqami.new) እንደ አንድ ነጋሪአሴት የሚያስፈልጉት ባሕሪወች ናቸው። ይህ ማለት ይህ:-

@teteqami = Teteqami.new(params[:teteqami])

ብዙውን ጊዜ ከዚህ

@teteqami = Teteqami.new(sim: "Loulseged Abebe", emelekt: "lulei@biquyalhone",
                 password: "ጉቸ", password_confirmation: "ካሳ")

ጋር እኩል ነው ማለት ነው፡፡ የቀድሞ የሬይልስ ስሪቶች የሚጠቀሙት ይህንን:-

@teteqami = Teteqami.new(params[:teteqami])

ነበር፣ በእርግጥም ይሰራል፣ ነገር ግን በነበሪነት ጥብቅ ስላልሆነ ተንኮል አዘል ተጠቃሚዎች የአፕልኬሽኑን የውሂበጎታ ይዞታ እንዳይቀይሩት ለመከላከል ጥንቃቄን እና ለስህተት ያልተጋለጠ አካሄድን ይጠይቃል፡፡ ይህ ኮድ ከ 4.0 በኋላ ባሉት የሬይልስ ስሪቶች ላይ (በምስል 7.16 እና ምስል 7.17 ላይ እንደሚታየው) አንድ ስህተትን ያስነሳል፤ ይህ ማለት ኮዱ በነባሪነት ጥብቅ ነው ማለት ነው፡፡

7.3.2 ጠንካራ ሰሚአሴቶች

ክፍል 4.4.5 ውስጥ የክምር ምደባ ሃሳብን/አሰራርን በግልጽ አይተናል፤ ይህም ልክ እደሚከተለው፣ አንድ የተርታ ዋጋወችን በመጠቀም አንድ የሩቢ ተለዋዋጪ ማስጀመርን ያሳትፋል:-

@teteqami = Teteqami.new(params[:teteqami])  # ይህ የመጨረሻው ትግበራ አይደለም!

ዝርዝር 7.18 ውስጥ የተካተተው እና አሁንም ከላይ እንዳዲስ የሚታየው አስተያየት፣ ይህ የመጨረሻው ትግበራ አለመሆኑን ያሳያል፡፡ ያ የሆነበት ምክንያት ሰሚአሴቶች (params) አንድ ተጠቃሚ የሚያስረክበውን ውሂብ ሁሉ ወደ አዲስ.ተጠቃሚ (Teteqami.new) ለማሳለፍ ስለሚያዘጋጅ፣ እና መላውን የ‘ሰሚአሴቶች (params) ተርታ ማስጀመሩ በጣም አደገኛ ስለሆነ ነው። ለምሳሌ:- የአሁኑ የተጠቃሚ ቅርጸት ባሕሪወች፣ አንድ ተጨማሪ የጣቢያው የአስተዳደር ክፍል ተጠቃሚወችን ለመለየት የሚያገለግል የ‘አስተዳዳሪ (astedadari) ባሕሪን ይካተታል እንበል። (በነገራችን ላይ በክፍል 10.4.1 ውስጥ ይህንን ባሕሪ ተግባራዊ እናደርጋለን፡፡) እንደዚህ አይነቱን አንድ ባሕሪ ዋጋውን እውነት (true) ለማድረግ፣ የሰሚአሴቶች አካል የሆነውን የአስተዳዳሪ ባሕሪ ዋጋን አስተዳዳሪ=’1’ (astedadari='1') አድርጎ ማሳለፍ ሲሆን፤ ይህንንም እንደ የሃ.ጽ.ማ.ስ ፕሮግራምን (የሃ.ጽ.ማ.ስ ተገልጋይ (Client)) ማለት አንድ እንደ ከርል (curl) ያለ የማዘዥያ መስመርን በመጠቀም ይህንን ማከናወኑ ቀላል የሆነ ተግባር ነው። እናም መላውን የ‘ሰሚአሴቶች (params) ተርታ በ‘አዲስ.ተጠቃሚ (Teteqami.new) ላይ የማሳለፉ መዘዝ፣ በድር መጠይቅ በኩል አስተዳዳሪ=’1’‘ን (astedadari='1') በማካተት ማንኛውም የጣቢያው ተጠቃሚ የአስተዳደር መዳረሻን እንዲያገኝ መፍቀድ ይሆናል፡፡

ከዚህ ቀደም የነበሩ የሬይልስ ስሪቶች ይህንን ችግር ለመቅረፍ በቅርጸቱ ንጣፍ ላይ አንድ ባሕሪ_ተደራሽ (attr_accessible) የተባለ ዘዴን ይጠቀሙ ነበር፣ እና አሁንም ቢሆን ያንን ዘዴ በነባር (Legacy)12 የሬይልስ አፕልኬሽኖች ውስጥ ልታዩት ትችሉ ይሆናል፣ ነገር ግን ከሬይልስ 4.0 ጀምሮ የሚመረጠው አሰራር በመቆጣጠሪያ ንጣፍ ውስጥ ጠንካራ ሰሚአሴቶች (Strong Parameters) ተብሎ የሚጠራውን ዘዴ መጠቀም ነው፡፡ ይህ የትኞቹ ሰሚአሴቶች አስፈላጊ (Required) እንደሆኑ እና የትኞቹ እንደተፈቀዱ (Permitted) ለመወሰን ያስችለናል። በተጨማሪም ከላይ እንዳለው አንድ ጥሬ የ‘ሰሚአሴቶች (params) ተርታ ወደ አዲስ.ተጠቃሚ (Teteqami.new) ባሕሪ በሚያልፍበት ጊዜ፣ አፕልኬሽኑ ላይ አንድ የስህተት መልእክት እንዲነሳ ያደርጋል፤ ስለሆነም የሬይልስ አፕልኬሽኖች አሁን ከክምር ምደባ ተጋላጪነት በነባሪነት ነጻ ናቸው ማለት ነው፡፡

በአሁኑ ጊዜ አንድ የ‘:ተጠቃሚ (:teteqami) ባሕሪን ከ‘ሰሚአሴቶች (params) ተርታ ጋር እንዲኖረን እናስፈልጋለን፤ እና የስሙን፣ የኤመልእክቱን፣ የመሕለፈቃሉን እና የመሕለፈቃል ማረጋገጫ ባሕሪዎቹን መፍቀድ እንፈልጋለን (ሌሎቹን ግን መፍቀድ አንፈልግም)፡፡ ፍላጎታችንንም እንደሚከተለው አድርገን ማከናወን እንችላለን:-

params.require(:teteqami).permit(:sim, :emelekt, :password, :password_confirmation)

ይህ ኮድ እዚህ ላይ የተፈጠረውን የ‘ሰሚአሴቶች (params) ተርታ ከተፈቀዱት ባሕሪወች ጋር ብቻ ይመልሳል (የ‘:ተጠቃሚ (:teteqami) ባሕሪ ከጎደለ አንድ የስህተት መልእክትን በማስነሳት)።

የእነዚህ ሰሚአሴቶች አጠቃቀምን ለማመቻቸት አንድ ተጠቃሚ_ነገሪአሴቶች (teteqami_negariaseitoch) የተባለ የረዳት (Auxiliary)13 (አንድ ተገቢ የተርታ ማስጀመሪያን የሚመልስ) ዘዴን ማስተዋወቁ የተለመደ ነው፣ እና በ‘ሰሚአሴቶች[:ተጠቃሚ] (params[:teteqami]) ምትክ እሱን መጠቀም እንችላለን:-

@teteqami = Teteqami.new(teteqami_negariaseitoch)

ተጠቃሚ_ነገሪአሴቶች (teteqami_negariaseitoch) የሚያስፈልገው ለተጠቃሚዎች መቆጣጠሪያ ውስጣዊ ጠቀሜታ ብቻ ስለሆነ እና ውጪ ባሉ ተጠቃሚዎች፣ በድር በኩል እንዳይደረስ መጋለጥ ስለለበት፣ በዝርዝር 7.19 ላይ እንደሚታየው፣ የሩቢ የ‘ግል (private) ቁልፍቃልን በመጠቀም ይህንን ዘዴ የግል እናደርገዋለን። (ስለ ግል (private) ዘዴ በክፍል 9.1 ላይ በበለጠ ዝርዝር እንነጋገርበታለን።)

ዝርዝር 7.19: ጠንካራ ሰሚአሴቶችን በ‘ፍጠር (create) ተግባር ውስጥ መጠቀም። app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
  .
  .
  .
  def create
    @teteqami = Teteqami.new(teteqami_negariaseitoch)
    if @teteqami.save
      # አንድ ስኩ ማስቀመጥን አስተናጋጅ
    else
      render 'new'
    end
  end

  private

    def teteqami_negariaseitoch
      params.require(:teteqami).permit(:sim, :emelekt, :password,
                                   :password_confirmation)
    end
end

በነገራችን ላይ፣ በ‘ተጠቃሚ_ነገሪአሴቶች (teteqami_negariaseitoch) ዘዴ ላይ ያለው ተጨማሪ ግምስምስ የትኞቹ ዘዴዎች ከ‘ግል (private) በኋላ እንደተበየኑ በግልጽ ለማሳየት ተብሎ የታቀደ ነው፡፡ (ተሞክሮ የሚያሳየው ይህንን ማድረጉ አንድ ጥሩ ልምድ መሆኑን ነው፤ ብዙ ቁጥር ያላቸው ዘዴዎች ባሉበት ክፍል ውስጥ አንድ የ‘ግል (private) ዘዴን በድንገት የመበየኑ ሁኔታ በጣም የሰፋ ነው፣ ይህም የለለ ነገር ላይ ተዛማጅ ቁሱ በሚጠራበት ጊዜ፣ ከፍተኛ ግራ መጋባትን ያስከትላል፡፡)

በዚህ ጊዜ የመመዝገቢያ ቅጹ እየሰራ ነው፣ ቢያንስ ቢያንስ ምዝገባውን በማስረከብ ላይ “ስህተት አለ” በማለት እንቅፋትን አይፈጥርም ማለት ነው፡፡ በሌላ በኩል ደግሞ በምስል 7.18 ላይ እንደሚታየው፣ ብቁ ባልሆኑ ርክቦች ላይ ምንም አይነት ግብረመልስን አያሳይም (በስተግርጌ በኩል ከሚታየው የማበልጸጊያ አራሚ በስተቀር)፣ ይህም ግራ የሚያጋባ ነው። አንድ አዲስ ተጠቃሚንም አይፈጥርም፡፡ የመጀመሪያውን ችግር በክፍል 7.3.3 ውስጥ ሁለተኛውን ችግር ደግሞ በክፍል 7.4 ውስጥ እናስተካከለዋለን፡፡

images/figures/invalid_submission_no_feedback
ምስል 7.18: የምዝገባ ቅጹ ብቃት ከለለው የመረጃ ርክብ ጋር።

መልመጃዎች

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

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

  1. በአሳሻችሁ ላይ የ /temezgeb?astedadari=1 አድራሻን ጎብኙ እና የ‘አስተዳዳሪ (astedadari) ባሕሪው በእርም መረጃ ሰሚአሴቶቹ (params) ላይ መታየቱን አረጋግጡ፡፡

7.3.3 የምዝገባ ስህተት መልእክቶች

ብቃት ያለው ተጠቃሚን በመፍጠር ላይ፣ ልክ እንደ አንድ የመጨረሻ ሂደት ይሆን ዘንድ፣ ስኬታማ ያልሆነ ምዝገባን የሚከለክሉ ችግሮችን ለማመልከት አጋዥ የሆኑ የስህተት መልእክቶችን እናክላለን፡፡ ሬይልስ በተጠቃሚ ቅርጸት ማስረገጫዎች ላይ በመመርኮዝ እነዚህን መልእክቶች በአመች ሁኔታ በራስሰር ይሰጣል፡፡ ለምሳሌ አንድ ብቁ ባልሆነ የኤመልእክት አድራሻ እና አንድ በጣም አጪር በሆነ መሕለፈቃል አንድ ተጠቃሚን ለማስቀመጥ እንሞክር:-

$ rails console
>> ተጠቃሚ = Teteqami.new(sim: "Beyene Grmayi", emelekt: "beyene@bikuyalhone",
?>                 password: "ሰውየው", password_confirmation: "ሰውየው")
>> ተጠቃሚ.save
=> false
>> ተጠቃሚ.errors.full_messages
=> ["Emelekt is invalid", "Password is too short (minimum is 6 characters)"]

እዚህ ጋር የ‘ስህተቶች.ሙሉ_መልእክቶች (errors.full_messages) ቁሱ (በክፍል 6.2.2 ላይ በግልጽ እንዳየነው) አንድ የስህተት መልእክቶች ድርድርን ይዟል፡፡

ከዚህ በላይ ባለው የሰሌዳ ክፍለ ጊዜ ላይ እንደሚታየው፣ በዝርዝር 7.18 ውስጥ የወደቀው ማስቀመጥ ከ‘@ተጠቃሚ (@teteqami) ቁሱ ጋር የተዛመዱ የስህተት መልእክቶች ዝርዝርን ያመነጫል፡፡ መልእክቶቹን በአሳሹ ላይ ለማሳየት እያንዳንዱ መግቢያ መስክ ላይ በዝርዝር 7.20 ላይ እንደሚታየው፣ ቅጽ-ቁጥጥር (form-control) (በቡትስትራፕ ውስጥ ልዩ ትርጉም ያለውን) የተባለ የቅ.ቋ ክፍልን በማከል በተጠቃሚው አዲስ (new) ገጽ ላይ አንድ የስህተት መልእክቶች ከፊልን እናቀርባለን። ይህ የስህተት መልእክቶች ከፊል አንድ የመጀመሪያ ሙከራን ለማድረግ ብቻ የቀረበ መሆኑን ልትገነዘቡት ይገባል፤ የመጨረሻው ስሪት በክፍል 13.3.2 ውስጥ ይታያል፡፡

ዝርዝር 7.20: በመመዝገቢያ ቅጹ ላይ የስህተት መልእክቶችን ማሳያ ኮድ። app/views/teteqamis/new.html.erb
<% provide(:title, 'ይመዝገቡ') %>
<h1>ይመዝገቡ</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_with(model: @teteqami, local: true) do || %>
      <%= render 'gru/shtet_melektoch' %>
      <%= .label :sim, 'ስም' %>
      <%= .text_field :sim, class: 'form-control' %>
      <%= .label :emelekt, 'ኤመልእክት' %>
      <%= .email_field :emelekt, class: 'form-control' %>
      <%= .label :password, 'መሕለፈቃል' %>
      <%= .password_field :password, class: 'form-control' %>
      <%= .label :password_confirmation, "አረጋግጥ" %>
      <%= .password_field :password_confirmation, class: 'form-control' %>
      <%= .submit "ለኔ መለያ ፍጠር", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>

እዚህ ላይ አንድ ግሩ/ስህተት_መልእክቶች ('gru/shtet_melektoch') የተባለ ከፊልን እንዳቀረብን (render) ልታስተውሉ ይገባል፤ ይህ በተለመደው የሬይልስ መደበኛ አሰራር ውስጥ በትይታዎች ውስጥ በበርካታ መቆጣጠሪያወች ጥቅም ላይ የሚውል አንድ ለከፊል ብቻ የተመደበ ግሩ (gru/) ማውጫን እንደሚጠቀም ያንጸባርቃል። (ይህ ተስፋ፣ በክፍል 10.1.1 ላይ ገሃድ ሲሆን እናየዋለን፡፡)

ይህ ማለት የ‘ማውጫ-ፍጠር (mkdir) ትእዛዝን በመጠቀም አንድ አፕ/ትይታዎች/ግሩ (app/views/gru) የተባለ አንድ አዲስ ማውጫን እና አንድ የስህተት መልእክቶች ከፊልን መፍጠር አለብን ማለት ነው (ሰንጠረዥ 1.1):-

$ mkdir app/views/gru

ከዚያ እንደተለመደው፣ የ‘ንካ (touch) ትእዛዝን ወይም አንድ የጽሑፍ አርታኢን በመጠቀም አንድ _ስህተት-መልእክቶች.ሃጽመቋ.ክሩ (_shtet_melektoch.html.erb) የተባለ የከፊል ፋይልን መፍጠር ይኖርብናል፡፡ የከፊሉ ይዘቶች በዝርዝር 7.21 ውስጥ ይታያሉ፡፡

ዝርዝር 7.21: የቅጽ ርካቦት ስህተት መልዕክቶችን ለማሳየት የሚጠቀም አንድ ከፊል። app/views/gru/_shtet_melektoch.html.erb
<% if @teteqami.errors.any? %>
  <div id="ስህተት_ማብራሪያ">
    <div class="alert alert-danger">
      ቅጹ <%= abza(@teteqami.errors.count, "shtet") %> ስህተት/ቶች ይይዛል።
    </div>
    <ul>
    <% @teteqami.errors.full_messages.each do |melekt| %>
      <li><%= melekt %></li>
    <% end %>
    </ul>
  </div>
<% end %>

ይህ ከፊል ለሬይልስ የስህተት ቁሶች ሁለት ዘዴዎችን ጨምሮ፣ በርካታ አዳዲስ የሬይልስ እና የሩቢ ህንጸቶችን ያስተዋውቃል፡፡ የመጀመሪያው ዘዴ ቁጠር (count) ነው ይህም በቃ ያሉትን የስህተቶች ብዛት በቁጥር ይመልሳል:-

>> teteqami.errors.count
=> 2

ሌላኛው አዲስ ዘዴ ደግሞ ማንኛውም? (any?) ሲሆን፤ ይህም ከየለለነውን? (empty?) ጋር አብሮ ከሚሄዱት ዘዴዎች ውስጥ አንዱ ነው:-

>> teteqami.errors.empty?
=> false
>> teteqami.errors.any?
=> true

እዚህ ጋር የ‘ለለነውን? (empty?) ዘዴን እናያለን፣ መጀመሪያ በክፍል 4.2.2 ውስጥ በሃረጎች አውደ ጥናታችን ላይም አይተነው ነበር፤ ይህ ዘዴ በሬይልስ የስህተት ቁሶች ላይም እንዲሁ ለአንድ ባዶ ቁስ እውነት‘ን (true) ካልሆነ ግን ሃሰት‘ን (false) ይመልሳል። ማንኛውም? (any?) የተባለው ዘዴ የለለነውን? (empty?) ከተባለው ዘዴ ጋር ተቃራኒ ነው፤ የሆነ አባል ካለ እውነት‘ን (true) ሲመልስ ከሌለ ግን ሃሰትን (false) ይመልሳል። (በነገራችን ላይ እነዚህ ሁሉ ዘዴዎች (ቁጠር (count) የለለነውን? (empty?) እና ማንኛውም? (any?)) በሩቢ ድርድሮች ላይም በሚገባ ይሰራሉ፡፡ እኛም ይህንን እውነታ ከክፍል 13.2 ጀምሮ ስራ ላይ እናውለዋለን፡፡)

ሌላኛው አዲስ ዘዴ ደግሞ ካሁን በፊት ልንነጋገርበት ቃል የገባንለት ማለት በዝርዝር 4.2 ውስጥ የፈጠርነው ብጁው አብዛ (abza) የተባለው የጽሑፍ ረጅ ነው፣ እሱንም በሰሌዳው ውስጥ በ‘ረጅ (helper) ቁሱ በኩል ልናገኘው እንችላለን:-

>> helper.abza(1, "shtet")
=> "1 shtet"
>> helper.abza(5, "shtet")
=> "5 shtetoch"

እዚህ ጋር እንደምታዩት አብዛ (abza) አንድ የቁጥር እና አንድ የሃረግ ነጋሪአሴትን ይወስድ እና ከዚያ ቁጥሩን በትክክል ከበዛው ማለት ከሁለተኛው ነጋሪአሴት ውጤት ጋር ይመልሳል። ይህ ዘዴ የአማርኛ ስሞችን ለማብዛት ተብሎ የተበጀ የረጅ ዘዴ ነው፤ የስሙ ቁጥር ብዙ ከሆነ ስሙን ለማብዛት አንድ የሚያደርገው ነገር ቢኖር፣ በተሰጠው ስም ላይ “och” ‘ን መጨመር ብቻ ነው፣ ስለሆነም አንዳንድ ስሞች ትክክለኛውን የስም ብዜት ላይዙ ይችላሉ። ይሁን እንጅ በሬይልስ ውስጥ እኛ የሚስማማንን አይነት ረጅ ማበጀት እንደምንችል ለማሳየት ግን አንድ ጥሩ አጋጣሚን እንዳበረከተልን ሳይጠቀስ ሊታለፍ የሚገባ አይመስለኝም። በአንጻሩ የሬይልስ የ‘አብዛ (pluralize) ረጅ ዘዴ ከስር መሰረቱ መደበኛ ያልሆኑ (irregular plurals) የእንግሊዝኛ ስሞችን (ሰዋሰወችን) ጨምሮ እጅግ በጣም ብዙ ቃላቶችን እንዴት እንደሚያበዛ የሚታወቅ አቻ የሌለው አራቢ (inflector) እንደሆነ ልትገነዘቡ ይገባል:-

>> helper.pluralize(1, "error")
=> "1 error"
>> helper.pluralize(5, "error")
=> "5 errors"
>> helper.pluralize(2, "woman")
=> "2 women"
>> helper.pluralize(3, "erratum")
=> "3 errata"

ይህ ኮድ:-

<%= abza(@teteqami.errors.count, "shtet") %>

አብዛን (abza) በመጠቀሙ ምክንያት እንደ "1 shtet""2 shtetoch" እና ወዘተረፈ የመሳሰሉትን ይመልሳል፣ እንደዚሁም በስህተቶቹ ብዛት ላይ በመመርኮዝ እንደ "1 shtetoch" ያሉ ልክ ያልሆኑ ሃረጎችን ያስወግዳል (ይህ ስህተት (ማለት 1 ስህተቶች) በሁለቱም ማለት በድር እና በዴስክቶፕ አፕልኬሽኖች ላይ የተለመደ እና አሳፋሪ የሆነ ስህተት ነው)።

ዝርዝር 7.21 የስህተት መልእክቶችን ቅጥ ለማድረግ የሚጠቅም አንድ ስህተት_ማብራሪያ የተባለ የቅ.ቋ መታወቂያን እንደሚያክል ልታስተውሉ ይገባል፡፡ (ቅ.ቋ መታወቂያዎችን ቅጥ ለማድረግ የ‘ፓውንድ # ምልክትን እንደሚጠቀም በክፍል 5.1.2 ላይ እንደተማርን አስታውሱ።) በተጨማሪም፣ ከአንድ ብቃት ከሌለው ርክብ በኋላ፣ ሬይልስ ስህተት ያቀፉትን መስኮች በ‘ክፍሊቶች (div) ውስጥ ባለ የ‘ስህተቶች_ያቀፉ_መስኮች (field_with_errors) የቅ.ቋ ክፍል ውስጥ በራስሰር ይጠቀልላቸዋል፡፡ ከዚያም እነዚህ መሰየሚያወች፣ በዝርዝር 7.22 ላይ በሚታየው ዓ.ቆ.ሉ.ቅ፣ የስህተት መልእክቶቹን እንድናስቄጥ ያስችሉናል፣ ይህም ከዚህ በታች እንደምናየው ስህተት-አለው (has-error) የተባለውን የቡትስትራፕ ክፍል አሰራርን ለማካተት የዓ.ቆ.ሉ.ቅ @አራዝም (@extend) ሥልትን ይጠቀማል።

ዝርዝር 7.22: የስህተት መልእክቶችን ቅጥ ለማስያዝ በስራ ላይ የዋለ ቅ.ቋ። app/assets/stylesheets/bju.scss
.
.
.
/* ቅጾች */
.
.
.
#ስህተት_ማብራሪያ {
  color: red;
  ul {
    color: red;
    margin: 0 0 30px 0;
  }
}

.field_with_errors {
  @extend .has-error;
  .form-control {
    color: $state-danger-text;
  }
}

ከሁለቱ ከዝርዝር 7.20 እና ከዝርዝር 7.21 ኮዶች ጋር እና የዝርዝር 7.22 የዓ.ቆ.ሉ.ቅ ኮድ ጋር በምስል 7.19 ላይ እንደሚታየው፣ ብቃት የለለው የመመዝገቢያ መረጃ በሚረከብበት ጊዜ አሁን ቅጹ ጠቃሚ የሆኑ የስህተት መልእክቶችን ያሳያል፡፡ ሃሳባችሁን ቀይራችሁ የኤመልእክት አድራሻወች ቅርጸትን ወይም የመሕለፈቃል ከፍተኛ እርዝመትን ለመቀየር ፈለጋችሁ እንበል፤ በዚህ አጋጣሚ የስህተት መልእክቶቹ በቅርጸት ማስረገጫዎቹ በራስሰር የሚመነጩ ስለሆነ፣ እዛ ላይ የምትፈልጉትን ማስረገጫ ብታደርጉ ለውጡ በራስሰር ይከሰታል ማለት ነው። (ማሳሰቢያ:- ሁለቱም የ‘ኖረ (presence) እና የ‘ጥብቅ_መሕልፈቃል_አለው (has_secure_password) ማስረገጫ ባዶ ምንም (nil) የሆኑ መሕለፈቃሎች ብቃት እንደሌላቸው ለማመልከት አንድ የስህተት መልእክት ሲፈጥሩ የመመዝገቢያ ቅጹ ግን በአሁኑ ጊዜ ተጠቃሚው ባዶ የሆኑ መሕለፈቃሎችን ሲያስረክብ ሁለት የስህተት መልእክቶችን ያሳያል፤ እነዚህ የተደጋገሙ የስህተት መልእክቶችን ለማስወገድ የሆነ ብልሃነትን መፍጠር በቻልን ነበር፣ ነገር ግን እንደ እድል ሆኖ ይህ ጉዳይ በክፍል 10.1.4 ላይ የ‘ምንም_ፈቀዳ፡ እውነት (allow_nil: true) ዘዴን በመጨመር በራስሰር ይስተካከላል።)

images/figures/signup_error_messages
ምስል 7.19: ያልተሳካ ምዝገባ ከስህተት መልእክቶቹ ጋር።

መልመጃዎች

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

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

  1. አነስተኛውን የመሕለፈቃል እርዝመት ወደ 5 በመቀየር፣ የስህተት መልእክቱ እንዲሁ በራስሰር እንደሚዘምን አረጋግጡ።
  2. ባልተረከበው የመመዝገቢያ ቅጽ ላይ የሚታየው ዓ.አ.ሃ.አ (ምስል 7.13)፣ እና በተረከበው የመመዝገቢያ ቅጽ ዓ.አ.ሃ.አ (ምስል 7.19) ላይ ያለው ልዩነት ምንድን ነው?

7.3.4 ብቁ ያልሆነ ግባትን መፈተን።

እንደ ዛሬው ሀይለኛ የራስሰሬ ፈተና ችሎታ ያላቸው የድር መዋቅሮች ከመኖራቸው በፊት በድሮ ጊዜ የድር አበልጻጊወች ቅጾችን በእጅ መፈተሽ ነበረባቸው፡፡ ለምሳሌ በዛን ጊዜ አንድ የመመዝገቢያ ገጽን ለመፈተን ብንፈልግ፣ በአንድ አሳሽ ውስጥ ገጹን መጎብኘት እና ከዚያም ብቁ እና ብቁ ያልሆነ ውሂብን በያንዳንዱ መስክ ውስጥ በማስገባት በሁለቱም ሁኔታ የአፕልኬሽኑ ባህሪ ትክክል መሆኑን ማረጋገጥ ይኖርብናል ማለት ነው፡፡ በተጨማሪም፣ በማንኛውም ጊዜ አፕልኬሽኑ ሲቀያይር ያንኑ የፈተና ሂደት መደጋገም እንዳለብን አሁንም ማስታወስ ሊኖርብን የግድ ነበረ፡፡ ይህ አሰራርም አድካሚና ለስህተት የተጋለጠ ነበረ፡፡

እንደዛ ጊዜ ድካም ለማናየው እድለኞቹ፣ የቅጾች ፈተና ራስሰሬ እንዲሆን ለማድረግ በሬይልስ ፈተናዎችን መጻፍ እንችላለን፡፡ በዚህ ክፍል ውስጥ ብቁ ያልሆነ የቅጽ ማስረከብ ሂደት ላይ፣ የአፕልኬሽኑን ትክክለኛ ባህሪ ለማረጋገጥ አንድ ፈተና እንጽፋለን፤ በክፍል 7.4.4 ውስጥ ደግሞ ለብቁ ርክብ የሚሆን አንድ ተዛማጅ ፈተናን እንጽፋለን።

የመፈተን ስራውን ለመጀመር፣ መጀመሪያ አዲስ ለሚመዘገቡ ተጠቃሚዎች የሚውል አንድ የውህደት ፈተና ፋይልን እንፈጥራለን፣ ፋይሉንም ተጠቃሚዎች_ተመዝገብ (teteqamis_temezgeb) ብለን እንጠራዋለን (አንድ የሃብት ስም የብዙ ቁጥር ስምን ያየዘ መሆን ይገባዋል፣ የሚለውን ደንብ በመከተል የመቆጣጠሪያው ስምም እንደዚያው ተደርጓል)፡-

$ rails generate integration_test teteqamis_temezgeb
      invoke  test_unit
      create    test/integration/teteqamis_temezgeb_test.rb

(በክፍል 7.4.4 ውስጥ አንድ ብቃት ያለው ምዝገባን ለመፈተን ይህንኑ ፋይል መልሰን እንጠቀማለን፡፡)

የፈተናችን ዋና አላማ፣ የተረከበው መረጃ ብቃት በሌለው ጊዜ፣ “ለኔ መለያ ፍጠር” የሚለውን አዝራር ጠቅ ማድረጉ አንድ አዲስ ተጠቃሚን እንደማይፈጥር ማረጋገጥ ነው፡፡ (ለስህተት መልእክቶች አንድ ፈተናን የመጻፉ ጉዳይ እንደ መልመጃ ይሆናችሁ ዘንድ፣ ለናንተ ተትቷል (ክፍል 7.3.4.1)።) ይህንን የምናደርግበት መንገድ ደግሞ የተጠቃሚዎችን የቁጥር ብዛት በመፈተሽ ይሆናል፣ ፈተናዎቻችን ተጠቃሚ‘ን (Teteqami) ጨምሮ በሁሉም ንቅ መዝገብ ክፍል ላይ የሚገኘውን፣ የ‘ቁጠር (count) ዘዴን በስውር ይጠቀማሉ:-

$ rails console
>> Teteqami.count
=> 1

(በክፍል 6.3.4 ውስጥ በተፈጠረው አንድ ተጠቃሚ ምክንያት፣ እዚህ ጋር የ‘ተጠቃሚ.ቁጠር (Teteqami.count) ዋጋው 1 ነው፣ እናንተ በመሃል ላይ የሆነ ተጠቃሚ ካከላችሁ ወይም ከሰረዛችሁ ግን የሚያሳየው የቁጥር ብዛት ሊለያይ ይችላል።) ለወደፊት ይቀያራሉ ተብለው የማይታሰቡትን የሃ.ጽ.መ.ቋ አባላቶችን ብቻ ለመፈተሽ፣ ልክ በክፍል 5.3.4 ውስጥ እንዳየነው የሃ.ጽ.መ.ቋ አባላቶቹን ተገቢ ገጾች ለመፈተን መለያ_አረጋግጥ‘ን (assert_select) እንጠቀማለን።

የ‘አግኝ (get) ዘዴን በመጠቀም የተመዝገብ መንገዱን በመጎብኘት እንጀምራለን:-

get temezgeb_path

የቅጽ ማስረከብን ለመፈተን፣ የተጠቃሚዎች_መንገድ (teteqamis_path) ላይ አንድ የ‘ዓስቀምጥ (POST) መጠይቅን መስጠት አለብን (ሰንጠረዥ 7.1)፣ ይህንንም በ‘አስቀምጥ (post) ሥልት ማከናወን እንችላለን:-

assert_no_difference 'Teteqami.count' do
  post teteqamis_path, params: { teteqami: { sim:  "",
                                     email: "teteqami@invalid",
                                     password:              "Afewerk",
                                     password_confirmation: "Kflom" } }
end

እዚህ በ‘ፍጠር (create) ተግባር ውስጥ በአዲስ.ተጠቃሚ (Teteqami.new) የሚጠበቀውን የተጠቃሚ ሰሚአሴቶች (params[:teteqami]) ተርታን አካተናል (ዝርዝር 7.27)። (ከሬይልስ 5 ስሪት በፊት በነበሩ ስሪቶች ውስጥ የተጠቃሚ (teteqami) ተርታን ወደ ሰሚአሴቶች ተርታ ለማሳለፍ፣ የ‘ሰሚአሴቶች (params) ዘዴን በራስሰር ሳይጠቀሙ ማሳለፍ ይቻል ነበር ማለት የ‘ሰሚአሴቶች (params) ዘዴ ግልጽ አልነበረም። ይህ የአሰራር ስልት ከሬይልስ 5.0 ስሪት ጀምሮ ተቋርጧል (Deprecated)14 እናም አሁን የሚመከረው አሰራር ሙሉውን የ‘ሰሚአሴቶች (params) ተርታ በግልጽ ማካተት ነው፡፡)

አስቀምጥ‘ን (post) የተጠቃሚ ቆጠሪ ('Teteqami.count') የሃረግ ነጋሪአሴትን የያዘ የልዩነት_አለመኖርን_አረጋግጥ (assert_no_difference) ዘዴ መሃል በማሳቀፍ፣ በልዩነት_አለመኖርን_አረጋግጥ (assert_no_difference) ጥምር መሃል ያለው የተጠቃሚ ቁጥር (Teteqami.count) ብዛትን ከጥምሩ በፊት ከነበረው የተጠቃሚ ቁጥር ብዛት ጋር በማነጻጸር እናዘጋጃለን፡፡ ይህ ማለት ተጠቃሚን መመዝገብ፣ ከምዝገባው የተገኙትን የተጠቃሚ ውሂቦች ውሂበጎታው ውስጥ ማስቀመጥ እና የቁጥር ብዛታቸው አንድ መሆኑን ከማረጋገጥ ጋር እኩል የሆነ አባባል ነው:-

ከቆጠራ_በፊት = Teteqami.count
post teteqamis_path, ...
ከቆጠራ_በኋላ  = Teteqami.count
assert_equal ከቆጠራ_በፊት, ከቆጠራ_በኋላ

ምንም እንኳ ከዚህ በላይ መጨረሻው መስመር ላይ ያሉት ሁለቱም ዘዴዎች አንድ ቢሆኑም፤ ልዩነት_አለመኖርን_አረጋግጥ‘ን (assert_no_difference) መጠቀሙ ግን ኮዱን ሩቢ ነክ የአነባበብ ዘይቤ እንዲኖረው እና ጸዳ ያለ ኮድ እንዲሆን ያደርገዋል።

ከዚህ በላይ የ‘አገኝ (get) እና የ‘አስቀመጥ (post) ቅደም ተከተሎች በቴክኒካዊ መልኩ ያልተገናኙ መሆናቸውን ልብ ልትሉ ይገባል፣ እና በተጠቃሚዎች አድረሻ ላይ ከማስቀመጥ በፊት የመመዝገቢያ አድራሻውን ማግኘቱም አስፈላጊ አይደለም፡፡ እኔ ግን ሁኔታወችን ግልጽ ለማድረግ እና የመመዝገቢያ ቅጹ ያለ ምንም ስህተት እንደቀረበ በደንብ ለማረጋገጥ ስል ሁለቱንም ቅደም ተከተሎች ማካተቱን መርጫልሁ።

ከላይ ያሉትን ሃሳቦች አንድ ላይ ማጠመሩ በዝርዝር 7.23 ውስጥ ወዳለው ውጤት ይመራል፡፡ በተጨማሪም አንድ ያልተሳካ ርክብ የአዲስ (new) ተግባርን እንደገና ማቅረቡን ለመፈተሽ፣ አንድ የ‘ዝግጁገጽታ_አረጋግጥ (assert_template) ዘዴ ጥሪን አካተናል፡፡ በቅጹ ላይ የሚታዩ የስህተት መልእክቶችን የመፈተሽ ፈተናወችን ማከሉ እንደ አንድ መልመጃ ይሆናችሁ ዘንድ ለናንተ ተትቷል (ክፍል 7.3.4.1)፡፡

ዝርዝር 7.23: ብቁ ላልሆነ ምዝገባ የሚሆን አንድ ፈተና። አረንጓዴ test/integration/teteqamis_temezgeb_test.rb
require 'test_helper'

class TeteqamisTemezgebTest < ActionDispatch::IntegrationTest

  test "ብቁ ያልሆነ የምዝገባ መረጃ" do
    get temezgeb_path
    assert_no_difference 'Teteqami.count' do
      post teteqamis_path, params: { teteqami: { sim:  "",
                                         emelekt: "teteqamis@invalid",
                                         password:              "Afewerk",
                                         password_confirmation: "Kflom" } }
    end
    assert_template 'teteqamis/new'
  end
end

ከውህደት ፈተናው በፊት የአፕልኬሽንኑን ኮድ ስለጻፍን፣ የፈተና ስብስቡ አረንጓዴመሆን አለበት:-

ዝርዝር 7.24: አረንጓዴ
$ rails test

መልመጃዎች

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

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

  1. ዝርዝር 7.20 ውስጥ ለተሰሩት የስህተት መልእክቶች አንድ ፈተና ጻፉ፡፡ የምትጽፏቸው ፈተናወች ምን ያህል የረቀቁ መሆን እንደሚገባቸው የመወሰኑ ጉዳይ ለናንተ ተትቷል። በዚህ ስራ ላይ ሊያግዛችሁ የሚችል አንድ አብነት በዝርዝር 7.25 ውስጥ ቀርቦላችኋል፡፡
ዝርዝር 7.25: ለስህተት መልዕክቶች ፈተና የቀረበ አንድ አብነት። test/integration/teteqamis_temezgeb_test.rb
require 'test_helper'

class TeteqamisTemezgebTest < ActionDispatch::IntegrationTest

  test "ብቁ ያልሆነ የምዝገባ መረጃ" do
    get temezgeb_path
    assert_no_difference 'Teteqami.count' do
      post teteqamis_path, params: { teteqami: { sim:  "",
                                         emelekt: "teteqamis@invalid",
                                         password:              "Afewerk",
                                         password_confirmation: "Kflom" } }
    end
    assert_template 'teteqamis/new'
    assert_select 'div#<የቅ.ቋ መለያ ለስህተት ማብራሪያ>'
    assert_select 'div.<የቅ.ቋ ክፍል ለመስክ ከስህተት ጋር>'
  end
  .
  .
  .
end

7.4 ስኩ ምዝገባ

ብቃት የሌላቸው የርክቦች ችግርን ከፈታን በኋላ፣ አሁን አንድ አዲስ ተጠቃሚን (ብቁ ከሆነ) ወደ ውሂበጎታው በማስቀመጥ፣ የምዝገባ ቅጹን የምናጠናቅቅበት ጊዜ ነው፡፡ ልክ በምስል 7.20 ላይ እንደሚታየው ስእላዊ መግለጫ፣ በመጀመሪያ ተጠቃሚውን ለማስቀመጥ እንሞክራለን፤ ማስቀመጡ ከተሳካ፣ የተጠቃሚውን መረጃ በራስሰር በውሂበጎታው ውስጥ ይሰፍራል፣ ከዚያ የተጠቃሚውን መገለጫ ለማሳየት አሳሹን (ከወዳጅንት ሰላምታ ጋር) እናዟዙረዋለን (Redirect)። ማስቀመጡ ከተሳካ ደግሞ በቃ በክፍል 7.3 ላይ ወደ በበለጸገው ባህሪ እንመለሳለን።

images/figures/signup_success_mockup_bootstrap
ምስል 7.20: የአንድ የተሳካ ምዝገባ ስእላዊ መግለጫ።

7.4.1 የተጠናቀቀው የመመዝገቢያ ቅጽ

አንድ የሚሰራ የመመዝገቢያ ቅጽን ለማጠናቀቅ በዝርዝር 7.19 ላይ ለሚቀጥለው ጊዜ እንጨርሰዋለን ብለን አስተያየት ያደረግንበትን ክፍል፣ አሁን በሚገባው ባህሪ ማሟላት ይኖርብናል፡፡ የአስረክብ አዝራር ቀለም መቀየሩ እንደሚያመለክተው (ምስል 7.21)፣ ምንም እንኳ ስርዓት-ላይ-ጥገኛ የሆነ ባህሪ ሊሆን ቢችልም፣ ብቁ ለሆነ ርክብ ቅጹ በአሁኑ ጊዜ ይረጋል። ይህ የሆነበት ምክንያት አንድ የሬይልስ ተግባር በነባሪነት አንድ ተዛማጅ የትይታ ገጽን ማቅረብ ስላለበት ሲሆን፤ እናም በአሁኑ ጊዜ ከ‘ፍጠር (create) ተግባር ጋር የተዛመደ አንድ የትይታ ዝግጁገጽታ ስለለለ ነው (ምስል 7.22)።

images/figures/valid_submission_error
ምስል 7.21: በአንድ ብቁ ምዝገባ ርክብ ላይ የረጋ ገጽ።
images/figures/no_create_template_error
ምስል 7.22: የ‘ፍጠር (create) ዝግጁገጽታ ስህተት፣ በአገልጋዩ ዘገባ ውስጥ ሲታይ።

ምንም እንኳን ለ‘ፍጠር (create) ተግባር አንድ ዝግጁገጽታን ማቅረብ ቢቻልም፣ የተለመደው አሰራር ግን የፈጠራው ውጤት ስኬታማ በሚሆንበት ጊዜ ወደ አንድ የተለየ ገጽ ማዟዟር ነው። ወደ ስር መንገዱ ማዟዟሩ የሚሰራ ቢሆንም፣ እኛ ግን የተለመደውን አሰራር በመከተል፣ አዲስ ወደ ተፈጠረው የተጠቃሚ መገለጫ ገጽ እናዟዙረዋለን። የ‘አዟዙር (redirect_to) ዘዴን የሚያስተዋውቀን የአፕልኬሽኑ ኮድ በዝርዝር 7.26 ውስጥ ይታያል።

ዝርዝር 7.26: የተጠቃሚ የ‘ፍጠር (create) ተግባሩ ከአንድ የማስቀመጥ እና ከአንድ የማዟዟር ዘዴ ጋር። app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
  .
  .
  .
  def create
    @teteqami = Teteqami.new(teteqami_negariaseitoch)
    if @teteqami.save
      redirect_to @teteqami
    else
      render 'new'
    end
  end

  private

    def teteqami_negariaseitoch
      params.require(:teteqami).permit(:sim, :emelekt, :password,
                                   :password_confirmation)
    end
end

ይህንን ኮድ መጻፋችንን አስተውሉ:-

redirect_to @teteqami

በሱ ፈንታ ይህን አቻውን መጻፍ በቻልንም ነበር:-

redirect_to teteqami_url(@teteqami)

ይህ የሆነበት ምክንያት ሬይልስ፣ እኛ ከ@ተጠቃሚ አአዟዙር (redirect_to @teteqami) ወደ teteqami_url(@teteqami) ማዟዟር እንደምንፈልግ በተሰጠው ማስረጃ ላይ በመመረኮዝ፣ በራስሰር ስለሚያውቅ ነው፡፡

መልመጃዎች

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

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

  1. ብቃት ያለው መረጃ በሚረከብበት ጊዜ፣ አንድ ተጠቃሚ እንደተፈጠረ የሬይልስ ሰሌዳን በመጠቀም አረጋግጡ፡፡
  2. ብቃት ያለው አንድ ተጠቃሚን ካስረከባችሁ በኋላ፣ በዝርዝር 7.26 ላይ ያለውን፣ የ redirect_to ዘዴን ከ redirect_to @teteqami ወደ redirect_to teteqami_url(@teteqami) በመቀያየር፣ ሁለቱም አንድ ዓይነት ውጤት እንዳላቸው አረጋግጡ፡፡

7.4.2 ብልጪታው

ዝርዝር 7.26 ውስጥ ባለው ኮድ የመመዝገቢያ ቅጻችን በርግጥ እየሰራ ነው፤ ነገር ግን በአንድ አሳሽ ውስጥ አንድ ብቁ ምዝገባን ከማስረከባችን በፊት በድር አፕልኬሽኖች ውስጥ የተለመዱትን ጥቂት ነገሮች እናክላለን፣ ይህም አንድ አዲስ ተጠቃሚ ለአፕልኬሽናችን ሲመዘገብ ወዲያውኑ ወደ አፕልኬሽናችን እንኳን ደህና መጡ የሚል መልእክትን ከቀጣዩ ገጽ ጋር ይዞ የሚመጣ አንድ መልክትን ማከል ሲሆን፣ ገጹ በድጋሜ በሚጫንበት ወይም ተጠቃሚው አንድ ሌላ ገጽን በሚጎበኝበት ጊዜ፣ መልእክቱ እንደሚጠፋ ማድረግ ይሆናል፡፡

በሬይልስ አሰራር ውስጥ አንድ ጊዜያዊ መልእክትን ለማሳየት የምንጠቀምበት አንድ ልዩ ዘዴ ብልጪታ (Flash) ይባላል፣ ይህንንም ልክ እንደ አንድ ተርታ አድርገን ማስተናገድ እንችላለን፡፡ ሬይልስ አንድ የተሳካ ውጤትን ለሚያመለክት አንድ መልእክት አንድ አሳካ (:success) የተባለ ቁልፍን በተለምዶ ስራ ላይ ያውላል (ዝርዝር 7.27)፡፡

ዝርዝር 7.27: በተጠቃሚ መመዝገቢያ ላይ አንድ የብልጪታ መልእክትን ማከል። app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
  .
  .
  .
  def create
    @teteqami = Teteqami.new(teteqami_negariaseitoch)
    if @teteqami.save
      flash[:success] = "እንኳን ወደ ማሳያ አፕልኬሽኑ በደህና መጡ!"
      redirect_to @teteqami
    else
      render 'new'
    end
  end

  private

    def teteqami_negariaseitoch
      params.require(:teteqami).permit(:sim, :emelekt, :password,
                                   :password_confirmation)
    end
end

ለ‘ብልጪታ (flash) መልእክት የሚገባውን አንድ መልእክት ከመመደብ በኋላ፣ አሁን ከመዟዟር በኋላ በመጀመሪያው ገጽ ላይ አንድ መልእክትን የማሳየት ችሎታ ላይ እንገኛለን፡፡ የእኛ ዘዴ በ‘ብልጪታ‘ው (flash) በኩል በመደጋገም ሁሉንም ተዛማጅ መልዕክቶች ወደ ጣቢያው ገጽታ ማስገባት ነው፡፡ ከዚህ ካለንበት ሁኔታ ጋር ለማዛመድ በእቅድ የተሰየመውን የ ብልጪታ ተለዋዋጪን (ዝርዝር 7.28) በመጠቀም በአንድ ተርታ በኩል እንዴት እንደምንደጋግም የተመለከትንበትን የክፍል 4.3.3 የሰሌዳ ምሳሌን ታስታውሱ ይሆናል፡፡

ዝርዝር 7.28: በሰሌዳ ውስጥ በአንድ የ‘ ብልጪታ ድርድር በኩል መደጋገም፡፡
$ rails console
>> ብልጪታ = { ስኬታማ: "ይሰራል!", አደገኛ: "አይሰራም" }
=> {:ስኬታማ=>"ይሰራል!", :አደገኛ=>"አይሰራም"}
>> ብልጪታ.each do |ቁልፍ, ዋጋ|
?>   puts "#{ቁልፍ}"
?>   puts "#{ዋጋ}"
>> end
ስኬታማ
ይሰራል!
አደገኛ
አይሰራም

ይህንን ጥለት በመከተል የብልጪታ ይዘቶችን በመላው ጣቢያ ላይ ለማሳየት በሚከተለው ኮድ ዝግጅት ማድረግ እንችላለን:-

<% flash.each do |yemelekt_aynet, melekt| %>
  <div class="alert alert-<%= yemelekt_aynet %>"><%= melekt %></div>
<% end %>

(ይህ ኮድ እጅግ በጣም አስቀያሚ እና ለማንበብ በጣም አስቸጋሪ ያደረገውን የሃ.ጽ.መ.ቋ እና የክ.ሩ ኮዶችን አደባልቆ ይዟል፡፡ እናም ይሄንን አሳምሮ የመጻፉ ስራ ለናንተ እንደ አንድ መልመጃ ታስቦ ተትቷል (ክፍል 7.4.4.1።) ይህ ክት ሩቢ:-

alert-<%= yemelekt_aynet %>

ከመልእክቱ ዓይነት ጋር የሚዛመድ አንድ የቅ.ቋ ክፍል እንዲኖረው ያደርገዋል፣ ስለዚህ የአንድ ስኩ (:success) መልእክት ክፍል ደግሞ የሚከተለው ኮድ ይሆናል ማለት ነው፡-

alert-success

(አሳካ (:success) የሚለው ቁልፍ አንድ ወካይ ነው፤ ነገር ግን ክቱ የሩቢ ኮድ ወደ ዝግጁገጽታው ውስጥ ከመግባቱ በፊት "success" ወደ ተባለ ሃረግ በራስሰር ይለውጠዋል።) ለእያንዳንዱ ቁልፍ የተለያየ ክፍልን መጠቀሙ፣ ለተለያዩ ዓይነት መልእክቶች የተለያዩ ዓይነት ቅጦችን እንድንተገብር ያስችለናል፡፡ ለምሳሌ በክፍል 8.1.4 ውስጥ አንድ ያልተሳካ የመግባት ሙከራን ለማመላከት አደገኛ ብልጪታን (flash[:danger]) እንጠቀማለን፡፡15 (በርግጥ፣ በዝርዝር 7.21 ውስጥ የስህተት መልእክት ክፍሊቱን ቅጥ ስናስይዝ፣ አንድ ጊዜ ይህን የ‘አደጋ-ማስጠንቀቂያ (alert-danger) ክፍል ተጠቅመን ነበር፡፡) የቡትስትራፕ ቅ.ቋ የግድ አስፈላጊ ለሆኑ አራት የብልጪታ መልእክትቶች ክፍሎችን፣ (የስኬት፣ (success) የ‘መረጃ፣ (info) የ‘ማስጠንቀቂያ (warning) እና የ‘አደጋ (danger)) ቅጥ ማስያዝን ይደግፋል፣ እናም የማሳያ አፕልኬሽኑን በምናበለጽግበት ጊዜ ሁሉንም የምንጠቀምበትን አጋጣሚ እናገኛለን (በክፍል 11.2 ላይ መረጃ‘ን፣ (info) በክፍል 11.3 ላይ ማስጠንቀቂያ‘ን፣ (warning) እና ለመጀመሪያ ጊዜ በክፍል 8.1.4 ላይ አደጋ‘ን (danger) እንመለከታለን)።

መልእክቱ እንዲሁ በዝግጁገጽታው ውስጥ ስለገባ፣ የተሟላው የሃ.ጽ.መ.ቋ ውጤት ለ

flash[:success] = "እንኳን ወደ ማሳያ አፕልኬሽኑ በደህና መጡ!"

እንደሚከተለው ሁኖ ይታያል:-

<div class="alert alert-success">እንኳን ወደ ማሳያ አፕልኬሽኑ በደህና መጡ!</div>

ከላይ የተጠቀሰውን ክት የሩቢ ኮድን በጣቢያው ዝግጁገጽታ ውስጥ ማስገባቱ ዝርዝር 7.29 ውስጥ ወደለው ኮድ ያመራል።

ዝርዝር 7.29: የ‘ብልጪታ (flash) ተለዋዋጩን ይዘቶች በጣቢያው ገጽታ ውስጥ ማከል። app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  .
  .
  .
  <body>
    <%= render 'layouts/rasgie' %>
    <div class="container">
      <% flash.each do |yemelekt_aynet, melekt| %>
        <div class="alert alert-<%= yemelekt_aynet %>"><%= melekt %></div>
      <% end %>
      <%= yield %>
      <%= render 'layouts/grgie' %>
      <%= debug(params) if Rails.env.development? %>
    </div>
    .
    .
    .
  </body>
</html>

መልመጃዎች

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

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

  1. በሬይልስ ሰሌዳ ውስጥ፣ አንድ ጥሬ ወካይ ቁስን ውስጠገምት ለማድረግ (ክፍል 4.2.1)፣ ውስጠገምትን መጠቀም እንደምትችሉ አረጋግጡ፡፡ ለምሳሌ:- ከዚህ "#{:success}" ምላሽ የሚገኘው ውጤት ምንድን ነው?
  2. የላይኛው ጥያቄ ውጤት፣ በዝርዝር 7.28 ላይ ከተመለከተው የብልጪታ ድግግሞሽ ጋር ሲነጻጸር ልዩነቱ ምንድን ነው?

7.4.3 የመጀመርያው ምዝገባ

ለማሳያ አፕልኬሽኑ የመጀመሪያውን ተጠቃሚ በመመዝገብ የዚህን ስራ ውጤት ሁሉ ማየት እንችላለን፡፡ ምንም እንኳን የቀደሙት የቅጽ ምዝገባ ርክቦች በትክክል የማይሰሩ ቢሆኑም፣ (በምስል 7.21 ላይ እንደሚታየው) በተጠቃሚዎች መቆጣጠሪያ ውስጥ ያለው የ‘ ተጠቃሚ.አስቀምጥ (teteqami.save) ኮድ ግን አሁንም ይሰራል፤ ስለሆነም ተጠቃሚዎች እስካሁን በመፈጠር ላይ ሊሆኑ ይችላሉ። እነሱን ለማጽዳት፣ ውሂበጎታውን እንዲህ አድርገን ዳግም እናስጀምረዋለን:-

$ rails db:migrate:reset

ባንዳንድ ስርዓቶች ላይ ያደረጋችኋቸው ለውጦች ተግባር ላይ ይውሉ ዘንድ፣ የድርአገልጋዩን (“ተቆር-ሲን (Ctrl-C)” በመጠቀም) እንደገና ማስጀመር ሊኖርባችሁ ይችል ይሆናል (ሳጥን 1.2)፡፡

ምስል 7.23 ላይ እንደሚታየው፣ ስሙ “Rails Sltena” የተባለ እና የኤመልእክት አድራሻው ደግሞ “misalei@railstutorial.org” የሆነ አንድ የመጀመሪያ ተጠቃሚን እንፈጥራለን፡፡ ውጤቱን ይዞ የሚመጣው ገጽ (ምስል 7.24) ምዝገባው በተሳካ ወቅት፣ አንድ ወዳጃዊ የሆነ የብልጪታ መልእክትን ያሳያል፣ ለ‘ስኬት (success) ክፍሉ የሚያምር አረንጓዴ ቅጥንም አካቷል፣ ይህም ከክፍል 5.1.2 በቡትስትራፕ የቅ.ቋ መዋቅር የተካተተ ነው። ከዚያ የተጠቃሚውን ማሳያ ገጽ እንደገና በመጫን ጊዜ ደግሞ ወትሮ ቃል እንደተገባው፣ የብልጪታ መልእክቱ ይጠፋል (ምስል 7.25) ፡፡

images/figures/first_signup
ምስል 7.23: ለመጀመርያው ምዝገባ የተጠቃሚውን መረጃ በቅጹ ላይ መሙላት።
images/figures/signup_flash
ምስል 7.24: አንድ ስኩ የተጠቃሚ ምዝገባ ውጤት፣ ከብልጪታ መልእክት ጋር።
images/figures/signup_flash_reloaded
ምስል 7.25: አንድ አሳሹ በድጋሜ የተጫነ ብልጪታ አልባ የመገለጫ ገጽ።

መልመጃዎች

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

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

  1. የሬይልስ ሰሌዳን በመጠቀም፣ እንደተጠበቀው አዲሱ ተጠቃሚ መፈጠሩን ዳግም ለማረጋገጥ፣ አዲሱን ተጠቃሚ በኤመልእክት አድራሻው፣ ከውሂበጎታው ፈልጋችሁ አግኙ። የምታገኙት ውጤት ዝርዝር 7.30 ላይ የተመለከተውን ዓይነት መምሰል አለበት፡፡
  2. በራሳችሁ የኤመልእክት አድራሻ አንድ አዲስ ተጠቃሚ ፍጠሩ እና ከዚያ አምሳያችሁ እንደሚገባው መታየቱን አረጋግጡ፡፡
ዝርዝር 7.30: አዲስ የተፈጠረውን ተጠቃሚ ከውሂበጎታው ውስጥ ፈልጎ ማግኘት።
$ rails console
>> Teteqami.find_by(emelekt: "example@railstutorial.org")
=> #<Teteqami id: 1, sim: "Rails Sltena", emelekt: "example@railstutorial.org",
 created_at: "2016-05-31 17:17:33", updated_at: "2016-05-31 17:17:33",
password_digest: "$2a$10$8MaeHdnOhZvMk3GmFdmpPOeG6a7u7/k2Z9TMjOanC9G...">

7.4.4 ለብቁ ርክብ አንድ ፈተና

ከመቀጠላችን በፊት የአፕልኬሽናችንን ባህሪ ለማወቅ እና ምልሰቶችን ለመያዝ፣ ለብቁ ርክብ አንድ ፈተናን እንጽፋለን፡፡ በክፍል 7.3.4 ውስጥ ብቁ ላልሆነ ርክብ እንደተደረገው ፈተና ሁሉ፣ አሁንም የኛ ዋናው አላማችን ውሂበጎታው ውስጥ ያሉትን ይዘቶች ማረጋገጥ ይሆናል፡፡ በዚህ ሁኔታ ላይ፣ ብቁ መረጃ ማስረከብን እንፈልጋለን፣ ከዚያም አንድ ተጠቃሚ መፈጠሩን እናረጋግጣለን፡፡ ይህም ከዝርዝር 7.23 ጋር በተመሳሰለ መልኩ ይህን ይመልሳል፡-

assert_no_difference 'Teteqami.count' do
  post teteqamis_path, ...
end

እዚህ ጋር ተዛማጁን የ‘ልዩነት_አረጋግጥ (assert_difference) ዘዴን እንጠቀማለን፡-

assert_difference 'Teteqami.count', 1 do
  post teteqamis_path, ...
end

ልክ እንደ ልዩነት_አለመኖርን_አረጋግጥ (assert_no_difference) ዘዴው የመጀመሪያው የተጠቃሚ ቆጠሪ ('Teteqami.count') የሃረግ ነጋሪአሴት የ‘ልዩነት_አረጋግጥ (assert_difference) ጥምር መሃል ያለው የተጠቃሚ ቁጥር (Teteqami.count) ብዛት ከጥምሩ በፊት ከነበረው የተጠቃሚ ቁጥር ብዛት ጋር ያለ ንጽጽርን ያዘጋጃል፡፡ ሁለተኛው (ምርጫዊ) ነጋሪአሴት ደግሞ መኖር የሚገባውን የልዩነት መጠን ይገልጻል (በዚህ ጊዜ 1 ነው)።

ልዩነት_አረጋግጥ‘ን (assert_difference) ከዝርዝር 7.23 ውስጥ ካለው ፋይል ጋር በማዋሃድ በዝርዝር 7.31 ውስጥ የሚታየውን ፈተና ያስገኛል፡፡ በተጠቃሚዎች መንገድ ላይ መረጃውን ካስቀመጥን በኋላ የ‘አዟዙር_ተከተል (follow_redirect!) ዘዴን እንደተጠቀምን አስተውሉ። ይህም ከማስረከብ በኋላ ማዟዟርን መከተሉን እንዲሁ ያመቻቻል፣ እንደዛ ስለሆነም አንድ የተጠቃሚዎች ማሳያ ('teteqamis/show') ዝግጁገጽታ እንዲቀርብ አድርጓል፡፡ (እንደ መልመጃ ለተተወው ብልጪታም አንድ ፈተና መጻፉ ተቀባይነት ያለው ጥሩ ሃሳብ ነው (ክፍል 7.4.4.1)፡፡)

ዝርዝር 7.31: ለአንድ ብቁ ምዝገባ አንድ ፈተና። አረንጓዴ test/integration/teteqamis_temezgeb_test.rb
require 'test_helper'

class TeteqamisTemezgebTest < ActionDispatch::IntegrationTest
  .
  .
  .
  test "ብቁ የምዝገባ መረጃ" do
    get temezgeb_path
    assert_difference 'Teteqami.count', 1 do
      post teteqamis_path, params: { teteqami: { sim:  "Abnetawi Teteqami",
                                         emelekt: "teteqami@misalei.com",
                                         password:              "password",
                                         password_confirmation: "password" } }
    end
    follow_redirect!
    assert_template 'teteqamis/show'
  end
end

ዝርዝር 7.31 በተጨማሪ የተሳካውን ምዝገባ ተከትሎ የተጠቃሚ ማሳያ ዝግጁገጽታው መቅረቡን ያረጋግጣል፡፡ ይህ ፈተና እንዲሰራ፣ የተጠቃሚዎች ማዘዋወሪያ (ዝርዝር 7.3)፣ የተጠቃሚዎች የአሳይ (show) ተግባር (ዝርዝር 7.5) እና የ‘አሳይ.ሃጽመቋ.ክሩ (show.html.erb) ትይታ (ዝርዝር 7.8) በትክክል መስራት አለባቸው፡፡ በዚህ ምክንያት ይህ አንድ መስመር ኮድ

assert_template 'teteqamis/show'

ከተጠቃሚ መገለጫ ገጽ ጋር ለሚዛመዱ ነገሮች ሁሉ ላይ ጥንቃቄ የተሞላበት ፈተናን ያደርጋል። የዚህ ዓይነቱ ከጫፍ-እስከ-ጫፍ አስፈላጊ የሆኑ የአፕልኬሽኑ ባህሪዎች ላይ የውህደት ፈተናወችን ማድረጉ ለምን ጠቃሚ እንደሆነ አንድ ምክንያትን ያሳያል፡፡

መልመጃዎች

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

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

  1. ክፍል 7.4.2 ውስጥ ለተተገበረው የብልጪታ ዘዴ አንድ ፈተና ጻፉ፡፡ የምትጽፏቸው ፈተናወች ምን ያህል የረቀቁ መሆን እንደሚገባቸው የመወሰኑ ጉዳይ ለናንተ ተትቷል። ልታደርጉት ይገባል ተብሎ ለተገመተው ፈተና የሚሆን አንድ አብነት፣ በዝርዝር 7.32 ላይ ይህን_ሙሉ የሚል ተለዋዋጪን ይዞ ቀርቦላችኋል። በ ይህን_ሙሉ ተለዋዋጪ ቦታ ላይ ምን ዓይነት ፈተናን መተካት ትመርጣላችሁ? (እንደኔ ከሆነ፣ የብልጪታ መልእክቱ ባዶ አለመሆኑን በሚፈትሽ ፈተና መተካትን እመርጣለሁ።)
  2. ከላይ እንደተጠቀሰው፣ በዝርዝር 7.29 ውስጥ ያለው የብልጪታ ኮድ እንደሚገባው ይስራ እንጅ፣ በሃ.ጽ.መ.ቋው ውስጥ ያለው እይታ በጣም አስቀያሚ ስለሆነ በዝርዝር 7.33 ላይ ያለውን፣ ጸዳ ያለውን፣ ይዘት_መለያ (content_tag) የተባለውን፣ የሬይልስ ረጅ ዘዴን በመጠቀም፣ ኮዱ ካሁን በፊት እንደነበረው እንደሚሰራ፣ የመፈተና ስብስቡን በማስኬድ አረጋግጡ፡፡
  3. ዝርዝር 7.26 ውስጥ የ‘አዟዙር (redirect_to) ዘዴ ላይ አስተያየት አድርጉና ከዚያ ፈተናው እንዳላለፈ አረጋግጡ፡፡
  4. ለምሳሌ:- በዝርዝር 7.26 ውስጥ ያለውን፣ @ተጠቃሚ አስቀምጥ‘ን (@teteqami.save) በ‘ሃሰት (false) ተካነው እንበል፡፡ ልዩነት_አረጋግጥ (assert_difference) ውስጥ ያለው ፈተና እንዴት ላያልፍ ቻለ?
ዝርዝር 7.32: ለብልጪታው መፈተኛ የቀረበ አንድ አብነት። test/integration/teteqamis_temezgeb_test.rb
require 'test_helper'
  .
  .
  .
  test "ብቁ የምዝገባ መረጃ" do
    get temezgeb_path
    assert_difference 'Teteqami.count', 1 do
      post teteqamis_path, params: { teteqami: { sim:  "Abnetawi Teteqami",
                                         emelekt: "teteqami@misalei.com",
                                         password:              "password",
                                         password_confirmation: "password" } }
    end
    follow_redirect!
    assert_template 'teteqamis/show'
    assert_not flash.ይህን_ሙሉ
  end
end
ዝርዝር 7.33: የ‘ብልጪታ (flash) ክ.ሩቢው በጣቢያው ገጽታ ውስጥ የ‘ይዘት_መለያ‘ን (content_tag) በመጠቀም ላይ። app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
    .
    .
    .
    <% flash.each do |yemelekt_aynet, melekt| %>
      <%= content_tag(:div, melekt, class: "alert alert-#{yemelekt_aynet}") %>
    <% end %>
    .
    .
    .
</html>

7.5 ሞያዊ ስምሪት

አሁን አንድ የሚሰራ የምዝገባ ገጽ ስላለን፣ አፕኬሽናችንን የምናሰማራበት እና በምርት ላይ እንዲሰራ የምናደርግበት ጊዜ ነው። በምዕራፍ 3 ላይ አፕልኬሽናችንን ማሰማራት የጀመርን ቢሆንም እንኳን፣ በእርግጥ አፕልኬሽናችን አንድ ነገር ሲያደርግ ይህ የመጀመሪያ ጊዜው ነው፤ ስለሆነም ስምሪቱን ሞያዊ የሆነ ደረጃ ላይ ለማድረስ፣ ይህንን አጋጣሚ እንጠቀማለን፡፡ በተለይ ደግሞ፣ የተጠቃሚዎች የመመዝገቢያ ሂደቱ ጥብቅ እንዲሆን ለማድረግ በምርት አፕልኬሽኑ ላይ አንድ አስፈላጊ የሆነ በይነገጽታን እናክላለን፤ ነባሪውን የድርአገልጋይ በእውነተኛው-ዓለም/በምርት ላይ ለመጠቀም፣ ተስማሚ በሆነ የድርአገልጋይ እንተካ እና የምርት ውሂበጎታው ላይ አንድ የተወሰነ ውቅረትን እናክልበታለን።

ለማሰማራት ትዘጋጁ ዘንድ፣ ለውጦቻችሁን ወደ ዋና‘ው (main) ቅርንጫፍ ማዋሃድ ይኖርባችኋል:-

$ git add -A
$ git commit -m "የተጠቃሚ ምዝገባ ተጨረሰ"
$ git checkout main
$ git merge ምዝገባ

7.5.1 ጥ.መ.ን በምርት ላይ

በዚህ ምዕራፍ የበለጸገውን የምዝገባ ቅጽ ስታስረክቡ፤ ስሙ፣ የኤመልእክት አድራሻው እና መሕለፈቃሉ በአውታረ መረቡ በኩል ይላካሉ፤ እናም በዚህ ምክንያት ሁሉም ውሂቦች ተንኮል አዘል በሆኑ ተጠቃሚዎች ለመጠለፍ የተጋለጡ ናቸው፡፡ ይህ በአፕልኬሽናችን ውስጥ አደገኛ ሊሆን የሚችል አንድ የጥበቃ ጉድለትን ስለሚያስከትል፣ ይህን የጥበቃ ችግር ለማስተካከል መፍትሄው ሁሉንም አስፈላጊ መረጃዎች የሰፈር አሳሹን ለቅው ከመውጣታቸው በፊት ለማመሳጠር ጥብቅ የመሰኪያወች ንጣፍን (ጥ.መ.ን (SSL))16 መጠቀም ነው። ምንም እንኳን ጥ.መ.ንን በመመዝገቢያ ገጹ ላይ ብቻ መጠቀም የምንችል ቢሆንም፣ በተጠቃሚ መግቢያ መጠበቅ ላይም ተጨማሪ ጥቅሞች (ምዕራፍ 8) እና እንዲሁም በክፍል 9.1 ውስጥ እንደተመለከተው፣ አፕልኬሽናችን ላልተጠበቀ የክፍለጊዜ ጠላፋ (Session Hijacking) እንዳይጋለጥ የማድረግ ብቃት ስላለው፣ በመላው ጣቢያ ላይ እንተገብረዋለን፣ በእውነቱ ይህን ማድረጉም እጅግ ቀላል ነው፡፡

ምንም እንኳን ሃረኩ ለሁሉም ግንኙነቶች አሁን ጥ.መ.ንን የሚጠቀም ቢሆንም፤ ለእንዲህ ዓይነቱ ባህሪ በድር አስተናጋጁ ላይ አለመተማመኑ የበለጠ መጠበቅ ነው። በእርግጥ፣ ሃረኩ “ሃ.ጽ.ማ.ስ‘ን http” ለማስተላለፍ “ጥ.ሃ.ጽ.ማ.ስ‘ን https” አልተጠቀመም፣ በነባሪነት ወደአልተጠበቀ ባህሪ ይመራል (ምስል 7.26)።

images/figures/production_no_ssl
ምስል 7.26: የሃረኩ የቀድሞ ባህሪ በምርት ላይ አንድ ያልተጠበቀ የሃ.ጽ.ማ.ስ ዓ.አ.ሃ.አን፣ መጠቀም፡፡

ሁሉንም አሳሾች ጥ.መ.ንን እንዲጠቀሙ በማስገደድ የአፕልኬሽናችንን ጥበቃ እራሳችን መቆጣጠር እንችላለን፤ ይህም የምርት አፕልኬሽኖች የመዋቀርያ ፋይልን ማለት በ‘ምርት.አርቢ (production.rb) ፋይል ውስጥ አንድ የነጠላ መስመር አስተያየትን አስተያየት አልባ የማድረግ ያህል ቀላል ነው። በዝርዝር 7.34 ላይ እንደሚታየው፣ እኛ ማድረግ ያለብን ነገር ቢኖር config.force_ssl ‘ን በ‘እውነት (true) ማዘጋጀት ብቻ ነው።

ዝርዝር 7.34: አፕልኬሽኑ ጥ.መ.ንን በምርት ላይ እንዲጠቀም ማዋቀር። config/environments/production.rb
Rails.application.configure do
  .
  .
  .
  # Force all access to the app over SSL, use Strict-Transport-Security,
  # and use secure cookies.
  config.force_ssl = true
  .
  .
  .
end

በዚህ ወቅት በምርት ላይ ላለው አገልጋይ ጥ.መ.ንን ማዘጋጀት አለብን። አንድ የምርት ጣቢያ ጥ.መ.ንን እንዲጠቀም ማዘጋጀቱ፣ አንድ የጥ.መ.ን ምስክርን (SSL Certificate) መግዛት እና የጥ.መ.ን ምስክሩን በግዝአቱ ላይ ማዋቀርን ያሳትፋል፡፡ ይህም ብዙ ስራ ያስፈልገዋል ማለት ነው፤ ሆኖም ግን እንደ እድል ሆኖ፣ እዚህ ላይ ያንን ችግር መጋፋቱ አስፈላጊ አይደለም። በሃረኩ ግዝአት ስር ለሚሰራ ማንኛውንም አፕልኬሽን (ለምሳሌ የማሳያ አፕልኬሽኑ) ሃረኩ ራሱ አንድ የጥ.መ.ን ምስክርን ስለሚሰጥ፣ እኛም በሃረኩ ጫንቃ ላይ በመውደቅ የሃረኩ የጥ.መ.ን ምስክርን መጠቀም እንችላለን፡፡ በዛ ምክንያትም፣ በክፍል 7.5.2 ውስጥ አፕልኬሽኑን በምናሰማራበት ጊዜ የጥ.መ.ን ምስክሩ ስራውን በራስሰር ይጀምራል፡፡

አስተውሉ:- በአንድ ብጁ ግዝአት ላይ ጥ.መ.ንን ለማስተናገድ ክላውድፍሌርን የምትጠቀሙ ከሆነ፣ (በ በብጁ ግዝአት ላይ መሰረታዊ እውቀትን ለማግኘት የሚያስፈልገውን ተማር ላይ እንደተገለጸው) በሬይልስ አፕልኬሽን ውስጥ ጥ.መ.ንን ማስገደድ አይኖርባችሁም። በምትኩ በምርት.አርቢ (production.rb) ፋይል ውስጥ የ config.force_ssl መስመሩ ላይ አስተያየት ማድረግ ይኖርባችኋል፣ ወይም ደግሞ ልክ እንደ ዝርዝር 7.35 በ‘ሃሰት (false) አዘጋጁት።

ዝርዝር 7.35: አፕልኬሽኑ ጥ.መ.ንን በምርት ላይ እንዳይጠቀም ማዋቀር። config/environments/production.rb
Rails.application.configure do
  .
  .
  .
  # Force all access to the app over SSL, use Strict-Transport-Security,
  # and use secure cookies.
  config.force_ssl = false
  .
  .
  .
end

7.5.2 የምርት ድርአገልጋይ

ጥ.መ.ንን ከጨመርን በኋላ፣ አሁን ለምርት አፕልኬሽኖች የሚስማማ አንድ የድርአገልጋይን ለመጠቀም አፕልኬሽናችንን ማዋቀር አለብን። ሃረኩ አንድ ዌብብሪክ የተባለ በሩቢ የተሰራ ድርአገልጋይን በነባሪነት ይጠቀማል፤ ይህም አፕልኬሽኖችን ለማዘጋጀት እና ለማስኬድ የቀለለ የድርአገልጋይ ሲሆን፣ ብዙ ትራፊክን ለማስተናገድ ግን ጥሩ አይደለም። በዚህ ምክንያት፣ ዌብብሪክ ለምርት አገልግሎት ተስማሚ አይደለም፣ ስለሆነም ዌብብሪክን፣ እጅግ በጣም ብዙ ገቢ መጠይቆችን ማስተናገድ በሚችለው ፑማ በተባለው የሃ.ጽ.ማ.ስ አገልጋይ እንተካዋለን፡፡

አዲሱን የድርአገልጋይ ወደ አፕልኬሽናችን ለማከል፣ በቀላሉ የሃረኩ የፑማ አገልጋይ መረጃ ሰነድን እንከተላለን። የመጀመሪያው ሂደት የ‘ፑማ (puma) እንቁን በእንቁፋይል (Gemfile) ውስጥ ማካተት ሲሆን፣ ነገር ግን ከሬይልስ 5 ጀምሮ ፑማ በነባሪነት የተካተተ ነው (ዝርዝር 3.2)፡፡ ይህ ማለት ያለምንም ጥርጥር ወደ ሁለተኛው ሂደት መዝለል እንችላለን ማለት ነው፤ ይህም የመዋቅር ፋይሉ (config/puma.rb) ነባሪ ይዘቶችን ዝርዝር 7.36 ውስጥ በሚታየው አወቃቀር መተካት ማለት ነው፡፡ በዝርዝር 7.36 ውስጥ ያለው ኮድ ከሃረኩ የመረጃ ሰነድ17 በቀጥታ የመጣ ስለሆነ፣ ኮዱ ምን እና እንዴት እንደሚሰራ መረዳቱ አላስፈላጊ አይደለም (ሳጥን 1.2)፡፡

ዝርዝር 7.36: የምርት ድርድርአገልጋዩ የማዋቀሪያ ፋይል። config/puma.rb
# የፑማ ማዋቀሪያ ፋይል
max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count }
threads min_threads_count, max_threads_count
port        ENV.fetch("PORT") { 3000 }
environment ENV.fetch("RAILS_ENV") { ENV['RACK_ENV'] || "development" }
pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
workers ENV.fetch("WEB_CONCURRENCY") { 2 }
preload_app!
plugin :tmp_restart

ዝርዝር 7.37 ላይ እንደሚታየው፣ ሃረኩ በምርት ውስጥ አንድ የፑማ ሂደትን እንዲያስኬድ ለመንገር፣ አንድ ፕሮክ (Procfile) ተብየ ፋይልን መፍጠር አለብን፡፡ የፕሮክፋይሉ (Procfile) በአፕልኬሽናችሁ ስረ ማውጫ ላይ መፈጠር አለበት፡፡ (ማለትም የ‘እንቁፋይል (Gemfile) ካለበት ማውጫ ጋር አንድ አይነት ማለት ነው፡፡)

ዝርዝር 7.37: አንድ የ‘ፕሮክፋይልን (Procfile) ለፑማ መበየን። ./Procfile
web: bundle exec puma -C config/puma.rb

7.5.3 የምርት ውሂበጎታን ማዋቀር

በእኛ የምርት ስምሪት ላይ የመጨረሻው ሂደት የምርት ውሂበጎታን በትክክል ማዋቀር ነው፤ ይህም (በክፍል 2.3.5 ላይ በአጪሩ እንደተገለጸው) ፖስትግሬስተ.መ.ቋ ነው፡፡ እኔ ባደረኩት ሙከራ መሰረት ፖስትግሬስተ.መ.ቋ ያለምንም ማዋቀር በሃረኩ ላይ እንደሚሰራ ያሳያል፣ ነገር ግን ይፋው የሃረኩ የመረጃ ሰነድ በግልጽ መዋቀር እንደሚኖርበት ያሳስባል፣ ስለሆነም ለጥንቃቄ ሲባል የነሱን ምክር በመስማት እነሱ ባሉት መሰረት እናዋቅረዋለን፡፡

በርግጥ ትክክለኛው ለውጥ ቀላል ነው፤ ማድረግ ያለብን ነገር ቢኖር የውሂበጎታው የውቅረት ፋይል (config/database.yml) ውስጥ የሚገኘውን የ‘ምርት (production) ክፍልን ማዘመን ብቻ ነው። የሃረኩ መረጃ ሰነድን ተጠቅሜ ያሻሻልኩት ውጤት በዝርዝር 7.38 ውስጥ ይታያል፡፡

ዝርዝር 7.38: ውሂበጎታውን ለምርት ማዋቀር። config/database.yml
# SQLite version 3.x
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
#
default: &default
  adapter: sqlite3
  pool: 5
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: db/test.sqlite3

production:
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  database: masaya_production
  username: masaya
  password: <%= ENV['MASAYA_DATABASE_PASSWORD'] %>

7.5.4 በምርት ላይ ማሰማራት

የምርት ድርአገልጋዩን እና የውሂበጎታውን አዋቅሮ ከመጨረስ በኋላ፤ አሁን ለማቀላቀል እና ለማሰማራት18 ዝግጁ ነን:-

$ rails test
$ git add -A
$ git commit -m "በምርት ላይ ጥ.መ.ን እና የፑማ ድርአገልጋይን መጠቀም"
$ git push && git push heroku
$ heroku run rails db:migrate

ክፍል 7.4.3 ውስጥ፣ በማበልጸጊያ ውሂበጎታው ላይ እንዳደረግነው ሁሉ፣ የምርት ውሂበጎታውንም እንዲሁ እንደገና ማስጀመር እንችላለን (ይህንን በአንድ እውነተኛ/የምርት አፕልኬሽን ውሂበጎታ ላይ በጪራሽ አታድርጉ!):-

$ heroku pg:reset DATABASE
$ heroku run rails db:migrate

የመመዝገቢያ ቅጹ አሁን በቀጥታ እየሰራ ነው፣ አንድ የተሳካ የምዝገባ ውጤትም በምስል 7.27 ውስጥ ይታያል። በምስል 7.27ላይ በአድራሻ አሞሌው ውስጥ አንድ የቁልፍ አዶ የመኖሩ ውጤት ጥ.መ.ን እየሰራ መሆኑን እንደሚያመለክት አስተውሉ።

images/figures/signup_in_production
ምስል 7.27: በቀጥታ ድር ላይ መመዝገብ።

የሩቢ ስሪት ቁጥር

ወደ ሃረኩ በምታሰማሩበት ወቅት፣ ይህንን የመሰለ አንድ የማሰጠንቀቂያ መልእክት ልታገኙ ትችሉ ይሆናል:-

###### WARNING:
       You have not declared a Ruby version in your Gemfile.
       To set your Ruby version add this line to your Gemfile:
       ruby '2.6.3'

ተሞክሮ እንደሚያሳየው፣ በዚህ ስልጠና ደረጃ ላይ እንደዚህ አይነቱን፣ ማለት አንድ የሩቢ ስሪት ቁጥርን ገልጾ ማካተቱ ከሚሰጠው ጥቅም በላይ መጠየቅ ይሆናል፤ ስለሆነም ይህንን ማስጠንቀቂያ ለአሁኑ ችላ ብላችሁ ማለፍ ይኖርባችኋል፡፡ ዋናው ጉዳይ የማሳያ አፕልኬሽናችሁን እና ስርዓታችሁን ከአዲሱ የሩቢ ስሪት ጋር እንዲመሳሰሉ ማድረጉ አንድ ትልቅ ችግር19 ሊሆን ቢችልም፤ የትኛውንም ትክክለኛ የሩቢ ስሪት ቁጥር ብትጠቀሙ መቼም ቢሆን አንድ ልዩነት አያመጣም። የሆነ ሆኖ፣ በሃረኩ ላይ አንድ አስፈላጊ የሆነ አፕልኬሽንን የምታስኬዱ ከሆነ፣ በማበልጸጊያ እና በምርት አካባቢወች መካከል ያለውን የሩቢ ስሪት አንድ ዓይነት ለማድረግ እና ሁሉንም አካባቢወች በከፍተኛ ደረጃ የሚጣጣሙ መሆናቸውን ለማረጋገጥ በ‘እንቁፋይል (Gemfile) ውስጥ የሚፈለገውን ትክክለኛ የሩቢ ስሪት በግልጽ ማስቀመጡ አስፈላጊ ይሆናል፡፡

መልመጃዎች

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

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

  1. የጥ.መ.ን የቁልፍ አዶ እና ጥ.ሃ.ጽ.ማ.ስ (https) የሚለው ጽሑፍ በአሳሻችሁ የአድራሻ ማስገቢያ ላይ እንደሚታይ አረጋግጡ፡፡
  2. የራሳችሁን የኤመልእክት አድራሻ በመጠቀም፣ በምርት ጣቢያው ላይ አንድ ተጠቃሚ ፍጠሩ። አምሳያችሁ በትክክል ይታያልን?

7.6 ማጠቃለያ

ተጠቃሚዎችን መመዝገብ ማስቻሉ ለአፕልኬሽናችን አንድ ትልቅ ምዕራፍ ነው። የማሳያ አፕልኬሽኑ አሁን ባለበት ደረጃ ላይ ምንም ጠቃሚ የሆነ ነገርን ማከናወን ባይችልም፣ ወደፊት ለምናከናውናቸው የብልጽግና ገጸባህርያት ሁሉ ግን አንድ አስፈላጊ መሰረትን ጥለንበታል፡፡ በምዕራፍ 8 እና በምዕራፍ 9 ላይ ተጠቃሚዎችን ወደ ድሩ እንዲገቡ እና እንዲወጡ በመፍቀድ የማረጋገጥ ፋብሪካችንን (ከ “zekreng” ምርጫዊ ትግበራ ጋር) እናጠናቅቃለን፡፡ በምዕራፍ 10 ላይ ሁሉም ተጠቃሚዎች የመለያ መረጃቸውን እንዲያዘምኑ እንፈቅዳለን፣ በዚህም የጣቢያው አስተዳዳሪዎች ተጠቃሚዎችን እንዲሰርዙ ስልጣን በመስጠት ሰንጠረዥ 7.1 ላይ የተመለከተውን የተሟላ የተጠቃሚዎች ሃብት ው.ሁ.ማ ተግባሮች ስብስብን እናጠናቅቃለን።

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

  • ሬይልስ በ‘አርም (debug) ዘዴ በኩል ጠቃሚ የአርም መረጃን እንደሚያሳይ፣
  • የአ.ቆ.ሉ.ቅ ውስጠድብልቆች የቅ.ቋ ደንቦች በአንድ ስብስብ እንዲጠቃለሉ እና በተለያዩ ቦታዎች ደንቦቹን በድጋሜ እንድንጠቀምባቸው ዘንድ እድል እንደሚሰጡን፣
  • ሬይልስ ከሶስት መደበኛ አካባቢወች ማለት ከ‘ማበልጸጊያ፣ (development) ከ‘ፈተና (test) እና ከ‘ምርት (production) ማበልጸጊያወች ጋር እንደሚመጣ፣
  • በአንድ መደበኛ የው.ሁ.ማ ዓ.አ.ሃ.አወች ስብስብ በኩል፣ ከተጠቃሚዎች ጋር ልክ እንደ አንድ ሃብት (resource) መስተጋብር ማድረግ እንደምንችል፣
  • አምሳያ ተጠቃሚውን ወክሎ የተጠቃሚውን ምስል ለማሳየት አንድ ተስማሚ መንገድን እንደሚያቀርብ፣
  • የ‘ቅጽ_ጋር (form_with) ረጅው ከንቅ መዝገብ ቁሶች ጋር ለመግባባት ቅጾችን ለማመንጨት እንደሚያገለግል፣
  • የምዝገባ አለመሳካት የአንድ አዲስ ተጠቃሚ ገጽን እና በንቅ መዝገብ ውሳኔ የተሰጡ የስህተት መልእክቶችን በራስሰር እንደሚያቀርብ፤
  • ሬይልስ ጊዜያዊ መልዕክቶችን ለማሳየት ብልጪታ‘ን (flash) እንደ አንድ መደበኛ መንገድ አድርጎ እንደሚያቀርብ፣
  • አንድ የተሳካ የምዝገባ ሂደት፣ በውሂበጎታው ውስጥ አንድ ተጠቃሚ እንደሚፈጥር እና ተጠቃሚውን ወደ ተጠቃሚው ማሳያ ገጽ በማዘዋወር አንድ የእንኳን ደህና መጡ መልእክትን እንደሚያሳይ፣
  • የቅጽ ርክብ ባህሪን ለማረጋገጥ እና ምልሰቶችን ለመያዝ የውህደት ፈተናዎችን መጠቀም እንደምንችል እና
  • የምርት አፕልኬሽናችንን ለጥብቅ ግንኙነቶች ጥ.መ.ንን፤ ለከፍተኛ ቅልጥፍና ደግሞ ፑማን ማዋቀር እንደምንችል ተምረናል።
1. ማኪንግበርድ ላይ በምስል 7.1 ላይ እንደሚታየው ዓይነት በልኩ የተዘጋጀ የመገለጫ ፎቶግራፎችን መስራት አይቻልም፡፡ ስልዚህ እኔ የመገለጫውን ፎቶ ጊምፕ የተባለ የነጻ የስእል አርታኢን በመጠቀም የምታዩት ፍጻሜ ላይ እንዲደርስ አብቅቸዋለሁ።
2. ምስሉ በ 2014-06-16 ከ https://www.flickr.com/photos/43803060@N00/24308857/ የተወሰደ ነው፡፡ በሹዋን ዎሊን የ 2003 የቅጂ መብት © እና የጋራ የፈጠራ አጠቃላይ ዋለዮ 2.0 ፈቃድ መሰረት ስእሉ ላይ ለውጥ አልተደረገም።
3. ልባችሁ የፈቀደውን አካባቢ መበየንም ትችላላችሁ፤ እንዴት እንደዛ እንደምታደርጉ በበለጠ ለማወቅ እዚህ ድረገጽ ላይ ጠቅ ማድረግ ትችላላችሁ፡፡
4. የሬይልስ የማረም መረጃ ገጽታ ከስሪት ስሪት የተለያየ ነው። ለምሳሌ ከሬይልስ 5 ጀምሮ የአርም መረጃው፣ የ‘ተፈቀደ‘ውን (permitted) የመረጃ ሁኔታ ያሳያል፤ ይህንንም በክፍል 7.3.2 ላይ እንመለከታዋለን፡፡ እንደዚህ የመሳሰሉትን ጥቃቅን ልዩነቶች ለመፍታት የናንተን ቴክኒካዊ ብልሃት ተጠቀሙ (ሳጥን 1.2)።
5. የሬይልስ የ‘አርም (debug) መረጃ እንደ ያምል (YAML) ሁኖ ይታያል፣ ይህም በመሳሪያዎች እና በሰዎች ዘንድ ሊነበብ እንደሚችል ተደርጎ የተቀናጀ የውሂብ ቅርጸት ነው፣ (የያምል የቃል መነሻ ስብስብ በቀጥታ ሲተነተን “ያምል የመንቀሻ ቋንቋ አይደለም (YAML Ain’t Markup Language)” ነው)።
6. ይህ ማለት ማዘዋወርያው ይሰራል ማለት ነው፤ ነገር ግን ተጓዳኝ ገጾቹ በዚህ ጊዜ አይሰሩም፡፡ ለምሳሌ /ተጠቃሚወች/1/አርትዕ (/teteqamis/1/edit) ወደ ተጠቃሚ መቆጣጠሪያ አርትዕ (edit) ተግባር ይወስዳል፤ ነገር ግን አሁን የአርትዕ (edit) ተግባር በፍጹም የለም፤ እናም የለለውን የአርትዕ (edit) ተግባር ዓ.አ.ሃ.አን ስለሚከተል ስህተትን ያመጣል፡፡
7. ይህንን የነካ ትእዛዝ በመጠቀም touch app/views/teteqamis/show.html.erb ፋይሉን መፍጠር ትችላላችሁ።
8. በሂንዱይዝም ውስጥ አምሳያ (አቫታር) ማለት በሰው ወይም በእንስሳት መልክ የአማልእክት ምስልን ተክቶ የሚያሳይ ክስተት ማለት ነው፡፡ ለዚህም ነው አቫታር የሚለው ቃል ብዙውን ጊዜ በአካል ሳይገኙ በአካል የመኖር ውክልናን ለማመልከት ሲያገለግል የሚታየው፣ በተለይም ምናባዊ በሆነ ሁኔታ ላይ ሲያገለግል ይታያል፡፡ (በትዊተር እና በሌሎች ማህበራዊ የመገናኛ አውዶች ውስጥ ኤቪአይ avi የሚለው ቃል በጣም ታዋቂ የሆነ ቃል እየሆነ መጥቷል። ይህም ምናልባት አቫታር የሚለውን ቃል ወደ ኤቪአይ (avi) የሚቀይር ይሆናል፡፡)
9. በቴክኒካዊ መልኩ ሲታይ የመሕለፈቃል ማረጋገጫ እዚህ ላይ አስፈላጊ አይሆንም፣ ምክንያቱም የ‘ጥብቅ_መሕልፈቃል_አለው (has_secure_password) (ክፍል 6.3.1) ማረጋገጫው በቀጥታ ምንም (nil) እንዲሆን ስለሚያስችለው ነው። እንደዚህ የሆነበት ትልቁ ምክንያት ደግሞ አንዳንድ የመሕለፈቃል ማረጋገጫ የማያስፈልጋቸው አፕልኬሽኖች በቀላሉ የመሕለፈቃል ማረጋገጫ መስኩን መተው እንዲችሉ ለማድረግ ተብሎ ነው፡፡ ይህ በእንዲህ እንዳለ የኛ አፕልኬሽን የመሕለፈቃል ማረጋገጫ ያስፈልገዋል ስለዚህ ይህንኑ መስክ በዝርዝር 7.15 ውስጥ እናካትተዋለን፡፡
10. ዝርዝር 7.11ምዕራፍ 10 ውስጥ ተግባር ላይ የምናውለውን .አምሳያ_እርምት የተባለ ክፍልን አክሏል፡፡
11. ይህ እንዴት እንደሚሰራ በጥልቅ ለመረዳት ከፈለጋችሁ ይህንን ገጽ መጎብኘት ትችላላችሁ፡፡
12. ነባር (Legacy) ማለት:- አንድ ጊዜው ያለፈበት ወይም የተበላሸ የሶፍትዌር ፕሮግራም ማለት ነው።
13. አንድ ችግርን ለመቋቋም በሌላ ዘዴ ውስጥ የሚበየን አንድ ዘዴ ማለት ነው።
14. የተቋረጠ (Deprecated):- ማለት አንድ ገጸባህሪ፣ ንድፉ ወይም አሰራሩ ለወደፊቱ ሙሉ በሙሉ ይወገዳል፣ ተወግዷል ወይም ሊወገድ ታስቧል ማለት ነው። ስለዚህ እዚህ ላይ ይህ ዘዴ በዛ ስሪት ላይ እንደተወገደ ያመለክታል ማለት ነው።
15. በእርግጥ የምንፈልግበት ጊዜ ላይ ስንደርስ በጣም ተዛማጅ የሆነውን የ‘አሁን.ብልጪታ (flash.now) ዘዴን እንጠቀማለን፣ ላሁኑ ግን ጊዜው ስላልሆነ ይህንን ዘዴ ተግባራዊ አናደርገውም።
16. በቴክኒካዊ ጥ.መ.ን አሁን መ.ጥ.ን ነው፣ የመጓጓዥያ ጥብቅ ንጣፍ (መ.ጥ.ን) (Transpport layer security TLS) ነው፤ ነገር ግን እኔ የማውቃቸው ሰወች በሚሉ “SSL” ብለው ይጠሩታል።
17.ዝርዝር 7.36 ኮድ፣ በመደብ በአንድ መስመር ላይ 80 ሆሄወችን ብቻ እንዲይዝ ስለተደረገ ቅርጸቱ በትንሹ ለየት ያለ ሁኖ ይታያል፡፡
18. በዚህ ምዕራፍ ውስጥ የውሂብ ቅዱን አልቀየርነውም ስለዚህም በሃረኩ ላይ ፍልሰትን ማስኬድ አስፈላጊ አይሆንም፤ ነገር ግን ይህ የማያስፈልገው በክፍል 6.4 ውስጥ ያሉትን ቅደም ተከተሎች ከተከተላችሁ ብቻ ነው፡፡ ብዙ የመጽሐፉ አንባቢያን በዚህ ነገር ላይ ስህተት አጋጠመን እያሉ እሮሮ ስላሰሙ ለማንኛውም ደህንነቱ የተጠበቀ ሂደት ይሆን ዘንድ ይህንን ትእዛዝ:- ሃረኩ ሬይልስ ውጎ፡አፍልስን አስኪድ (heroku run rails db:migrate) የመጨረሻ ሂደት እንዲሆን እዚህ ጋር ጨምሬዋለሁ፡፡
19. በአንድ ወቅት ሃረኩ የሬይልስ አፕልኬሽንን በሃረኩ ላይ ለማሰማራት፣ የሩቢ ስሪት ቁጥር 2.1.4 ‘ን ይጠይቅ ነበር፤ እኔም ያንኑ ግዴታ ለማሟላት ብዙ ሰዓታት ካሳለፍኩኝ በኋላ በነገታው የሩቢ ስሪቱ ተቀይሮ 2.1.5 ሁኖ ተሰራጨ። (የሚያሳዝነው ነገር የሩቢ 2.1.5 ስሪትን የመጫን ትግሌም ያለ ድል መቋጨቱ ነው።)