ምዕራፍ 12 መሕለፈቃልን ዳግም ማስጀመር

የመለያ ማግበሪያውን በምዕራፍ 11 ላይ ካጠናቀቅን በኋላ (በዛም የተጠቃሚውን የኤመልእክት አድራሻ በማረጋገጥ)፣ አሁን የመሕለፈቃል ዳግም ማስጀመርያን ለመተግበር አንድ ጥሩ አቋም ላይ እንገኛለን፣1 እና በዚህም የመሕለፈቃላቸውን ለሚረሱ ተጠቃሚዎች የተለመዱ ጉዳዮችን እናስተናግዳለን፡፡ ከዚህ በኋላ እንደምናየው፣ አብዛኞቹ ሂደቶች፣ በመለያ ማግበሪያ ላይ የተጠቀምንባቸው ሂደቶች ጋር ተመሳሳይ ስልሆኑ፣ በክፍል 11 ውስጥ የቀሰምናቸው እውቀቶችን እንደገና ለመጠቀም በርካታ እድሎች ይኖሩናል፡፡ ምንም እንኳን የመለያ ማግበሪያው ጋር ተመሳሳይ ቢሆንም፣ አጀማመሩ ግን ከሱ ይለያያል፤ (የኤመልእክትን እና አዲስ የመሕለፈቃል ማስረከቢያን ለማስተናገድ) የመሕለፈቃል ዳግም ማስጀመርያን ለመተግበር አንዱ ቅጽ ላይ የትይታ ለውጥ እና ሁለት አዲስ ቅጾችን ይፈልጋል።

ለመሕለፈቃል ዳግም ማስጀመርያው፣ አንድም ኮድ ከመጻፋችን በፊት እስኪ የምንጠብቀውን ውጤት በቅደም ተከተል በስእላዊ መግለጫ መልኩ እንመልከት። የማሳያ አፕልኬሽኑ የመግቢያ ቅጽ ላይ አንድ “መሕለፈቃልወን ረሱ” የተባለ አገናኝን በማከል እንጀምራለን (ምስል 12.1)። የ “መሕለፈቃልወን ረሱ” አገናኙ አንድ ቅጽ ይዞ ወደ አንድ ገጽ በመሄድ አንድ የኤመልእክት አድራሻን ይወስድ እና አንድ የመሕለፈቃል ዳግም ማስጀመሪያ አገናኝን ይልካል (ምስል 12.2)። የዳግም ማስጀመሪያ አገናኙ በምስል 12.3 ላይ እንደሚታየው፣ የተጠቃሚውን የመሕለፈቃል (ከማረጋገጫ ጋር) ዳግም ለማስጀመር አንድ ቅጽን ያመጣል፡፡

images/figures/login_forgot_password_mockup
ምስል 12.1: አንድ የ “መሕለፈቃልወን ረሱ” አገናኝ ስእላዊ መግለጫ።
images/figures/forgot_password_form_mockup
ምስል 12.2: አንድ የ “መሕለፈቃልወን ረሱ” ቅጽ ስእላዊ መግለጫ።
images/figures/reset_password_form_mockup
ምስል 12.3: አንድ የመሕለፈቃል ዳግም ማስጀመሪያ ቅጽ ስእላዊ መግለጫ።

ምዕራፍ 11 ‘ን ተከታትላችሁ ከሆነ፣ በክፍል 11.2 (ዝርዝር 11.6) ላይ የተፈጠረ አንድ የመሕለፈቃል ዳግም ማስጀመርያ መላኪያ ከድሮው አላችሁ ማለት ነው፡፡ በዚህ ክፍል ውስጥ ከመላኪያው ጋር አብሮ ለሚሄደው የመሕለፈቃል ዳግም ማስጀመሪያ (ክፍል 12.1) አንድ ሀብትን እና አንድ የውሂብ ቅድን በማከል አስፈላጊውን ቅድመ ዝግጅት እናጠናቅቃለን። ትክክለኛውን የመሕለፈቃል ዳግም ማስጀመርያ በክፍል 12.3 ውስጥ እንተገብራለን፡፡

ከመለያ ማግበሪያዎች ጋር በተመሳሰለ መልኩ አጠቃላይ እቅዳችን፣ አንድ የመሕለፈቃል ዳግም ማስጀመሪያ ሃብትን ማድረግ ነው። እያንዳንዱ የመሕለፈቃል ዳግም ማስጀመርያ አንድ ዳግመማስጀመሪያ ይስሙላ እና አንድ ተዛማጅ የዳግመማስጀመሪያ ፍጪን ያካትታል፡፡ የትግበራው ዋናው ቅደም ተከተል እንደሚከተለው ይሆናል:-

  1. አንድ ተጠቃሚ አንድ የመሕለፈቃል ዳግም ማስጀመርያን ሲጠይቅ፣ ተጠቃሚውን ባስረከበው የኤመልእክት አድራሻ መሰረት መፈለግ፣
  2. የኤመልእክት አድራሻው በውሂበጎታው ውስጥ ከኖረ፣ አንድ ዳግመማስጀመሪያ ይስሙላን እና አንድ ተዛማጅ የዳግመማስጀመሪያ ፍጪን ማመንጨት፣
  3. የዳግመማስጀመሪያ ፍጪውን በውሂበጎታው ውስጥ ማስቀመጥ እና ከዚያ አንድ የዳግመማስጀመሪያ ይስሙላውን እና የተጠቃሚውን የኤመልእክት አድራሻ የያዘ አንድ አገናኝን ለተጠቃሚው መላክ፣
  4. ተጠቃሚው አገናኙን ጠቅ በሚያደርግበት ጊዜ፣ ተጠቃሚውን በኤመልእክት አድራሻው መሰረት ፈልጎ ማግኘት እና ከዚያ ይስሙላውን ከዳግመማስጀመሪያ ፍጪው ጋር በማወዳደር ማረጋገጥ እና፣
  5. ከተረጋገጠ፣ ተጠቃሚው መሕለፈቃሉን ይለውጥ ዘንድ፣ ቅጹን ለተጠቃሚው ማቅረብ ይሆናሉ።

12.1 የመሕለፈቃል ዳግም ማስጀመርያወች ሃብት

የመሕለፈቃል ዳግም ማስጀመርያዎቹ፣ ልክ እንደ ክፍለጊዜወች (ክፍል 8.1) እና የመለያ ማግበሪያዎች (ምዕራፍ 11) ከንቅ መዝገብ ቅርጸት ጋር የሚዛመዱ ባይሆንም፣ ልክ እንደ አንድ ሃብት አድርገን እንቀርጻቸዋለን፡፡ እናም ተገቢዎቹን ውሂቦች (የዳግመማስጀመሪያ ይስሙላውንም ጨምሮ) በተጠቃሚ ቅርጸቱ ውስጥ እናካትታቸዋለን።

የመሕለፈቃል ዳግም ማስጀመርያዎችን ልክ እንደ አንድ ሃብት አድርገን ስለምንቆጥራቸው፣ ከእነሱ ጋር በመደበኛ ው.ሁ.ማ ዓ.አ.ሃ.አወች በኩል እንገኛለን። የ‘አርትዕ (edit) ተግባር ብቻ ከሚያስፈልገው ከማግበሪያ አገናኝ በተለየ መልኩ፣ በዚህ ጊዜ የመሕለፈቃል ዳግም ማስጀመርያን ለማንቀሳቀስ፣ እንዲሁም እነሱን ለመፍጠር እና ለማዘመን ሁለቱንም ማለት የ‘አዲስ (new) እና የ‘አርትዕ (edit) ቅጾችን እናቀርባለን፣ ስለሆነም በድምሩ አራቱንም የሙሉው.ሁ.ማ ማዘዋወሪያወችን እንጠቀማለን።

እንደተለመደው፣ ለአዲሱ ገጸባህሪ አንድ የርእስ ቅርንጫፍ እናደርጋለን:-

$ git checkout -b መሕለፈቃልን-ዳግም-ማስጀመር

12.1.1 የመሕለፈቃል ዳግም ማስጀመርያወች መቆጣጠሪያ

የመጀመሪያው ሂደታችን ለመሕለፈቃል ዳግም ማስጀመርያ ሃብቱ አንድ መቆጣጠሪያን ማመንጨት ነው፣ ከዚህ በላይ እንደተወያየነው፣ ሁለቱንም የ‘አዲስ (new) እና የ‘አርትዕ (edit) ተግባሮችን መስራት ነው:-

$ rails generate controller MedaMasjemers new edit --no-test-framework

እዚህ ላይ የፈተናወች መመንጨትን ለማምለጥ አንድ ባንዲራን እንዳካተትን ልብ በሉ። ይህ የሆነበት ምክንያት፣ የመቆጣጠሪያ ፈተናወችን ስለማንፈልግ እና በዚህ ፈንታ ፈተናውን በክፍል 11.3.3 ላይ ባለው የውህደት ፈተና ላይ ቀጥለን መገንባት ስለምንችል ነው።

አዲስ የመሕለፈቃል ዳግም ማስጀመርያውን ለመፍጠር (ምስል 12.2) እና በተጠቃሚ ቅርጸቱ (ምስል 12.3) ውስጥ መሕለፈቃሉን በመለወጥ እነሱን ለማዘመን፣ ሁለት ቅጾች እና እንዲሁም፣ ለአዲስ (new) ፣ ለ‘ፍጠር (create) ፣ ለ‘አርትዕ (edit) እና ለ‘አዘምን (update) የሚያገለግሉ ማዘዋወሪያወች ያስፈልጉናል፡፡ በዝርዝር 12.1 ላይ በሚታየው የ‘ሃብቶች (resources) ዘዴ ይህንን ማዘጋጀት እንችላለን:-

ዝርዝር 12.1: ለመሕለፈቃል ዳግም ማስጀመርያ አንድ ሃብትን ማከል። 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'
  get    '/gba',        to: 'sessions#new'
  post   '/gba',        to: 'sessions#create'
  delete '/wta',        to: 'sessions#destroy'
  resources :teteqamis
  resources :meleya_magberyas, only: [:edit]
  resources :meda_masjemers, only: [:new, :create, :edit, :update]
end

ዝርዝር 12.1 ውስጥ ያለው የ‘ሃብቶች (resources) ዘዴ በሰንጠረዥ 12.1 ውስጥ የተዘረዘሩትን የሙሉው.ሁ.ማ ማዘዋወሪያወችን ያዘጋጃል፡፡ በተለይም፣ በሰንጠረዥ 12.1 ውስጥ ያለው የመጀመሪያው ማዘዋወሪያ በዝርዝር 12.2 እና በምስል 12.4 ላይ እንደሚታየው፣ በዚህ የተሰየመ ማዘዋወሪያ በኩል:-

new_meda_masjemer_path

ለ “መሕለፈቃልወን ረሱ” ቅጽ አንድ አገናኝን ይሰጠዋል። (ሰንጠረዥ 12.1 በሰንጠረዡ ውስጥ ያሉ አባላት ከሰንጠረዡ አልፈው እንዳይወጡ ለማድረግ በ <ysmula> ምትክ <y> እና በ‘ይስሙላ (ysmula) ምትክ ደግሞ y ብሎ እንደጻፈ ልታስተውሉ ይገባል)

የሃ.ጽ.ማ.ስ መጠይቅ ዓ.አ.ሃ.አ ተግባር ስዩም ማዘዋወሪያ
GET /meda_masjemers/new new new_meda_masjemer_path
POST /meda_masjemers create meda_masjemers_path
GET /meda_masjemers/<y>/edit edit edit_meda_masjemer_url(y)
PATCH /meda_masjemers/<y> update meda_masjemer_path(y)
ሰንጠረዥ 12.1: ዝርዝር 12.1 በመሕለፈቃል ዳግም ማስጀመርያ ሃርት የቀረቡ የሙሉው.ሁ.ማ ማዘዋወሪያወች።
ዝርዝር 12.2: በመሕለፈቃል ዳግም ማስጀመርያ ላይ አንድ አገናኝን ማከል። app/views/sessions/new.html.erb
<% provide(:title, "ይግቡ") %>
<h1 class="ራስጌ1">ይግቡ</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_with(url: gba_path, scope: :session, local: true) do || %>

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

      <%= .label :password, 'መሕለፈቃል' %>
      <%= link_to "(መሕለፈቃልወን ረሱ)", new_meda_masjemer_path %>
      <%= .password_field :password, class: 'form-control' %>

      <%= .label :ዘክረኝ, class: "አመልካችሳጥን ውስጠመስመር" do %>
        <%= .check_box :ዘክረኝ %>
        <span>በዚህ ኮምፕዩተር ላይ ዘክረኝ</span>
      <% end %>

      <%= .submit "ግባ", class: "btn btn-primary" %>
    <% end %>

    <p>አዲስ ተጠቃሚ? <%= link_to "ይመዝገቡ", temezgeb_path %></p>
  </div>
</div>

መልመጃዎች

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

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

  1. የፈተና ስብስቡ አሁንም አረንጓዴመሆኑን አረጋግጡ፡፡
  2. ሰንጠረዥ 12.1 ለስዩሙ የ‘አርትዕ (edit) ማዘዋወሪያ _መንገድ (_path) ከተባለው አሰራር (ቅጽ) ይልቅ ለምን _ዓአሃአ (_url) የተባለውን አሰራር (ቅጽን) መረጠ? ጠቃሚ ምክር:- መልሱ የማለያ ማግበሪያ መልመጃ ላይ ለቀረበው ጥያቄ የተሰጠው መልስ ጋር አንድ ዓይነት ነው (ክፍል 11.1.1.1)።

12.1.2 አዲስ መሕለፈቃል ዳግም ማስጀመርያ

አንድ አዲስ የመሕለፈቃል ዳግም ማስጀመርያን ለመፍጠር፣ በቅድሚያ የውሂብ ቅዱን መበየን ይኖርብናል፣ ይህም ለመለያ ማግበርያ ከተጠቀምንበት ጋር ተመሳሳይ ነው (ምስል 11.1)፡፡ የዝክረ ይስሙላ (ምዕራፍ 9) እና የመለያ ማግበርያ ይስሙላን ንድፍ በመከተል (ምዕራፍ 11)፣ የመሕለፈቃል ዳግም ማስጀመርያወች፣ ዳግመማስጀመሪያ ኤመልእክት ጥቅም ላይ የሚውል አንድ ምናባዊ ዳግመማስጀመሪያ ይስሙላን፣ ተጠቃሚን ፈልጎ ለማምጣት ከአንድ የተዛመደ የዳግመማስጀመሪያ ፍጪ ጋር ያጣምራሉ፡፡ በምትኩ በውሂበጎታው ላይ ያልተከተፈ ይስሙላን ካስቀመጥን ግን፣ የውሂበጎታ መዳረሻ ያለው አንድ አጥቂ፣ ለተጠቃሚው የኤመልእክት አድራሻ አንድ የዳግም ማስጀመርያ መጠይቅን ሊልክ ይችላል፣ እና ከዚያም ተዛማጁን የመሕለፈቃል ዳግም ማስጀመርያ አገናኝን ለመጎብኘት፣ ይስሙላውን እና ኤመልእክቱን በመጠቀም መለያውን ሊቆጣጠር ይችላል፤ ስለዚህ ለመሕለፈቃል ዳግም ማስጀመሪያዎች አንድ ፍጪን መጠቀሙ በጣም አስፈላጊ ነው፡፡ ልክ እንደ አንድ ተጨማሪ የጥበቃ ጥንቃቄ ይሆነን ዘንድ፣ የዳግም ማስጀመሪያ አገናኙ ከተሰደደ ከሁለት ሰዓት በኋላ ጊዜው እንዲቃጠልም አቅደናል፣ ይህም የዳግም ማስጀመሪያው የተላክበትን ጊዜ መመዝገብን ይጠይቃል፡፡ በውጤቱ የተገኙት የ‘ፈጪ_ማስጀመር (masjemer_fech) እና የ‘ፈጪ_ተሰደደ_በ (masjemer_tesedede_at) ባሕሪወች በምስል 12.5 ላይ ይታያሉ፡፡

user_model_password_reset
ምስል 12.5: የተጠቃሚ ቅርጸቱ ከታከሉት የመሕለፈቃል ዳግም ማስጀመርያ ባሕሪዎች ጋር።

ባሕሪወቹን ከምስል 12.5 ለማከል የሚደረገው ፍልሰት የሚከተለውን ይመስላል:-

$ rails generate migration add_masjemer_to_teteqamis \
  masjemer_fech:string masjemer_tesedede_at:datetime

ከዚያ እንደተለመደው አድርገን እናፈልሳለን:-

$ rails db:migrate

ለአዲስ መሕለፈቃል ዳግም ማስጀመሪያዎች ትይታ ገጽን ለማድረግ፣ የንቅ መዝገብ ሃብት ያልሆነ አንድ አዲስ ማለት ልክ ለመግቢያ ቅጽ (ዝርዝር 8.4) ማለት አንድ አዲስ ክፍለጊዜን ለመፍጠር፣ ከዚህ በፊት የተጠቀምንበትን መንገድ በመከተል፣ አንድ ተመሳሳይ ቅጽን እንሰራለን። አሁን ከምንሰራው ቅጽ ጋር ማጣቀሻ ይሆነን ዘንድ፣ ከዚህ በፊት የሰራነውን ቅጽ በዝርዝር 12.3 ላይ ደግመን አቅርበነዋል።

ዝርዝር 12.3: የመግቢያ ቅጹን ኮድ መገምገም። app/views/sessions/new.html.erb
<% provide(:title, "ይግቡ") %>
<h1 class="ራስጌ1">ይግቡ</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_with(url: gba_path, scope: :session, local: true) do || %>

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

      <%= .label :password, 'መሕለፈቃል' %>
      <%= link_to "(መሕለፈቃልወን ረሱ)", new_meda_masjemer_path %>
      <%= .password_field :password, class: 'form-control' %>

      <%= .label :ዘክረኝ, class: "አመልካችሳጥን ውስጠመስመር" do %>
        <%= .check_box :ዘክረኝ %>
        <span>በዚህ ኮምፕዩተር ላይ ዘክረኝ</span>
      <% end %>

      <%= .submit "ግባ", class: "btn btn-primary" %>
    <% end %>

    <p>አዲስ ተጠቃሚ? <%= link_to "ይመዝገቡ", temezgeb_path %></p>
  </div>
</div>

አዲሱ የመሕለፈቃል ዳግም ማስጀመርያ ቅጹ፣ ከዝርዝር 12.3 ጋር ብዙ የሚመሳሰል ነገር አለው፤ በጣም ጉልህ የሆኑት ልዩነቶች ደግሞ፣ አንድ የተለየ ሃብት ላይ እና አንድ ዓ.አ.ሃ.አ ላይ በ‘ቅጽ_ጋር (form_with) ውስጥ መጥራቱ እና በተጨማሪም የመሕለፈቃል ባሕሪውን ማስወገዱ ናቸው። ውጤቱም በዝርዝር 12.4 እና በምስል 12.6 ላይ ይታያል፡፡

ዝርዝር 12.4: አንድ አዲስ የመሕለፈቃል ዳግም ማስጀመርያ ትይታ። app/views/meda_masjemers/new.html.erb
<% provide(:title, "መሕለፈቃልወን ረሱ") %>
<h1 class="ራስጌ1">መሕለፈቃልወን ረሱ</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_with(url: meda_masjemers_path, scope: :meda_masjemer,
                  local: true) do || %>

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

      <%= .submit "አስረክብ", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>
images/figures/forgot_password_form
ምስል 12.6: የ “መሕለፈቃልወን ረሱ” ቅጽ።

መልመጃዎች

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

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

  1. ዝርዝር 12.4 ቅጽ_ጋር (form_with) ላይ @meda_masjemer ‘ን ከመጠቀም ይልቅ ለምን :meda_masjemer ‘ን ተጠቀመ?

12.1.3 የመሕለፈቃል ዳግም ማስጀመርያ የ‘ፍጠር ተግባር።

ምስል 12.6 ቅጽ በሚረከብበት ጊዜ፣ ተጠቃሚውን በኤመልእክት አድራሻው መሰረት ፈልጎ ማግኘት እና ባሕሪወቹን በመሕለፈቃል ዳግመማስጀመሪያ ይስሙላው እና የተሰደደበት ማህተመጊዜን ማለት ሁለቱንም ባሕሪዎች ማዘመን እንፈልጋለን፡፡ ከዚያ ስለሁኔታው አንድ ጠቃሚ መረጃ የሚሰጥ የብልጪታ መልእክት ጋር ወደ ስረ ዓ.አ.ሃ.አው እናዟዙራለን፡፡ ልክ እንደ ለመግቢያው እንዳደረግነው ሁሉ (ዝርዝር 8.11)፣ አንድ ብቁ ያልሆነ ርክብ በሚቀርብበት ጊዜ፣ አዲስ (new) ገጹን ከአንድ የ‘አሁን.ብልጪታ (flash.now) መልእክት ጋር በድጋሜ እናቀርባለን።2 ውጤቶቹ በዝርዝር 12.5 ውስጥ ይታያሉ፡፡

ዝርዝር 12.5: የመሕለፈቃል ዳግም ማስጀመርያ የ‘ፍጠር (create) ተግባር። app/controllers/meda_masjemers_controller.rb
class MedaMasjemersController < ApplicationController

  def new
  end

  def create
    @teteqami = Teteqami.find_by(emelekt: params[:meda_masjemer][:emelekt].downcase)
    if @teteqami
      @teteqami.masjemer_fech_fter
      @teteqami.masjemer_emelekt_laki
      flash[:info] = "አንድ የኤመልእክት ከመሕለፈቃል ዳግም ማስጀመርያ መመሪያጋ ተልኮልዋታል።"
      redirect_to root_url
    else
      flash.now[:danger] = "የኤመልእክት አድራሻዎት አልተገኘም።"
      render 'new'
    end
  end

  def edit
  end
end

በተጠቃሚ ቅርጸቱ ውስጥ ያለው ኮድ፣ በዝርዝር 12.6 ላይ እንደሚታየው፣ በ‘ከመፍጠር_በፊት (before_create) መልሰጥሪ (ዝርዝር 11.3) ውስጥ ካገለገለው ከ‘ማግበርያ_ፈጪ_ፍጠር (magberya_fech_fter) ዘዴ ጋር ትይዩ ነው፡፡

ዝርዝር 12.6: በተጠቃሚ ቅርጸቱ ውስጥ የመሕለፈቃል ዳግም ማስጀመርያ ዘዴዎችን ማከል። app/models/teteqami.rb
class Teteqami < ApplicationRecord
  attr_accessor :zkre_ysmula, :magberya_ysmula, :masjemer_ysmula
  before_save   :emelekt_nious_melkefidel
  before_create :magberya_fech_fter
  .
  .
  .
  # አንድ መለያን ያነቃል።
  def agbr
    update_columns(nq: true, nq_at: Time.zone.now)
  end

  # የማግበሪያ ኤመልእክትን ይልካል፡፡
  def megberya_emelekt_laki
    TeteqamiMailer.meleya_magberya(self).deliver_now
  end

  # የመሕለፈቃል ዳግም ማስጀመርያ ባሕርያትን ያዘጋጃል።
  def masjemer_fech_fter
    self.masjemer_ysmula = Teteqami.adis_ysmula
    update_attribute(:masjemer_fech,  Teteqami.fech(masjemer_ysmula))
    update_attribute(:masjemer_tesedede_at, Time.zone.now)
  end

  # የመሕለፈቃል ዳግም ማስጀመር ኤመልእክትን ይልካል፡፡
  def masjemer_emelekt_laki
    TeteqamiMailer.meda_masjemer(self).deliver_now
  end

  private

    # የኤመልክትን ወደ ንዑስ ፊደል ይለውጣል።
    def emelekt_nious_melkefidel
      self.emelekt.downcase!
    end

    # ማግበሪያ ይስሙላን እና ፍጪን ይፈጥር እና ይመድባል።
    def magberya_fech_fter
      self.magberya_ysmula = Teteqami.adis_ysmula
      self.magberya_fech   = Teteqami.fech(magberya_ysmula)
    end
end

ምስል 12.7 ላይ እንደታየው፣ በዚህ ጊዜ የአፕልኬሽኑ ባህሪ ብቁ ባልሆኑ የኤመልእክት አድራሻዎች ላይ ቀድሞውኑ እየሰራ ይገኛል፡፡ አፕልኬሽኑ አንድ ብቁ የኤመልእክት አድራሻን በሚረከብበት ጊዜ እንዲሰራ ለማድረግ፣ አንድ የመሕለፈቃል ዳግም ማስጀመርያ መላኪያ ዘዴን መበየን ይኖርብናል፡፡

images/figures/invalid_email_password_reset
ምስል 12.7: የ“መሕለፈቃልወን ረሱ” ቅጹ ብቁ ላልሆነ የኤመልእክት አድራሻ ከሰጠው ምላሽ ጋር።

መልመጃዎች

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

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

  1. ምስል 12.6 ላይ የተመለከተው ቅጽ ላይ፣ አንድ ብቁ የኤመልእክት አድራሻን አስረክቡ። ምን ዓይነት የስህተት መልእክት አገኛችሁ?
  2. ምንም እንኳን ስህተት ቢኖርም፣ ከላይ ባለው መልመጃ ያስረከባችሁት ተጠቃሚ የ‘ፈጪ_ማስጀመር (masjemer_fech) እና የ‘ፈጪ_ተሰደደ_በ (masjemer_tesedede_at) ባሕሪወች እንዳሉት ግን ሰሌዳችሁን በመጠቀም አረጋግጡ፡፡ የባሕሪወቹ ዋጋዎች ምንድናቸው?

12.2 የመሕለፈቃል ዳግም ማስጀመርያ ኤመልእክቶች

ክፍል 12.1 ላይ በመሕለፈቃል ዳግም ማስጀመርያ መቆጣጠሪያ ውስጥ አንድ ሊሰራ ምንም ያልቀረው የ‘ፍጠር (create) ተግባርን ትተን መጥተናል፡፡ አንድ የጎደለ ነገር ቢኖር፣ ብቁ የመሕለፈቃል ዳግም ማስጀመርያ ኤመልእክቶችን መላኪያ ዘዴው ብቻ ነው፡፡

ክፍል 11.1 ‘ን ተከታትላችሁ ከሆነ፣ በዝርዝር 11.6 በተፈጠረው የተጠቃሚ መላኪያ ምክንያት አንድ ነባሪ መዳ_ማስጀመር (meda_masjemer) የተባለ የኤመልእክት መላኪያ ዘዴ በ‘ app/mailers/teteqami_mailer.rb ፋይላችሁ ውስጥ አላችሁ ማለት ነው፡፡ ምዕራፍ 11 ‘ን ዘላችሁ የመጣችሁ ከሆነ ደግሞ ከታች የተመለከተውን ኮድ ቀድታችሁ (መለያ_ማግበርያ‘ን (meleya_magberya) በመተው) ፋይላችሁ ላይ መግልበጥ እና የጎደለውን ፋይል እንዳስፈላጊነቱ በመፍጠር አብራችሁን መጓዝ ትችላላችሁ፡፡

12.2.1 የመሕለፈቃል ዳግም ማስጀመርያ መላኪያ እና ዝግጁገጽታወች

እዚህ ላይ በዝርዝር 12.6 ውስጥ፣ በክፍል 11.3.3 ላይ የተጣራውን እና በቀጥታ በተጠቃሚ ቅርጸቱ ውስጥ የገባውን የተጠቃሚ መላኪያ የንድፍ ጥለት ተግባራዊ አድርገናል:-

TeteqamiMailer.meda_masjemer(self).deliver_now

የመሕለፈቃል ዳግም ማስጀመርያ መላኪያ ዘዴን እንዲሰራ ለማድረግ የሚያስፈልገው አሰራር፣ በክፍል 11.2 ላይ ካበለጸግነው የመለያ ማግበርያ መላኪያ ዘዴ አሰራር ጋር በጣም ተመሳሳይ ነው፡፡ በመጀመሪያ በተጠቃሚ መላኪያው ውስጥ (ዝርዝር 12.7) አንድ መዳ_ማስጀመር (meda_masjemer) የተባለ ዘዴን እንፈጥራለን፣ እና ከዚያ በኋላ አንድ ለጥሬ-ጽሑፍ ኤመልእክት (ዝርዝር 12.8) እና አንድ ለሃ.ጽ.መ.ቋ ኤመልእክት የትይታ ዝግጁገጽታወችን እንበይናለን (ዝርዝር 12.9)፡፡

ማሳሰቢያ:- ምዕራፍ 11 ውስጥ በዝርዝር 11.13 እና በዝርዝር 11.14 ላይ እንዳደረጋችሁት ሁሉ፣ ፈተናው እየወደቀ እና በሬይልስ አገልጋዩ ውስጥ የተሰደደው የኤመልእክት ዳግም ማስጀመሪያ በግልጽ ያልቀረበ ከሆነ፣ ይህንን ችግር ለማቃለል አሁንም በድጋሜ፣ በዝርዝር 12.8 እና በዝርዝር 12.9 ውስጥ አስተያየት ከተደረገበት በታች ያሉትን ኮዶች ተጠቀሙ (አስተያየቱን ቀድታችሁ መገልበጥ እንደለለባችሁ ልትገነዘቡ ይገባል)።

ዝርዝር 12.7: የመሕለፈቃል ዳግም ማስጀመርያ አገናኙን መላክ። app/mailers/teteqami_mailer.rb
class TeteqamiMailer < ApplicationMailer

  def meleya_magberya(teteqami)
    @teteqami = teteqami
    mail to: teteqami.emelekt, subject: "የመለያ ማግበሪያ"
  end

  def meda_masjemer(teteqami)
    @teteqami = teteqami
    mail to: teteqami.emelekt, subject: "መሕለፈቃል ዳግም ማስጀመርያ"
  end
end
ዝርዝር 12.8: የመሕለፈቃል ዳግም ማስጀመርያው የጥሬ-ጽሑፍ ኤመልእክት ዝግጁገጽታ። app/views/teteqami_mailer/meda_masjemer.text.erb
መሕለፈቃልዎን ለማስጀመር እታች ያለውን አገናኝ ጠቅ ያድርጉ:-

<%= edit_meda_masjemer_url(@teteqami.masjemer_ysmula,
                            email: @teteqami.emelekt) %>

ይህ አገናኝ በሁለት ሰዓታት ውስጥ ጊዜው ይቃጠላል፡፡

መሕለፈቃልዎ ዳግም እንዲጀመር ካልጠየቁ ይህን ኤመልእክት ችላ ይበሉት መሕለፈቃልዎ እንዳለው
ይቆያል።

# ፈተናው እየወደቀ ካስቸገራችሁ ከዚህ በታች ያለውን፣ በእንግሊዝኛ የተጻፈ የሰላምታና የእንኳን
# ደህና መጡ ጽሑፍ ያካተተውን ኮድ ተጠቀሙ።

Mehlefeqalwen lemasjemer etach yalewn agenagn teq yadrgu:-

<%= edit_meda_masjemer_url(@teteqami.masjemer_ysmula,
                           email: @teteqami.emelekt) %>

Yih agenagn behulet seat wst gizew yiqatelal.

Mehlefeqalwe dagm endijemr kalteyequ yhnn emelekt chila ybelut mehlefeqalwe
endalew yiqoyal.
ዝርዝር 12.9: የመሕለፈቃል ዳግም ማስጀመርያው የሃ.ጽ.መ.ቋ ኤመልእክት ዝግጁገጽታ። app/views/teteqami_mailer/meda_masjemer.html.erb
<h2>መሕለፈቃል ዳግም ማስጀመርያ Mehlefeqal dagm masjemerya</h2>

<p>መሕለፈቃልዎን ለማስጀመር እታች ያለውን አገናኝ ጠቅ ያድርጉ:-</p>

<%= link_to "መሕለፈቃል ዳግም ማስጀመርያ", edit_meda_masjemer_url(
              @teteqami.masjemer_ysmula, email: @teteqami.emelekt) %>

<p>ይህ አገናኝ በሁለት ሰዓታት ውስጥ ጊዜው ይቃጠላል፡፡</p>

<p>
መሕለፈቃልዎ ዳግም እንዲጀመር ካልጠየቁ ይህን ኤመልእክት ችላ ይበሉት መሕለፈቃልዎ እንዳለው
ይቆያል።
</p>

# ፈተናው እየወደቀ ካስቸገራችሁ ከዚህ በታች ያለውን፣ በእንግሊዝኛ የተጻፈ የሰላምታና የእንኳን
# ደህና መጡ ጽሑፍ ያካተተውን ኮድ ተጠቀሙ።

<h1>Mehlefeqal dagm masjemerya</h1>

<p>Mehlefeqalwen lemasjemer etach yalewn agenagn teq yadrgu:-</p>

<%= link_to "mehlefeqal dagm masjemerya", edit_meda_masjemer_url(
              @teteqami.masjemer_ysmula, email: @teteqami.emelekt) %>

<p>Yih agenagn behulet seat wst gizew yiqatelal.</p>

<p>
Mehlefeqalwe dagm endijemr kalteyequ yhnn emelekt chila ybelut mehlefeqalwe
endalew yiqoyal.
</p>

ለመለያ ማግበርያ ኤመልእክቶች ቅድመ-ትይታ (ክፍል 11.2)፣ የሬይልስ ኤመልእክቶች ቅድመ-ትይታን እንደተጠቀምን ሁሉ፤ አሁንም እሱኑ በመጠቀም የመሕለፈቃል ዳግም ማስጀመርያ ኤመልእክቶችን ማየት እንችላለን፡፡ ኮዱም በዝርዝር 12.10 ላይ እንደታየው፣ ከዝርዝር 11.18 ጋር ፍጹም ተመሳሳይ ነው፡፡

ዝርዝር 12.10: ለመሕለፈቃል ዳግም ማስጀመርያ፣ አንድ የሚሰራ የቅድመ-ትይታ ዘዴ። test/mailers/previews/teteqami_mailer_preview.rb
# Preview all emails at http://localhost:3000/rails/mailers/teteqami_mailer
class TeteqamiMailerPreview < ActionMailer::Preview

  # Preview this email at
  # http://localhost:3000/rails/mailers/teteqami_mailer/meleya_magberya
  def meleya_magberya
    teteqami = Teteqami.first
    teteqami.magberya_ysmula = Teteqami.adis_ysmula
    TeteqamiMailer.meleya_magberya(teteqami)
  end

  # Preview this email at
  # http://localhost:3000/rails/mailers/teteqami_mailer/meda_masjemer
  def meda_masjemer
    teteqami = Teteqami.first
    teteqami.masjemer_ysmula = Teteqami.adis_ysmula
    TeteqamiMailer.meda_masjemer(teteqami)
  end
end

ዝርዝር 12.10 ላይ በለው ኮድ መሰረት፣ የሃ.ጽ.መ.ቋ እና የጽሑፍ ኤመልእክት ቅድመ-ትይታዎች ይዞታ በምስል 12.8 እና በምስል 12.9 ላይ ይታያል፡፡

images/figures/password_reset_html_preview
ምስል 12.8: በሃ.ጽ.መ.ቋ ስሪቱ የቀረበ የመሕለፈቃል ዳግም ማስጀመርያ የኤመልእክት ቅድመ-ትይታ።
images/figures/password_reset_text_preview
ምስል 12.9: በጽሑፍ ስሪቱ የቀረበ የመሕለፈቃል ዳግም ማስጀመርያ የኤመልእክት ቅድመ-ትይታ።

ዝርዝር 12.7፣ በዝርዝር 12.8 እና በዝርዝር 12.9 ላይ ባለው ኮድ አንድ ብቁ ኤመልእክት በሚረከብበት ጊዜ፣ የሚገኘው ውጤት በምስል 12.10 ላይ ይታያል፡፡ ተዛማጁ ኤመልእክትም በአገልጋዩ ዘገባ ውስጥ ይታያል። እናም ልክ በዝርዝር 12.11 ላይ ያለውን የሚመስል እይታ መምሰል ይኖርበታል፡፡

images/figures/valid_email_password_reset
ምስል 12.10: አንድ ብቁ የኤመልእክት አድራሻን የማስረከብ ውጤት።
ዝርዝር 12.11: በአገልጋይ ዘጋቢው ውስጥ የተገኘ፣ አንድ የናሙና የመሕለፈቃል ዳግም ማስጀመርያ ኤመልእክት፡፡
TeteqamiMailer#meda_masjemer: processed outbound mail in 4.2ms
Delivered mail 5fe53ee21cf8e_98561302903e@winnber.local.mail (2.5ms)
Date: Thu, 24 Dec 2020 17:22:42 -0800
From: noreply@example.com
To: msalie@railstutorial.org
Message-ID: <5fe53ee21cf8e_98561302903e@winnber.local.mail>
Subject: መሕለፈቃል ዳግም ማስጀመርያ
Mime-Version: 1.0
Content-Type: multipart/alternative;
 boundary="--==_mimepart_5fe53ee21c85c_98561302897f";
 charset=UTF-8
Content-Transfer-Encoding: 7bit


----==_mimepart_5d609328d5404_28872b106582ddf488531
Content-Type: text/plain;
 charset=UTF-8
Content-Transfer-Encoding: 7bit

መሕለፈቃልዎን ለማስጀመር እታች ያለውን አገናኝ ጠቅ ያድርጉ:-

http://localhost:3000/meda_masjemers/ZorQc1WnjQY4UUljrxW5gw/
edit?email=msalie%40railstutorial.org

ይህ አገናኝ በሁለት ሰዓታት ውስጥ ጊዜው ይቃጠላል፡፡

መሕለፈቃልዎ ዳግም እንዲጀመር ካልጠየቁ ይህን ኤመልእክት ችላ ይበሉት መሕለፈቃልዎ እንዳለው
ይቆያል።

----==_mimepart_5d609328d5404_28872b106582ddf488531
Content-Type: text/html;
 charset=UTF-8
Content-Transfer-Encoding: 7bit

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <style>
      /* Email styles need to be inline */
    </style>
  </head>

  <body>
    <h1>መሕለፈቃል ዳግም ማስጀመርያ</h1>

<p>መሕለፈቃልዎን ለማስጀመር እታች ያለውን አገናኝ ጠቅ ያድርጉ:-</p>

<a href="http://localhost:3000/meda_masjemers/ZorQc1WnjQY4UUljrxW5gw/
edit?email=msalie%40railstutorial.org">Reset password</a>

<p>ይህ አገናኝ በሁለት ሰዓታት ውስጥ ጊዜው ይቃጠላል፡፡</p>

<p>
መሕለፈቃልዎ ዳግም እንዲጀመር ካልጠየቁ ይህን ኤመልእክት ችላ ይበሉት መሕለፈቃልዎ እንዳለው
ይቆያል።
</p>
  </body>
</html>

----==_mimepart_5d609328d5404_28872b106582ddf488531--

መልመጃዎች

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

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

  1. አሳሻችሁን በመጠቀም፣ የኤመልእክት ዝግጁገጽታወችን ተመልከቱ። ኤመልእክቱ የተሰደደበት ቀን መቸ ነው? የቅድመ-ትይታዎቹ የቀን መስኮች መቸ ይላሉ?
  2. አዲሱ የመሕለፈቃል ዳግም ማስጀመርያ ቅጽ ላይ አንድ ብቁ የኤመልእክት አድራሻን አስረክቡ። በአገልጋዩ ዘገባ ውስጥ የመነጨው የኤመልእክት ይዞታ ምንድነው?
  3. በሬይልስ ሰሌዳ ላይ፣ ከዚህ በላይ ያለው የኤመልእክት አድራሻ ጋር የሚዛመደውን የተጠቃሚ ቁስ ፈልጉ እና ብቁ የ‘ፈጪ_ማስጀመር (masjemer_fech) እና የ‘ፈጪ_ተሰደደ_በ (masjemer_tesedede_at) ባሕሪወች እንዳሉት አረጋግጡ፡፡

12.2.2 የኤመልእክት ፈተናወች

ዝርዝር 12.12 ላይ እንደሚታየው፣ ከመለያ ማግበርያ መላኪያ ዘዴ ፈተና ጋር (ዝርዝር 11.20) የሚመሳሰል አንድ ፈተና ለመሕለፈቃል ዳግም ማስጀመርያ መላኪያ ዘዴው እንጽፋለን። ማሳሰቢያ:- በምርት ላይ ኤመልእክትን (ክፍል 11.4) ለመላክ ካቀዳችሁ፣ በዝርዝር 12.12 ውስጥ ያለውን “noreply@example.com” ‘ን በእውነተኛ የኤመልእክት አድራሻችሁ መተካት ይኖርባችኋል (ማለት ዝርዝር 11.11 ላይ በተጠቀማችሁበት መተካት ይኖርባችኋል ማለት ነው)፡፡

ዝርዝር 12.12: ለመሕለፈቃል ዳግም ማስጀመርያ መላኪያ ዘዴው አንድ ፈተናን ማከል። አረንጓዴ test/mailers/teteqami_mailer_test.rb
require 'test_helper'

class TeteqamiMailerTest < ActionMailer::TestCase

  test "meleya_magberya" do
    teteqami = teteqamis(:michael)
    teteqami.magberya_ysmula = Teteqami.adis_ysmula
    mail = TeteqamiMailer.meleya_magberya(teteqami)
    assert_equal "የመለያ ማግበሪያ",                mail.subject
    assert_equal [teteqami.emelekt],            mail.to
    assert_equal ["from@msalie.com"],           mail.from
    assert_match teteqami.sim,                  mail.body.encoded
    assert_match teteqami.magberya_ysmula,      mail.body.encoded
    assert_match CGI.escape(teteqami.emelekt),  mail.body.encoded
  end

  test "meda_masjemer" do
    teteqami = teteqamis(:michael)
    teteqami.masjemer_ysmula = Teteqami.adis_ysmula
    mail = TeteqamiMailer.meda_masjemer(teteqami)
    assert_equal "መሕለፈቃል ዳግም ማስጀመርያ",       mail.subject
    assert_equal [teteqami.emelekt],              mail.to
    assert_equal ["from@msalie.com"],             mail.from
    assert_match teteqami.masjemer_ysmula,        mail.body.encoded
    assert_match CGI.escape(teteqami.emelekt),    mail.body.encoded
  end
end

በዚህ ወቅት የፈተና ስብስቡ አረንጓዴመሆን አለበት:-

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

መልመጃዎች

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

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

  1. የመላኪያ ፈተናወችን ብቻ አስኪዱ። ፈተናወቹ አረንጓዴናቸውን?
  2. ዝርዝር 12.12 ውስጥ ያለውን የ‘ሲጃአይ.አምልጥ (CGI.escape) ጥሪን ብታስወግዱት ፈተናው ቀይ እንደሚሆን አረጋግጡ (ወደነበረበት መመለስ እንዳለባችሁ ልትገነዘቡ ይገባል)፡፡

12.3 መሕለፈቃሉን ዳግም ማስጀመር

አሁን ልክ እንደ ዝርዝር 12.11 ያለ በትክክል የመነጨ አንድ ኤመልእክት ስላለን፣ የተጠቃሚውን መሕለፈቃል ዳግም የሚያስጀመረውን የ‘አርትዕ edit ተግባርን በመሕለፈቃል ዳግም ማስጀመርያወች መቆጣጠሪያ ውስጥ መጻፍ ይኖርብናል። ልክ በክፍል 11.3.3 ላይ እንዳደረግነው እንዲሁ፣ አንድ የተሟላ የውህደት ፈተናንም እንጽፋለን።

12.3.1 የዳግም ማስጀመርያ (የ‘አርትዕ) ተግበር

ልክ ዝርዝር 12.11 ላይ እንደሚታየው፣ ያሉ የመሕለፈቃል ዳግም ማስጀመርያ ኤመልእክቶች፣ እንደሚከተሉት አይነት የአገናኞች ቅጽን ይዘዋል:-

https://example.com//meda_masjemers/3BdBrXeQZSWqFIDRN8cxHA/edit?email=fu%40bar.com

እነዚህ አገናኞች እንዲሰሩ ለማድረግ፣ አንድ የመሕለፈቃል ዳግም ማስጀመርያ ቅጽ ያስፈልገናል፡፡ ተግባሩ በተጠቃሚ አርትዖት ትይታ በኩል ተጠቃሚዎችን ከማዘመን ጋር ተመሳሳይ ሲሆን (ዝርዝር 10.2)፣ በዚህ ጊዜ ግን ቅጹ የመሕለፈቃል እና የመሕለፈቃል ማረጋገጫ መስኮች ብቻ ይኖሩታል፡፡

እዚህ ላይ ግን አንድ የተወሳሰበ ነገር አለ፤ ማለት ተጠቃሚውን በኤመልእክት አድራሻው ፈልጎ ማግኘትን እንጠብቃለን፣ ይህ ማለት በ‘አርትዕ (edit) እና በ‘አዘምን (update) ተግባሮች ውስጥ የኤመልእክት አድራሻው ያስፈልገናል ማለት ነው። እዚህ ላይ የኤመልእክት አድራሻው በሚላከው አገናኝ ውስጥ ስለሚገኝ የ‘አርትዕ (edit) ተግባሩ የኤመልእክት አድራሻውን በራስሰር ያገኘዋል፣ ነገር ግን ልክ ቅጹን ካስረከብን በኋላ ዋጋው ይጠፋል። ለዚህ መፍትሄው በገጹ ላይ ያለውን የኤመልእክት አድራሻ፣ ገጹ ላይ ሳይታይ ለማስቀመጥ የሚረዳ አንድ የተደበቀ መስክን (Hidden Field) በመጠቀም የኤመልእክት አድራሻውን ማግኘት እና ውጤቱን ከተቀረው የቅጹ መረጃ ጋር አብሮ እንዲረከብ ማድረግ ነው፡፡ ውጤቱም በዝርዝር 12.14 ውስጥ ይታያል፡-

ዝርዝር 12.14: አንድ የመሕለፈቃልን ዳግም ማስጀመርያ ቅጽ። app/views/meda_masjemers/edit.html.erb
<% provide(:title, 'መሕለፈቃል ዳግም ማስጀመርያ') %>
<h1 class="ራስጌ1">መሕለፈቃል ዳግም ማስጀመርያ</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_with(model: @teteqami, url: meda_masjemer_path(params[:id]),
                  local: true) do || %>
      <%= render 'gru/shtet_melektoch' %>

      <%= hidden_field_tag :emelekt, @teteqami.emelekt %>
      <%= .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>

ዝርዝር 12.14 ለቅጽ መለያ ረጅ ይህንን ዓይነት የቅጽ መለያ ረጅ ከመጠቀም ፈንታ:-

hidden_field_tag :emelekt, @teteqami.emelekt

የዚህ ዓይነቱን የቅጽ መለያ ረጅን እንደሚጠቀም አስተውሉ:-

.hidden_field :emelekt, @teteqami.emelekt

ይህ የሆነበት ምክንያትም፣ የዳግም ማስጀመርያ አገናኙ፣ የኤመልእክቱን በ‘ሴሚአሴቶች[:ኤመልእክ] (params[:emelekt]) ውስጥ ሲያስቀምጥ የኋለኛው ግን በ‘ሴሚአሴቶች[:ተጠቃሚ][:ተጠቃሚ] (params[:teteqami][:emelekt]) ውስጥ ስለሚያስቀምጠው ነው።

ቅጹን ለማቅረብ፣ በመሕለፈቃል ዳግም ማስጀመርያዎች መቆጣጠሪያ የ‘አርትዕ (edit) ተግባር ውስጥ አንድ @ተጠቃሚ (@teteqami) የተባለ ተለዋዋጪን መበየን አለብን፡፡ ይህም ልክ እንደ መለያ ማግበርያው (ዝርዝር 11.31) የኤመልእክት አድራሻው፣ በ‘ሴሚአሴቶች[:ኤመልእክ‘ቱ] (params[:emelekt]) ውስጥ ጋር የሚዛመደውን ተጠቃሚ ፈልጎ ማግኘትን ያሳትፋል። ከዚያ ተጠቃሚው ብቁ መሆኑን ማረጋገጥ ይኖርብናል፣ ማለትም መኖሩን፣ መንቃቱን እና ዳግመማስጀመሪያ ይስሙላው በ‘ሴሚአሴቶች[:መታወቂያ]‘ው (params[:id]) መሰረት (በዝርዝር 11.26 ውስጥ የተበየነውን እና የተጠቃለለውን የተረጋግጧልን? (teregagtualn?) ዘዴን በመጠቀም) መረጋገጡን ማረጋገጥ እንፈልጋለን። በ‘አርትዕ (edit) እና በ‘አዘምን (update) ተግባር ውስጥ አንድ ብቁ @ተጠቃሚ (@teteqami) መኖሩ አስፈላጊ ስለሆነ፣ በዝርዝር 12.15 ላይ እንደሚታየው፣ ኮዱ እሱን እንዲያገኘው እና እንዲያረጋግጠው በሁለት ቅድመአጣሪወች ውስጥ እናስቀምጠዋለን፡፡

ዝርዝር 12.15: ለመሕለፈቃል ዳግም ማስጀመሪያ የ‘አርትዕ (edit) ተግባርን ማከል። app/controllers/meda_masjemers_controller.rb
class MedaMasjemersController < ApplicationController
  before_action :teteqami_aggn, only: [:edit, :update]
  before_action :bqu_teteqami,  only: [:edit, :update]
  .
  .
  .
  def edit
  end

  private

    def teteqami_aggn
      @teteqami = Teteqami.find_by(emelekt: params[:emelekt])
    end

    # አንድ ብቁ ተጠቃሚን ያረጋግጣል።
    def bqu_teteqami
      unless (@teteqami && @teteqami.nq? &&
              @teteqami.teregagtualn?(:masjemer, params[:id]))
        redirect_to root_url
      end
    end
end

ሰንጠረዥ 11.1 ላይ የተመለከቱትን የማረጋገጫ ዘዴወች በዝርዝር 12.15 ላይ ይህንን:-

teregagtualn?(:masjemer, params[:id])

ዝርዝር 11.28 ላይ ይህንን:-

teregagtualn?(:zkre, cookies[:zkre_yamula])

በዝርዝር  11.31 ላይ ደግሞ ይህንን ተጠቅመናል:-

teregagtualn?(:magberya, params[:id])

ስለዚህ እዚህ ላይ ሶስቱም የማረጋገጫ ዘዴወች ያከትማሉ ማለት ነው።

ከላይ ካለው ኮድ ጋር፣ ዝርዝር 12.11 ጋር ተመሳሳይ የሆነውን አገናኝ በአሳሻችሁ አድራሻ መጻፍያ ላይ ማስገባቱ፣ አንድ የመሕለፈቃል ዳግም ማስጀመርያ ቅጽን ማቅረብ ይኖርበታል፡፡ ከሰሌዳ ዘጋቢው የተገኘውን አገናኝ ከሰሌዳው ቀድቶ በአሳሹ የአድራሻ መጻፍያ ላይ የመገልበጡ (ዝርዝር 12.11) ውጤት በምስል 12.11 ላይ ይታያል፡፡

images/figures/password_reset_form
ምስል 12.11: የመሕለፈቃል ዳግም ማስጀመሪያው ቅጽ።

መልመጃዎች

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

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

  1. ክፍል 12.2.1.1 ማለት በአገልጋይ ዘጋቢው ውስጥ የተገኘውን የኤመልእክት አገናኝ ቀድታችሁ በአሳሻችሁ የአድራሻ መጻፊያ ላይ ገልብጡ። ልክ ምስል 12.11 ላይ የተመለከተውን የሚመስል ቅጽ በትክክል ያቀርባልን?
  2. ከዚያ በመቀጠል፤ ቅጹን ብታስረክቡስ ምንይፈጠራል?

12.3.2 ዳግም ማስጀመርን ማዘመን

የመለያ ማግበርያ የ‘አርትዕ (edit) ዘዴ ስራው ተጠቃሚን ከ“ያልነቃ” ወደ “ንቅ” መቀያየር ሲሆን፣ የመሕለፈቃል ዳግም ማስጀመርያ የ‘አርትዕ (edit) ዘዴ ግን ከሱ በተቃረነ መልኩ አንድ ራሱን የቻለ ቅጽ ነው፣ ስለሆነም ለአንድ ተዛማጅ የ‘አዘምን (update) ተግባር መረጃዎችን ማስረከብ አለበት። ይህንን የ‘አዘምን (update) ተግባር ለመበየን አራት ክስተቶችን ግምት ውስጥ ማስገባት ይኖርብናል፡-

  1. የተቃጠለ መሕለፈቃልን ዳግም ማስጀመርን፣
  2. ብቁ ባልሆነ መሕለፈቃል ምክንያት ያልተሳካ ዝመናን፣
  3. በባዶ የመሕለፈቃል እና የማረጋገጫ ምክንያት ያልተሳካ ዝመናን (መጀመሪያ ላይ “የተሳካ” ይመስላል) እና
  4. አንድ የተሳካ ዝመናን ናቸው።

አንደኛው (1)፣ ሁለተኛው (2) እና አራተኛው (4) ክስተቶች በመጠኑ ግልጽ ይመስላሉ፡፡ ሶስተኛው ክስተት ግን ያልተለመደ ክስተት ስለሆነ ከታች በደንብ ተብራርቷል፡፡

አንደኛው (1) ክስተት የ‘አርትዕ (edit) እና የ‘አዘምን (update) ተግባሮች ላይ ተፈጻሚ ይሆናል፣ ስለሆነም በአንድ ቅድመአጣሪ ውስጥ መሆን እንደሚገባው ምክንያት አለው:-

before_action :mabqiya_aregagtie, only: [:edit, :update]    # ክስተት (1)

ይህም አንድ ማብቂያ_አረጋግጤ (mabqiya_aregagtie) የተባለ የግል ዘዴ መበየንን ይጠይቃል:-

# የዳግም ማስጀመሪያ ይስሙላው ጊዜ ማብቃቱን ይፈትሻል።
def mabqiya_aregagtie
  if @teteqami.mehlefeqal_damasjemerya_abqtualn?
    flash[:danger] = "የመሕለፈቃል ዳግም ማስጀመርያ ጊዜው አብቅቷል።"
    redirect_to new_meda_masjemer_url
  end
end

በ‘ማብቂያ_አረጋግጤ (mabqiya_aregagtie) ዘዴ ውስጥ የመቃጠያ ፍተሻውን ወደ መሕለፈቃል_ዳማስጀመሪያ_አብቅቷልን? (mehlefeqal_damasjemerya_abqtualn?) ቅርፀ ዘዴ አስተላልፈነዋል፤ ይህ ትንሽ አወዛጋቢ ነው፣ እናም ከጥቂት ጊዜ በኋላ የምንበይነው ይሆናል፡፡

ዝርዝር 12.16 የእነዚህን ማጣሪያዎች አተገባበር እና ከአንደኛው (1) እስከ አራተኛው (4) ያሉትን ክስተቶች የሚተገብረውን የ‘አዘምን (update) ተግባርን በአንድ ላይ በማጣመር ያሳያል። ሁለተኛው (2) ክስተት የ‘አርትዕ (edit) ቅጽ እንደገና ሲቀርብ፣ በዝርዝር 12.14 ውስጥ ከጋራ ከፊል የተገኙ የስህተት መልዕክቶችን በራስሰር በማሳየት ይስተናገዳል፡፡ አራተኛው (4) ክስተት ከአንድ የተሳካ ለውጥ ጋር ይዛመዳል፣ ውጤቱም ልክ እንደ አንድ የተሳካ ግባት ጋር ተመሳሳይ ነው (ዝርዝር 8.32)፡፡

በሁለተኛው (2) ክስተት ያልተስተናገደው ብቸኛው ውድቀት መሕለፈቃሉ ባዶ በሚሆንበት ጊዜ ነው፣ ይህም በአሁኑ ጊዜ በተጠቃሚ ቅርጸታችን (ዝርዝር 10.13) የተፈቀደ ስለሆነ፣ ይህም መያዝ እና በቁም ነገር መስተካከልን ይፈልጋል፡፡3 ይህ ማለት ደግሞ ከላይ ከጠቀስናቸው ክስተቶች ውስጥ ሶስተኛው (3) ነው ማለት ነው፡፡ በዚህ ጉዳይ ላይ የእኛ ዘዴ፣ የ‘ስህተቶች.ጨምር (errors.add) ዘዴን በመጠቀም በ‘@ተጠቃሚ (@teteqami) ቁስ የስህተት መልዕክቶች ላይ አንድ ስህተትን በቀጥታ ማከል ይሆናል:-

@teteqami.errors.add(:password, :blank)

ይህ መሕለፈቃሉ ባዶ በሚሆንበት ጊዜ፣ ነባሪ መልእክቱ ባዶ ለሆነ ይዘት፣ ይጠቀምበት ዘንድ ያዘጋጀዋል።4

ከአንደኛው (1) እስከ አራተኛው (4) ያሉትን ስተቶች እና የ‘አዘምን (update) ተግባርን ባንድነት ማስቀመጡ፣ በዝርዝር 12.16 ላይ ያለውን ውጤት ያስገኛል፡፡

ዝርዝር 12.16: ለመሕለፈቃል ዳግም ማስጀመርያ የ‘አዘምን (update) ተግባርን ማከል። app/controllers/meda_masjemers_controller.rb
class MedaMasjemersController < ApplicationController
  before_action :teteqami_aggn, only: [:edit, :update]
  before_action :bqu_teteqami,  only: [:edit, :update]
  before_action :mabqiya_aregagtie, only: [:edit, :update]    # ክስተት (1)

  def new
  end

  def create
    @teteqami = Teteqami.find_by(emelekt: params[:meda_masjemer][:emelekt].downcase)
    if @teteqami
      @teteqami.masjemer_fech_fter
      @teteqami.masjemer_emelekt_laki
      flash[:info] = "አንድ የኤመልእክት ከመሕለፈቃል ዳግም ማስጀመርያ መመሪያዎችጋ ተልኮልዋታል።"
      redirect_to root_url
    else
      flash.now[:danger] = "የኤመልእክት አድራሻዎት አልተገኘም።"
      render 'new'
    end
  end

  def edit
  end

  def update
    if params[:teteqami][:password].empty?                 # ክስተት (3)
      @teteqami.errors.add(:password, "ባዶ መሆን አይቻልም።")
      render 'edit'
    elsif @teteqami.update(teteqami_negariaseitoch)        # ክስተት (4)
      reset_session
      gba @teteqami
      flash[:success] = "መሕልፈቃልዎ ዳግም መስራት ጀምሯል።"
      redirect_to @teteqami
    else
      render 'edit'                                        # ክስተት (2)
    end
  end

  private

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

    # ቅድመአጣሪወች

    def teteqami_aggn
      @teteqami = Teteqami.find_by(emelekt: params[:emelekt])
    end

    # አንድ ብቁ ተጠቃሚን ያረጋግጣል።
    def bqu_teteqami
      unless (@teteqami && @teteqami.nq? &&
              @teteqami.teregagtualn?(:masjemer, params[:id]))
        redirect_to root_url
      end
    end

    # የዳግም ማስጀመሪያ ይስሙላው ጊዜ ማብቃቱን ይፈትሻል።
    def mabqiya_aregagtie
      if @teteqami.mehlefeqal_damasjemerya_abqtualn?
        flash[:danger] = "የመሕለፈቃል ዳግም ማስጀመርያው ጊዜው አብቅቷል።"
        redirect_to new_meda_masjemer_url
      end
    end
end

ለሁለቱም፣ ማለት የመሕለፈቃል እና የማረጋገጫ ባሕሪዎችን የሚፈቅድ፣ አንድ ተጠቃሚ_ነገሪአሴቶች (teteqami_negariaseitoch) የተባለ ዘዴ እንዳከልን ልብ በሉ (ክፍል 7.3.2)።

ከዚህ በላይ እንደተጠቀሰው፣ ዝርዝር 12.16 ውስጥ ያለው አተገባበር፣ በኮዱ በኩል ለተጠቃሚ ቅርጸቱ፣ የመሕለፈቃል ዳግም ማስጀመርያ መቃጠያው፣ አንድ የቡልየን ፍተሻን ያቀርባል:-

@teteqami.mehlefeqal_damasjemerya_abqtualn?

ይሄ እንዲሰራ ለማድረግ፣ አንድ መሕለፈቃል_ዳማስጀመሪያ_አብቅቷልን? (mehlefeqal_damasjemerya_abqtualn?) የተባለ ዘዴን መበየን ይኖርብናል፡፡ በክፍል 12.2.1 በኤመልእክት ዝግጁገጽታወች ውስጥ እንደተመለከተው፣ የመሕልፈቃል ዳግም ማስጀመርያው ከተላከ ከሁለት ሰዓት በላይ ከሆነው ልክ እንደተቃጠለ አድርገን እንደምንቆጥረው እናያለን፣ ይህንንም በሩቢ እንደሚከተለው አድርገን ልንገልጸው እንችላለን፡-

masjemer_tesedede_at < 2.hours.ago

ይህን የ < ምልክትን እንደ “ያንሳል” ምልክት አድርጋችሁ ካነባባችሁት ግራ የሚያጋባ ሊሆን ይችላል፣ ምክንያቱም አባባሉ “ከሁለት ሰዓት ባነሰ ጊዜ ውስጥ የተላከ የመሕልፈቃል ዳግም ማስጀመርያ መልእክት” ስለሚመስል ነው፣ ይህም ከምንፈልገው ሃሳብ ጋር ይቃረናል፡፡ ስለዚህ በዚህ አውድ ውስጥ የ < ምልክትን እንደ “ቀደም ብሎ” የሚለውን አባባል እንደሚይዝ መረዳት አስፈላጊ ነው፣ ይህም “ከሁለት ሰዓት በፊት ቀደም ብሎ የተላከ የመሕልፈቃል ዳግም ማስጀመርያ መልእክት” የሚለውን መልእክት ያመጣል፡፡ የምንፈልገውም ይሄን ነው። ይህም በዝርዝር 12.17 ውስጥ ወዳለው ወደ መሕለፈቃል_ዳማስጀመሪያ_አብቅቷልን? (mehlefeqal_damasjemerya_abqtualn?) ዘዴ ይመራናል፡፡ (ንጽጽሩ ትክክለኛ መሆኑን ለማሳየት የቀረበውን አንድ መደበኛ ማሳያ ለማጤን በክፍል 12.6 የተሰጠውን ማረጋገጫ ተመልከቱ፡፡)

ዝርዝር 12.17: የመሕለፈቃል ዳግም ማስጀመሪያ ዘዴን በተጠቃሚ ቅርጸቱ ውስጥ ማከል። app/models/teteqami.rb
class User < ApplicationRecord
  .
  .
  .
  # አንድ የመሕለፈቃል ዳግም ማስጀመሪያ ጊዜው ካበቃ እውነትን ይመለሳል።
  def mehlefeqal_damasjemerya_abqtualn?
    masjemer_tesedede_at < 2.hours.ago
  end

  private
    .
    .
    .
end

ዝርዝር 12.17 ውስጥ ካለው ኮድ ጋር በዝርዝር 12.16 ውስጥ ያለው የ‘አዘምን (update) ተግባር አሁን መስራት ይኖርበታል፡፡ በብቁ እና ብቁ ባልሆነ ርክብ የሚገኙ ውጤቶች በምስል 12.12 ላይ እና በምስል 12.13 ላይ በቅደም ተከተል ይታያሉ፡፡ (በነገራችን ላይ የሰደድነው የመሕለፈቃል ዳግም ማስጀመሪያ ኤመልእክት ከሁለት ሰዓት በኋላ ጊዜው ሲቃጠል እንፈትሻለን ብለን ለሁለት ሰዓት መጠበቁ ትእግስትን መጨረስ ነው፡፡ እናም ይህንን የመፈተኑ ጉዳይ እንደ አንድ መልመጃ ይሆናችሁ ዘንድ፣ ለናንተ ተትቷል ("ከአቦል እስከ በረካ ቡና የምንጠጣበት ጊዜ አግኝተናል በለና" እንዳትሉኝ ብቻ) (ክፍል 12.3.3.1)፤ ለሶስቱ የ‘ከሆነ (if) ቅርንጫፎች የሚሆኑ ፈተናዎችን ግን አብረን እንጽፋለን።)

images/figures/password_reset_failure
ምስል 12.12: አንድ ያልተሳካ የመሕለፈቃል ዳግም ማስጀመሪያ።
images/figures/password_reset_success
ምስል 12.13: አንድ የተሳካ የመሕለፈቃል ዳግም ማስጀመሪያ።

መልመጃዎች

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

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

  1. እንደገና ከክፍል 12.2.1.1 ማለት በአገልጋዩ ዘጋቢ ውስጥ የተገኘውን የኤመልእክት አገናኝ ቀድታችሁ በአሳሻችሁ የአድራሻ መጻፊያ ላይ ገልብጡ እና የማይዛመዱ መሕለፈቃሎችን ለቅጹ አስረክቡ፡፡ ምን የሚል የስህተት መልእክት አገኛችሁ?
  2. በሰሌዳችሁ ውስጥ፣ የኤመልእክት አገናኙ ባለቤት የሆነውን ተጠቃሚ ፈልጉ እና፣ ከዚያ የ‘ፈጪ_ማስጀመር (masjemer_fech) ባሕሪ ዋጋውን ፈልጋችሁ አውጡ። ከዚያ ብቁ እና ተዛማጅ የሆኑ መሕለፈቃሎችን በምስል 12.12 ላይ ለታየው ቅጽ አስረክቡ፡፡ ማስረከቡ የሚሰራ ይመስላልን? የተጠቃሚው የ‘ፈጪ_ማስጀመር (masjemer_fech) ባሕሪ ላይ ምን ለውጥ አመጣ? ጠቃሚ ምክር:- አዲሱን ዋጋ ፈልጎ ለማውጣት ተጠቃሚ.ዳግምጫን‘ን (teteqami.reload) ተጠቀሙ።
  3. ክፍል 9.3.2.1 ውስጥ ከክፍለጊዜ ጠለፋ ለመጠበቅ፣ አንድ የክፍለጊዜ ይስሙላን ተግብረናል (ክፍል 9.1.1)። በአጋጣሚ ክፍለጊዜያቸው የተጠለፈባቸው ተጠቃሚዎችን ከጥፋት ለማዳን አንድ መደረግ የሚገባው ነገር ቢኖር፣ መሕለፈቃላቸውን ወዲያውኑ በድጋሜ ማስጀመር ይሆናል፡፡ ይህ በመደረጉ ምክንያት የመሕልፈቃል ዳግም ማስጀመርያው እንደዚህ ያሉትን የተጠለፉ ክፍለጊዜወች በራስሰር የሚያጠፋ ቢሆን ጥሩ ይሆናል፡፡ ስለሆነም ይህንን ለማከናወን፣ በዝርዝር 12.18 ውስጥ ይህን_ሙሉ የሚለው ቦታ ላይ አስፈላጊውን ኮድ እንድትጨምሩ ይጠይቃል፡፡ ጠቃሚ ምክር:- በዝርዝር 9.36 ላይ ዝክረ ፈጪውን፣ እንደ አንድ የክፍለጊዜ ይስሙላ አድርገን እንዳዲስ ተጠቅመንበት እንደነበረ አስታውሱ፣ የተጠቃሚ ቅርጸቱም ይህንን ለመሰረዝ ከቀድሞው አንድ የተነደፈ ዘዴ አለው (ዝርዝር 9.11)፡፡
ዝርዝር 12.18: መሕለፈቃልን ዳግም በማስጀመር ወቅት የማንኛውንም ተጠቃሚ ክፍለጊዜን አለመዘከር፡፡ app/controllers/meda_masjemers_controller.rb
class MedaMasjemersController < ApplicationController
  .
  .
  .
  def update
    if params[:teteqami][:password].empty?
      @teteqami.errors.add(:password, "ባዶ መሆን አይቻልም።")
      render 'edit'
    elsif @teteqami.update(teteqami_negariaseitoch)
      ይህን_ሙሉ
      reset_session
      gba @teteqami
      flash[:success] = "መሕልፈቃልዎ ዳግም መስራት ጀምሯል።"
      redirect_to @teteqami
    else
      render 'edit'
    end
  end
  .
  .
  .
end

12.3.3 የመሕለፈቃል ዳግም ማስጀመርያ ፈተና

በዚህ ክፍል ውስጥ፣ በዝርዝር 12.16 ውስጥ ከሚገኙት ከሶስቱ ቅርንጫፎች ውስጥ ሁለቱን ብቻ የሚሸፍን አንድ የውህደት ፈተናን እንጽፋለን፣ ይህ ፈተናም ብቁ እና ብቁ ያልሆነ ርክብን የሚፈትን ይሆናል (ከዚህ በፊት እንደተጠቀሰው፣ ሶስተኛውን ቅርንጫፍ የመፈተኑ ጉዳይ ለናንተ እንደ አንድ መልመጃ ይሆን ዘንድ ተትቷል፡፡ (ክፍል 12.3.3.1)) ለመሕለፈቃል ዳግም ማስጀመርያ የሚሆን አንድ የፈተና ፋይልን በማመንጨት እንጀምራለን:-

$ rails generate integration_test meda_masjemers
      invoke  test_unit
      create    test/integration/meda_masjemers_test.rb

ምንም እንኳን አጀማመራቸው ላይ ልዩነት ቢኖርም፣ የመሕለፈቃል ዳግም ማስጀመርያን ለመፈተን የሚረዱን ቅደም ተከተሎች ከዝርዝር 11.33 ማለት ከመለያ ማግበርያ የፈተና ቅደም ተከተሎች ጋር ግን በአብዛኛው ትይዩ ናቸው፤ መጀመሪያ የ“መሕለፈቃልወን ረሱ” ቅጽን እንጎበኝ እና አንድ ብቁ እና አንድ ብቁ ያልሆነ የኤመልእክት አድራሻን እናስረክባለን፣ የፊተኛው፣ አንድ የመሕለፈቃል ዳግም ማስጀመርያ ይስሙላን ይፈጥር እና አንድ የዳግም ማስጀመርያ ኤመልእክትን ይልካል። ከዚያ ከኤመልእክቱ ያገኘነውን አገናኝ ጎብኝትን፣ ብቁ እና ብቁ ያልሆነ መረጃን እንደገና በማስረከብ፣ በእያንዳንዱ ሁኔታ ላይ የሚጠበቀውን ትክክለኛ ባህሪ እናረጋግጣለን፡፡ ኮድን ለማንበብ እጅግ የሚረዳ መልመጃ ሊሆን የሚችል ቅደም ተከተልን ይዞ የመጣው የፈተና ውጤት፣ በዝርዝር 12.19 ላይ ይታያል።

ዝርዝር 12.19: ለመሕለፈቃል ዳግም ማስጀመሪያው የሚያገለግል አንድ የውህደት ፈተና። test/integration/meda_masjemers_test.rb
require 'test_helper'

class MedaMasjemersTest < ActionDispatch::IntegrationTest

  def setup
    ActionMailer::Base.deliveries.clear
    @teteqami = teteqamis(:michael)
  end

  test "መሕለፈቃል ዳግም ማስጀመርያ" do
    get new_meda_masjemer_path
    assert_template 'meda_masjemers/new'
    assert_select 'input[name=?]', 'meda_masjemer[emelekt]'
    # ብቁ ያልሆነ ኤመልእክት
    post meda_masjemers_path, params: { meda_masjemer: { emelekt: "" } }
    assert_not flash.empty?
    assert_template 'meda_masjemers/new'
    # ብቁ ኤመልእክት
    post meda_masjemers_path,
         params: { meda_masjemer: { emelekt: @teteqami.emelekt } }
    assert_not_equal @teteqami.masjemer_fech, @teteqami.reload.masjemer_fech
    assert_equal 1, ActionMailer::Base.deliveries.size
    assert_not flash.empty?
    assert_redirected_to root_url
    # የመሕለፈቃል ዳግም ማስጀመርያ ቅጽ
    teteqami = assigns(:teteqami)
    # የተሳሳተ ኤመልእክት
    get edit_meda_masjemer_path(teteqami.masjemer_ysmula, emelekt: "")
    assert_redirected_to root_url
    # ያልነቃ ተጠቃሚ
    teteqami.toggle!(:nq)
    get edit_meda_masjemer_path(teteqami.masjemer_ysmula, emelekt: teteqami.emelekt)
    assert_redirected_to root_url
    teteqami.toggle!(:nq)
    # ብቁ ኤመልእክት ከተሳሳተ ኤመልእክት ጋር
    get edit_meda_masjemer_path('የተሳሳተ ይስሙላ', emelekt: teteqami.emelekt)
    assert_redirected_to root_url
    # ብቁ ኤመልእክት ከብቁ ይስሙላ ጋር
    get edit_meda_masjemer_path(teteqami.masjemer_ysmula, emelekt: teteqami.emelekt)
    assert_template 'meda_masjemers/edit'
    assert_select "input[name=emelekt][type=hidden][value=?]", teteqami.emelekt
    # ብቁ ያልሆነ መሕለፈቃል እና ማረጋገጫ
    patch meda_masjemer_path(teteqami.masjemer_ysmula),
          params: { emelekt: teteqami.emelekt,
                    teteqami: { password:            "angesom",
                            password_confirmation: "araya" } }
    assert_select 'div#error_explanation'
    # ባዶ መሕለፈቃል
    patch meda_masjemer_path(teteqami.masjemer_ysmula),
          params: { emelekt: teteqami.emelekt,
                    teteqami: { password:              "",
                            password_confirmation: "" } }
    assert_select 'div#error_explanation'
    # ብቁ መሕለፈቃል እና ማረጋገጫ
    patch meda_masjemer_path(teteqami.masjemer_ysmula),
          params: { emelekt: teteqami.emelekt,
                    teteqami: { password:              "biniam",
                            password_confirmation: "biniam" } }
    assert geb_tual?
    assert_not flash.empty?
    assert_redirected_to teteqami
  end
end

ዝርዝር 12.19 ውስጥ ያሉትን አብዛኛዎቹን ሃሳቦች ቀደም ሲል በዚህ ስልጠና ላይ አይተናቸዋል፤ አንድ ያላየነው አዲስ ነገር ቢኖር የ‘ግብዓት (input) መለያን መፈተንን ነው:-

assert_select "input[name=emelekt][type=hidden][value=?]", teteqami.emelekt

ይህ በአንድ የ‘ግብዓት (input) መለያ ውስጥ ትክክለኛ ስም፣ (የተደበቀ) አይነት እና የኤመልእክት አድራሻ መኖሩን ያረጋግጣል:-

<input id="emelekt" name="emelekt" type="hidden" value="michael@example.com" />

ዝርዝር 12.19 ኮድ ውጤት ምክንያት የፈተና ስብስቡ አረንጓዴመሆን አለበት:-

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

መልመጃዎች

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

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

  1. ዝርዝር 12.6 ውስጥ የተመለከተው የ‘ማስጀመር_ፈጪ_ፍጠር (masjemer_fech_fter) ዘዴ ባሕሪ_አዘምን‘ን (update_attribute) ሁለት ተግባራትን እንዲፈጽም ይጠይቃል፣ እያንዳንዱ ተግባርም አንድ የተለየ የውሂበጎታ ግንኙነትን ይጠይቃል፡፡ በዝርዝር 12.21 ውስጥ የሚታየው ዝግጁገጽታ ላይ እንደተመለከተው ይህን_ሙሉ የሚለው ቦታ ላይ የሚያስፈልገውን ኮድ በመሙላት፣ ሁለቱንም የ‘ባሕሪ_አዘምን (update_attribute) ዘዴ ጥሪዎች፣ አምዶች_አዘምን (update_columns) በተባለ ዘዴ በመተካት ወደ አንድ ነጠላ ጥሪ ተኩ፡፡ እነዚህን ለውጦች ካደረጋችሁ በኋላ፣ የፈተና ስብስቡ አሁንም አረንጓዴመሆኑን አረጋግጡ። (በዝርዝር 11.39 ላይ የተሰጣችሁን መልመጃ ለማቃለል ያህል፣ ዝርዝር 12.21 የመልመጃውን መፍትሄ በከፊሉ ያካትታል፡፡)
  2. ዝርዝር 12.22 ውስጥ የሚታየው ዝግጁገጽታ ላይ እንደተመለከተው ይህን_ሙሉ የሚለው ቦታ ላይ የሚያስፈልገውን ኮድ በመሙላት፣ በዝርዝር 12.16 ውስጥ የመሕልፈቃል ዳግም ማስጀመሪያው ጊዜው እንደተቃጠለ የሚያረጋግጥ አንድ የውህደት ፈተናን ጻፉ፡፡ (ይህ ኮድ መልስ.አካል (response.body) የተባለ ዘዴን ያስተዋውቃል፣ ይህም የገጹን ሙሉ የ‘ሃ.ጽ.መ.ቋ አካል ይመልሳል።) አንድ የተቃጠለ ጊዜ ውጤትን ለመፈተን የሚያገለግሉ ብዙ መንገዶች አሉ፣ ነገር ግን በዝርዝር 12.22 የቀረበው ዘዴ፣ የተመለሰው አካል በገጹ ውስጥ “expired” የሚል ቃል ማካተቱን (በመልከፊደል-ግድየለሽነት) ይፈትሻል።
  3. ከሁለት ሰዓታት በኋላ፣ የመሕለፈቃል ዳግም ማስጀመሪያወችን፣ እንዲቃጠሉ ማድረጉ አንዱ ጥሩ የጥበቃ ቅድመ ጥንቃቄ ቢሆንም እንኳ፣ ተጠቃሚዎች የህዝብ ኮምፒተርን ተጠቅመው መሕለፈቃላቸውን ዳግም ለማስጀመር በሚፈልጉበት ጊዜ፣ እነሱን ከጥቃት ለመከላከል አንድ ጥሩ መፍትሄ አለ፡፡ ለምሳሌ:- ተጠቃሚው የመሕለፈቃል ዳግም ማስጀመሪያውን፣ ህዝብ የሚገለገልበት ኮምፒዩተርን ተጠቅሞ መሕለፈቃሉን ዳግም ቢያስጀምር እና ዘግቶ ከድሩ ቢወጣ፣ ሌላ ሰው የኋሊት አዝራሩን በመጠቀም፣ ወደኋላ በመመለስ ከአሳሹ ክፍለጊዜወች ላይ የሚፈለገውን መረጃ ከወሰደ በኋላ፣ መሕለፈቃሉን በመቀየር እንደተጠቃሚው ሁኖ ወደ ድሩ ሊገባ ይችላል። ይህ የሚሆንበት ምክንያት ደግሞ የመሕለፈቃል ዳግም ማስጀመርያ አገናኙ ለሁለት ሰዓት ያህል የሚቆይ ስለሆነ እና ተጠቃሚው ከጣቢያው ቢወጣም እንኳን የመሕለፈቃል ዳግም ማስጀመርያ አገናኙ ሊያገለግል ስለሚችል ነው። ይህንን ለማስተካከል ማለት መሕለፈቃልን ዳግም ማስጀመሩ የተሳካ ከሆነ፣ የተላከውን የመሕለፈቃል ዳግም ማስጀመርያ መረጃውን ለማጽዳት (የማስጀመር ፍጪውን ለማጽዳት) በዝርዝር 12.23 ላይ የሚታየውን ኮድ በፋይላችሁ ውስጥ አክሉ፡፡5
  4. በሶስተኛው መልመጃ ላይ የተሰጠውን የማስጀመርያ ፍጪ መጽዳቱን ለመፈተን፣ በዝርዝር 12.19 ፈተና ላይ አንዲት መስመር ፈተናን አክሉ። ጠቃሚ ምክር:- የ‘ፈጪ_ማስጀመር (masjemer_fech) ባሕሪን በቀጥታ ለመፈተን፣ ተጠቃሚ.ዳግምጫን‘ን (teteqami.reload) (ዝርዝር 11.33) እና (ለመጀመሪያ ጊዜ በዝርዝር 9.25 ላይ የታየውን) ምንምን-አረጋግጥ‘ን (assert_nil) በአንድ ላይ አጣምሩ፡፡
ዝርዝር 12.21: አምዶች_አዘምን‘ን (update_columns) ለመጠቀም የሚያገለግል አብነት። app/models/teteqami.rb
class Teteqami < ApplicationRecord
  attr_accessor :zkre_ysmula, :magberya_ysmula, :masjemer_ysmula
  before_save   :emelekt_nious_melkefidel
  before_create :magberya_fech_fter
  .
  .
  .
  # አንድ መለያን ያነቃል።
  def agbr
    update_columns(nq: true, nq_at: Time.zone.now)
  end

  # የመሕለፈቃል ዳግም ማስጀመር ኤመልእክትን ይልካል፡፡
  def masjemer_emelekt_laki
    TeteqamiMailer.meda_masjemer(self).deliver_now
  end

  # የመሕለፈቃል ዳግም ማስጀመርያ ባሕርያትን ያዘጋጃል።
  def masjemer_fech_fter
    self.masjemer_ysmula = Teteqami.adis_ysmula
    update_columns(masjemer_fech:  ይህን_ሙሉ, masjemer_tesedede_at: ይህን_ሙሉ)
  end

  # የመሕለፈቃል ዳግም ማስጀመር ኤመልእክትን ይልካል፡፡
  def masjemer_emelekt_laki
    TeteqamiMailer.meda_masjemer(self).deliver_now
  end

  private

    # የኤመልክትን ወደ ንዑስ ፊደል ይለውጣል።
    def emelekt_nious_melkefidel
      self.emelekt = emelekt.downcase
    end

    # ማግበሪያ ይስሙላን እና ፍጪን ይፈጥር እና ይመድባል።
    def magberya_fech_fter
      self.magberya_ysmula = Teteqami.adis_ysmula
      self.magberya_fech   = Teteqami.fech(magberya_ysmula)
    end
end
ዝርዝር 12.22: ጊዜው ለተቃጠለ የመሕለፈቃል ዳግም ማስጀመርያ የሚያገለግል አንድ ፈተና። አረንጓዴ test/integration/meda_masjemers_test.rb
require "test_helper"

class MedaMasjemersTest < ActionDispatch::IntegrationTest

  def setup
    ActionMailer::Base.deliveries.clear
    @teteqami = teteqamis(:michael)
  end
  .
  .
  .
  test "ጊዜው ያለፈበት ይስሙላ" do
    get new_meda_masjemer_path
    post meda_masjemers_path,
         params: { meda_masjemer: { emelekt: @teteqami.emelekt } }

    @teteqami = assigns(:teteqami)
    @teteqami.update_attribute(:masjemer_tesedede_at, 3.hours.ago)
    patch meda_masjemer_path(@teteqami.masjemer_ysmula),
          params: { emelekt: @teteqami.emelekt,
                    teteqami: { password:              "foobar",
                            password_confirmation: "foobar" } }
    assert_response :redirect
    follow_redirect!
    assert_match /ይህን_ሙሉ/i, response.body
  end
end
ዝርዝር 12.23: በተሳካ የመሕለፈቃል ዳግም ማስጀመር ወቅት የማስጀመርያ ፈጪውን ማጽዳት። app/controllers/meda_masjemers_controller.rb
class MedaMasjemersController < ApplicationController
  .
  .
  .
  def update
    if params[:teteqami][:password].empty?
      @teteqami.errors.add(:password, "ባዶ መሆን አይቻልም።")
      render 'edit'
    elsif @teteqami.update(teteqami_negariaseitoch)
      gba @teteqami
      @teteqami.update_attribute(:masjemer_fech, nil)
      flash[:success] = "መሕልፈቃልዎ ዳግም መስራት ጀምሯል።"
      redirect_to @teteqami
    else
      render 'edit'
    end
  end
  .
  .
  .
end

12.4 ኤመልእክት በምርት ላይ

አሁን በማበልጸጊያ ውስጥ የሚሰራ የመሕለፈቃል ዳግም ማስጀመርያ አለን፣ በዚህ ክፍል ውስጥ እሱኑ በምርት ውስጥም እንዲሰራ እናደርገዋለን፡፡ በዚህ ክፍል ውስጥ የምንከተላቸው ቅደም ተከተሎች በሙሉ ከመለያ ማግበርያ ጋር አንድ አይነት ስለሆኑ፣ ክፍል 11.4 ‘ን ከተከታተላችሁ በቀጥታ ወደ ዝርዝር 12.24 መዝለል ትችላላችሁ፡፡ አለበለዚያ ግን መጀመሪያ በክፍል 11.4 ውስጥ ያሉትን መመሪያዎች ተከትላችሁ ማጠናቀቅ እና ከዚያ ወደዚህ ተመልሳችሁ መምጣት ይኖርባችኋል።

በዚህ ጊዜ የርዕስ ቅርንጫፉን ከዋና ቅርንጫፉ ጋር ማዋሃድ ይኖርባችኋል (ዝርዝር 12.24)፡፡

ዝርዝር 12.24: መሕለፈቃልን-ዳግም-ማስጀመር ቅርንጫፍን ከዋናው (main) ቅርንጫፍ ጋር ማዋሃድ።
$ rails test
$ git add -A
$ git commit -m "የመሕለፈቃል ዳግም ማስጀመርያን ማከል"
$ git checkout main
$ git merge መሕለፈቃልን-ዳግም-ማስጀመር

ከዚያ ኮዱን ወደ ሩቅ ማከማቻ ግፉ እና ወደ ሃረኩ አሰማሩት:-

$ rails test
$ git push && git push heroku
$ heroku run rails db:migrate

አፕልኬሽናችሁ በሃረኩ ላይ ከተሰማራ በኋላ “መሕለፈቃልወን ረሱ” የሚለውን አገናኝ ላይ ጠቅ በማድረግ (ምስል 12.4) መሕለፈቃላችሁን ዳግም ማስጀመር ትችላላችሁ፡፡ ውጤቱ በምስል 12.14 ላይ እንደሚታየው፣ አንድ የዳግም ማስጀመሪያ ኤመልእክት መሆን አለበት፡፡ አገናኙን መከተል እና ብቁ ወይም ብቁ ያልሆኑ ርክቦችን ማስረከቡ፣ ልክ በማበልጸግ ላይ እንደሰሩት ሁሉ በምርቱ ላይም እንደዛው መስራት አለባቸው (ምስል 12.12 እና ምስል 12.13)፡፡ በተመሳሳይም፣ ተጠቃሚው መሕለፈቃሉን በተሳካ ሁኔታ ሲቀይር፣ ወደ መገለጫ ገጹ መዟዟር ይኖርበታል (ምስል 12.15)፡፡

images/figures/reset_email_production
ምስል 12.14: በምርት ላይ የተላከ አንድ የመሕለፈቃል ዳግም ማስጀመርያ ኤመልእክት።
images/figures/successful_reset_production
ምስል 12.15: በምርት ላይ አንድ የተሳካ የመሕለፈቃል ዳግም ማስጀመርያ ውጤት።

መልመጃዎች

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

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

  1. በምርት አፕልኬሽኑ ላይ ለአንድ አዲስ መለያ ተመዝገቡ። ለተመዘገባችሁት መለያ አንድ ኤመልእክት አገኛችሁን?
  2. የሚሰራ መሆኑን ለማረጋገጥ፣ በማግበርያ ኤመልእክት ውስጥ ያለው አገናኝ ላይ ጠቅ አድርጉ። በአገልጋይ ዘጋቢው ውስጥ ያለው ተዛማጁ ግቤት ምን ይመስላል? ጠቃሚ ምክር:- በማዘዥያ መስመሩ ላይ የ‘ሃረኩ ዘጋቢዎች‘ን (heroku logs) አስኪዱ።
  3. የመሕልፈቃላችሁን በተሳካ ሁኔታ ማዘመን ቻላችሁን?

12.5 ማጠቃለያ

ከተጨመረው የመሕለፈቃል ዳግም ማስጀመሪያ ጋር፣ የአፕልኬሽናችን የመመዝገቢያ፣ የመግቢያ እና የመውጫ ፋብሪካው፣ ሞያዊ የሆነ ደረጃን በመያዝ ተጠናቋል፡፡ ቀሪው የሩቢ ኦን ሬይልስ ስልጠና ትዊተር መሰል አጪርጽሑፎችን (ምዕራፍ 13) እና የተከታይ ተጠቃሚዎች የቅምጦች ሁኔታ ቀላቢ ላይ በመመስረት፣ አንድ ጣቢያን መገንባት ይሆናል (ምዕራፍ 14)፡፡ በሂደቱ ስለ ምስል ሰቀላ፣ ስለ ብጁ የውሂበጎታ መጠይቆች እና ስለ የላቀ የውሂብ ቅርጸት ከ‘ብዙ_አለው (has_many) እና ብዙ_አለው በኩል (has_many :through) ጋር ጨምሮ፣ ስለ አንዳንድ እጅግ ጠቃሚ ስለሆኑ የሬይልስ በይነገጻትም እንማራለን።

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

  • የመሕለፈቃል ዳግም ማስጀመርያዎች የንቅ መዝገብ ቁሶች ባይሆኑም እንኳ፣ ልክ እንደ ክፍለጊዜወች እና መለያ ማግበርያዎች፣ ልክ እንደ አንድ ሃብት ተደርገው ሊቀረጹ እንደሚችሉ፣
  • ሬይልስ ኤመልእክትን ለመላክ፣ የአክሽን ሜይለር ተግባሮችን እና ትይታዎችን ማመንጨት እንደሚችል፣
  • አክሽን ሜለር ጥሬ-ጽሑፍን እና ሃ.ጽ.መ.ቋን እንደሚደግፍ፣
  • ልክ እንደማንኛውም ተግባር እና ትይታ ሁሉ፣ በሜይለር ውስጥ የተበየኑ ቅርፀ ተለዋዋጮች በሜይለር ትይታወች ውስጥም እንደሚገኙ፣
  • የመሕለፈቃል ዳግም ማስጀመርያዎች፣ መሕለፈቃልን ዳግም ለማስጀመር፣ የሚያገለግል አንድ ልዩ ዓ.አ.ሃ.አን ለመፍጠር፣ አንድ የመነጨ ይስሙላን እንደሚጠቀሙ፣
  • የመሕለፈቃል ዳግም ማስጀመርያዎች፣ ብቁ የዳግም ማስጀመርያ መጠይቆችን፣ በጥብቅ ለመለየት፣ አንድ ክትፍ ማስጀመርያ ፍጪን እንደሚጠቀሙ፣
  • ሁለቱም፣ የሜይለር እና የውህደት ፈተናወች የተጠቃሚ ሜይለርን ባህሪ ለማጣራት ጠቃሚ እንደሆኑ እና በመጨረሻም
  • በምርት ውስጥ ሴንድግሪድን በመጠቀም ኤመልእክትን መላክ እንደምንችል ተምረናል።

12.6 የጊዜ መቃጠል ንጽጽር ጪብጥነት ማረጋገጥ

አንድ የመሕለፈቃል ዳግም ማስጀመሪያ፣ መቸ እንደሚቃጠል ለመወሰን የንጽጽር ፈተናው በዝርዝር 12.17 ላይ እንደሚታየው:-

masjemer_tesedede_at < 2.hours.ago

መሆኑን በክፍል 12.3 ተመልክተናል፡፡ አባባሉ “ከሁለት ሰዓት ባነሰ ጊዜ ውስጥ የተላከ የመሕለፈቃል ዳግም ማስጀመሪያ መልእክት” ተብሎ የሚነበብ ይመስላል፣ ይህም ከምንፈልገው ሃሳብ ጋር ይቃረናል፡፡ በዚህ ክፍል ውስጥ ከዚህ በላይ ያለው ንጽጽር ትክክል መሆኑን እናረጋግጣለን፡፡6

ሁለት የተለያዩ ጊዜያቶችን በመበየን እንጀምራለን፡፡ \( \Delta t_r \) የመሕለፈቃል ዳግም ማስጀመሪያው ከተላከበት ጊዜ ጀምሮ ያለውን ጊዜ ቢይዝ እና \( \Delta t_e \) ደግሞ ለመሕለፈቃል ዳግም ማስጀመሪያው የተላከው ኤመልእክት የሚቃጠልበትን የጊዜ ገደብ የሚይዝ ቢሆን (ለምሳሌ ሁለት ሰዓት)፣ የመሕለፈቃል ዳግም ማስጀመሪያው ከተላከ በኋላ ያለው ጊዜ፣ የተቃጠለበት ጊዜ ከተገደበው ጊዜ ከበለጠ፣ የመሕለፈቃል ዳግም ማስጀመሪያው ተቃጥሏል ማለት ነው:-

\begin{equation} \label{eq:time_delta} \Delta t_r > \Delta t_e. \end{equation}

የአሁኑን ጊዜ \( t_N \) ብንል፣ የመሕለፈቃል ዳግም ማስጀመሪያው የተሰደደበት ጊዜን ደግሞ \( t_r \) ብንል እና የሚቃጠልበት ጊዜን \( t_e \) ብንል (ለምሳሌ ከሁለት ሰዓት በፊት)

\begin{equation} \label{eq:delta_p} \Delta t_r = t_N - t_r \end{equation}

እና

\begin{equation} \label{eq:delta_e} \Delta t_e = t_N - t_e ማግኘት እንችላለን፡፡ \end{equation}

Eq. (12.2) እና Eq. (12.3) ‘ን በ (12.1) ውስጥ በማስገባት የሚከተለውን ማግኘት እንችላለን:-

\[ \begin{array}{rcl} \Delta t_r & > & \Delta t_e \\ t_N - t_r & > & t_N - t_e \\ -t_r & > & -t_e, \end{array} \]

ይህንንም በ \( -1 \) ማባዛቱ ይህንን ያስገኛል:-

\begin{equation} \label{eq:time_comparison} t_r < t_e. \end{equation}

(12.4) ‘ን \( t_e = \mathrm{ከ 2\ ሰዓት\ በፊት} \) ዋጋ ጋር ወደ ኮድ መለወጡ፣ በዝርዝር 12.17 ውስጥ የተመለከተውን የ‘መሕለፈቃል_ዳማስጀመሪያ_አብቅቷልን? (mehleefeqal_damasjemerya_abqtualn?) ዘዴን ይሰጠል:-

def mehlefeqal_damasjemerya_abqtualn?
  masjemer_tesedede_at < 2.hours.ago
end

ክፍል 12.3 ላይ እንደተጠቀሰው፣ የ < ምልክትን “ያንሳል” ብለን ከማንበብ ይልቅ “ቀደም ብሎ” ብለን ካነበብነው ይህ ኮድ “የመሕለፈቃል ዳግም ማስጀመሪያው ከሁለት ሰዓት በፊት ቀደም ብሎ ተልኳል” የሚለውን የእንግሊዝኛ ዓረፍተ ነገር ትርጉም ይሰጣል፡፡

1. ይህ ምዕራፍ በዝርዝር 11.6 ውስጥ ያለውን የኤመልእክት መላኪያ ከመጠቀም በስተቀር ከሌሎቹ ጋር የማይገናኝ ብቸኛ ምዕራፍ ነው፤ ግን ከምዕራፍ 11 ጋር በጣም ይዛመዳል፣ ስለዚህ ያንን ምዕራፍ በመጀመሪያ ከተከታተላችሁ ይህንን ምዕራፍ መከታተሉ በጣም የቀለለ ይሆናል፡፡
2. የቀረበው የኤመልእክት አድራሻ አለመኖሩን ስለመግለጽ፣ የሚቀርቡ የጥበቃ ስጋቶች በተለምዶ የተሳሳቱ ናቸው፡፡ ምክንያቱም ይህ የኤመልእክት አድራሻ ቀድሞውኑ ያለ የኤመልእክት አድራሻ እንዲመዘግቡ የማይፈቅላቸው ብዙ ድሮች ላይ በጥቅም የዋለ ነው። ስለዚህ አንድ የቀረበ የኤመልእክት አድራሻ፣ የመሕለፈቃል ዳግም ማስጀመርያ አለመኖሩን ለሚጠቁሙ አጥቂዎች ተጨማሪ መረጃ እንደማይሰጣቸው ያመለክታል፡፡
3. እዚህ ላይ እኛ መሕለፈቃሉ ባዶ በሚሆንበት ጊዜ ብቻ ባዶነቱን ማስተናገድ አለብን፣ ምክንያቱም ማረጋገጫው ባዶ ከሆነ፣ የማረጋገጫ ማስረገጫው (መሕለፈቃሉ ባዶ ከሆነ የሚዘለው) ችግሩን ይዞ ተገቢውን የስህተት መልእክት ስለሚያቀርብ ነው፡፡
4. የተከበሩ አንባቢ አቶ ካልድ ታልብ ሬይልስ-አይ18ኤን (rails-i18n) እንቁን በምትጠቀሙበት ጊዜ፣ የ‘ስህተቶች.አክል(:መሕለፈቃል, :ባዶ) (errors.add(:password, :blank)) ዘዴ፣ የስህተት መልእክቱን በመረጡት ቋንቋ እንደሚያቀርብ አበስረዋል (ይህ ማለት የስህተት መልእክቱ በአማርኛ እንዲሆን ከተፈለገ በአማርኛ እንዲሆን ማድረግ ይቻላል ማለት ነው)፡፡
5. የተከበሩ አንባቢ ትሪስታን ሉዶዊክ ይህ ገጸባህሪ በአፕልኬሽኑ ውስጥ እንዲታከል አስተያየት የሰጡና እንዲሁም ስላተገባበሩ እና ስለሁሉ ሁኔታ ጥልቅ የሆነ ማብራርያ ስለሰጡኝ ከልብ ላመሰግናቸው እወዳለሁ፡፡
6. ይህ ማረጋገጫ፣ በአንድ የፒኤች.ዲ ፊዚዝስት የተጻፈ የድር ማበልጸጊያ ስልጠናን ለማንበብ የምትከፍሉት ዋጋ ነው፡፡ ይህንን:- \( \left(-\frac{\hbar^2}{2m}\nabla^2 + V\right)\psi = E\psi \) ወይም ይህንን:- \( G^{\mu\nu} = 8\pi T^{\mu\nu} (=4\tau T^{\mu\nu}) \) በመጀመሪያው አንቀጽ ውስጥ አስገብቶ ለመስራት የሚያስችል መንገድ ማግኘት አልቻልኩም።