ምዕራፍ 11 የመለያ ማግበሪያ

በአሁኑ ጊዜ፡ ለድሩ አዲስ የተመዘገቡ ተጠቃሚዎች፣ ልክ መለያቸውን እንዳወጡ፣ ወዲያውኑ በመለያቸው የመጠቀም ሙሉ ችሎታ አላቸው (ምዕራፍ 7)፤ በዚህ ምዕራፍ ውስጥ ተጠቃሚወቹ ለመመዝገብ የተጠቀሙበት የኤመልእክት አድራሻ የራሳቸው መሆኑን ለማረጋገጥ፣ አንድ የመለያ ማግበሪያ ሂደትን ተግባራዊ እናደርጋለን።1 ይህም አንድ የማግበሪያ ይስሙላ እና አንድ ፍጪን ከአንድ ተጠቃሚ ጋር ማዛመድን፣ ለተጠቃሚው ይስሙላውን የያዘ አንድ አገናኝ ኤመልእክት ማድረግን እና ተጠቃሚው የተሰደደለትን አገናኝ ጠቅ በሚያደርግበት ጊዜ ማግበርን ያሳትፋል። በምዕራፍ 12 ላይ ተጠቃሚዎች መሕለፈቃላቸውን ከረሱ ዳግም እንዲያስጀምሩ ተመሳሳይ ሀሳቦችን ተግባራዊ እናደርጋለን፡፡ እነዚህን ሁለት ገጸባህሪያት ተግባር ላይ ለማዋል፣ ለእያንዳንዱ ገጸባህሪ አንድ አዲስ ሃብት መፍጠርን ስለሚያሳትፍ፣ እገረ መንገዳችንን ስለ መቆጣጠሪያወች፣ ማዘዋወሪያወች እና የውሂበጎታ ፍልሰቶች ተጨማሪ ምሳሌዎችን እንድናይ እድል ይሰጡናል። በሂደቱም በሬይልስ ውስጥ በምርት እና በማበልጸጊያ ውስጥ አንድ የኤመልእክትን እንዴት መላክ እንደሚቻል የመማር እድሉ ይኖረናል፡፡

የመለያ ማግበርሪያን የምናስተናግድበት የአሰራር ስልት ከተጠቃሚ መግቢያ (ክፍል 8.2) እና በተለይ ተጠቃሚዎችን ከመዘከር (ክፍል 9.1) ጋር ትይዩ ይሆናል፡፡ መሰረታዊው ቅደም ተከተል እንደሚከተለው ይቀርባል፡-2

  1. ተጠቃሚዎችን በአንድ “ያልነቃ” ሁኔታ ላይ ማስጀመር፣
  2. አንድ ተጠቃሚ ሲመዘገብ አንድ የማግበሪያ ይስሙላ እና አንድ ተዛማጅ የማግበሪያ ፍጪን ማመንጨት፣
  3. የማግበሪያ ፍጪውን በውሂበጎታው ላይ ማስቀመጥ እና ከዚያ የማግበሪያ ይስሙላውን እና የተጠቃሚውን የኤመልእክት አድራሻ የያዘ አንድ አገናኝን ወደ ተጠቃሚው ኤመልእክት ማድረግ፣3
  4. ተጠቃሚው አገናኙን ጠቅ ሲያደርግ፣ ተጠቃሚውን በኤመልእክት አድራሻው መሰረት ፈልጎ ማገኘት እና ከዚያ ውሂበጎታው ጋር ካለው የተጠቃሚው ማግበሪያ ፍጪ ጋር በማመሳከር ይስሙላውን ማረጋገጥ እና በመጨረሻ፣
  5. ተጠቃሚው የተረጋገጠ ከሆነ ሁኔታውን ከ“ያልነቃ” ወደ “ንቅ” መለወጥ ይሆናል፡፡

የመለያ ማግበሪያ አሰራር ከመሕለፈቃል እና ከዝክረ ይስሙላ ጋር በመመሳሰሉ የተነሳ፣ ለመለያ ማግበሪያ (እንዲሁም ለመሕለፈቃል ዳግም ማስጀመሪያ) የ‘ተጠቃሚ.ፈጪ‘ን (Teteqami.digest) የ‘ተጠቃሚ.አዲስ_ይስሙላ‘ን (Teteqami.adis_ysmula) እና አንድ የተሻሻለ የ‘ተጠቃሚ.ተረጋግጧልን? (teteqami.teregagtualn?) ዘዴን ጨምሮ ብዙ ተመሳሳይ ሀሳቦችን በድጋሜ መጠቀም እንችላለን፡፡ ሰንጠረዥ 11.1 ዘዴወቹ ያላቸውን ተመሳሳይነት በምሳሌ ያሳያል (ምሳሌው በምዕራፍ 12 ላይ የምንመለከተውን የመሕለፈቃል ዳግም ማስጀመሪያ ያካትታል)፡፡

ዘዴ ፈልግ በ ሃረግ ፍጪ ማረጋገጫ
ግባት emelekt password password_digest authenticate(password)
ዘክረኝ id zkre_ysmula zkre_fech teregagtualn?(:zkre, ysmula)
የመለያ ግባሬ emelekt magberya_ysmula magberya_fech teregagtualn?(:magberya, ysmula)
የመሕለፈቃል ዳግም ማስጀመርያ emelekt masjemer_ysmula masjemer_fech teregagtualn?(:masjemer, ysmula)
ሰንጠረዥ 11.1: በመግቢያ፣ በመዘከር፣ በመለያ ማግበሪያ እና በመሕለፈቃል ዳግም ማስጀመሪያ መካከል ያለ ተመሳሳይነት፡፡

ክፍል 11.1 ውስጥ ለመሕለፈቃል ዳግም ማስጀመሪያ አንድ ሃብት እና አንድ የውሂብ ቅድን እንሰራለን፣ ክፍል 11.2 ላይ ደግሞ የመለያ ማግበሪያ ኤመልእክቶችን ለመላክ አንድ መላኪያን (Mailer) እናክላለን። በክፍል 11.3 ላይ ሰንጠረዥ 11.1 ውስጥ የሚገኘውን የ‘ተረጋግጧልን? (teregagtualn?) ዘዴ አጠቃላይ ስሪትን አካቶ ትክክለኛውን የመለያ ማግበሪያ ተግባራዊ እናደርጋለን።

11.1 የመለያ ማግበሪያ ሃብት

ክፍል 8.1 ላይ እንዳለው የክፍለጊዜወች ቅድ የመለያ ማግበሪያው ከ‘ንቅ መዝገብ ቅርጸት ጋር ባይዛመድም፣ የመለያ ማግበሪያውን ግን ልክ እንደ አንድ ሃብት አድርገን ቅድ እናወጣለታለን። እናም ተገቢውን ውሂብ (የማግበሪያ ይስሙላውን እና የማግበሪያ ሁኔታውን ጨምሮ) በተጠቃሚው ቅርጸት ውስጥ እናካትተዋለን።

መለያ ማግበሪያወችን ልክ እንደ አንድ ሃብት አድርገን ስለምንቆጥራቸው፣ ከእነሱ ጋር በአንድ መደበኛ ው.ሁ.ማ ዓ.አ.ሃ.አ በኩል እንገናኛለን። የማግበሪያ አገናኙ የተጠቃሚውን የማግበር ሁኔታን ይቀይረዋል፣ እናም ለእንዲህ ዓይነቶቹ መሻሻሎች መደበኛው የው.ሁ.ማ አሰራር፣ ለ‘አዘምን (update) ተግባር አንድ የ‘ዓዘምን (PATCH) መጠይቅን መስጠት ነው (ሰንጠረዥ 7.1)፡፡ የግባሬ አገናኙ በአንድ ኤመልእክት በኩል መላክ አለበት፤ ይህም ከዓዘምን (PATCH) ይልቅ የ‘ዓግኝ (GET) መጠይቅን የሚሰጥ አንድ መደበኛ የአሳሽ ጠቅታ ማድረግን ያሳትፋል። በዚህ ንድፍ እገዳ ምክንያት፣ የ‘አዘምን (update) ተግባርን መጠቀም አንችልም ማለት ነው፤ ስለሆነም በምትኩ ለ‘ዓግኝ (GET) መጠይቆች ምላሽ የሚሰጠውን የ‘አርትዕ (edit) ተግባርን እንጠቀማለን።

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

$ git checkout -b የመለያ-ማግበሪያ

11.1.1 የመለያ ማግበሪያወች መቆጣጠሪያ

ልክ እንደ ተጠቃሚዎች እና ልክ እንደ ክፍለጊዜወች፣ የመለያ ማግበሪያወች ሃብቶች ተግባሮችም (በአሁኑ ሁኔታ ላይ ብቸኛው ተግባር) በአንድ መለያ ማግበሪያወች መቆጣጠሪያ ውስጥ ይኖራሉ፡፡ እነሱንም እንደሚከተለው አድርገን ማመንጨት እንችላለን:-4

$ rails generate controller MeleyaMagberyas

ክፍል 11.2.1 እንደምንመለከተው፣ የመለያ ማግበሪያ ኤመልእክቱ አንድ የዚህን:-

edit_magberya_magberya_url(magberya_ysmula, ...)

አይነት ቅርጸት ያለው ዓ.አ.ሃ.አ ማድረግን ያሳትፋል፤ ይህ ማለት ለ‘አርትዕ (edit) ተግባር አንድ ስዩም ማዘዋወሪያ ያስፈልገናል ማለት ነው፡፡ እሱንም በዝርዝር 11.1 ውስጥ በሚታየው በ‘ሃብቶች (resources) ዘዴ ማዘጋጀት እንችላለን፣ ይህም በሰንጠረዥ 11.2 ውስጥ የሚታየውን የሙሉው.ሁ.ማ ማዘዋወሪያን ይሰጣል።

ዝርዝር 11.1: ለመለያ ማግበሪያ የ‘አርትዕ (edit) ተግባር አንድ ማዘዋወሪያን ማከል። 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]
end
የሃ.ጽ.ማ.ስ መጠይቅ ዓ.አ.ሃ.አ ተግባር ስዩም ማዘዋወርያ
GET /meleya_magberya/<ysmula>/edit edit edit_meleya_magberya_url(ysmula)
ሰንጠረዥ 11.2: ዝርዝር 11.1 ውስጥ በመለያ ማግበሪያወች ሃብት የቀረበው የሙሉው.ሁ.ማ ማዘዋወሪያ፡፡

የመለያ ማግበሪያወች የውሂብ ቅዱን እና የኤመልእክት መላኪያውን ከጨረስን በኋላ፣ የ‘አርትዕ (edit) ተግባሩን በክፍል 11.3.2 ላይ እንበይነዋለን፡፡

መልመጃዎች

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

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

  1. የፈተና ስብስቡ አሁንም አረንጓዴመሆኑን አረጋግጡ።
  2. ሰንጠረዥ 11.2 _መንገድ (_path) ብሎ ስዩም ማዘዋወሪያን ከመዘርዘር ይልቅ ለምን _ዓአሃአ (_url) ብሎ ስዩም ማዘዋወሪያን ይዘረዝራል? ጠቃሚ ፍንጪ አሁን በአንድ ኤመልእክት ላይ ልንጠቀምበት ነው፡፡

11.1.2 የመለያ ማግበሪያ የውሂብ ቅድ

በመግቢያው ላይ እንደተብራራው፣ በማግበሪያ ውስጥ አንድ ኤመልእክትን ለመጠቀም አንድ ልዩ የማግበሪያ ይስሙላ ያስፈልገናል፡፡ አንደኛው አማራጪ በውሂበጎታው ውስጥ የተቀመጠውን እና በማግበሪያ ዓ.አ.ሃ.አው ውስጥ የተካተተውን ማለት ሁለቱንም የያዘ አንድ ሃረግን መጠቀም ነው፤ ነገር ግን ውሂበጎታችን ከተጠለፈ ይህ አሰራር የጥበቃ ችግር ያስከትላል፡፡ ለምሳሌ፣ አንድ የውሂበጎታው መዳረሻ ያለው አጥቂ አዲስ የተፈጠሩ መለያዎችን ወዲያውኑ ሊያነቃ (በዚህም እንደ ተጠቃሚው ሁኖ መግባት ይችላል) እና ከዚያ ሁሉንም ነገር መቆጣጠር ይችል ዘንድ፣ መሕለፈቃሎቹን ሊለውጣቸው ይችላል፡፡ 5

ስለዚህ እንደዚህ ያሉ ክስተቶችን ለመከላከል፣ በምዕራፍ 6 የመሕለፈቃልን እና በምዕራፍ 9 ላይ ደግሞ ዝክረ ይስሙላ ላይ የተጠቀምነውን አሰራር በመከተል፣ አንድ በይፋ ለህዝብ የተጋለጠ ምናባዊ ባሕሪን ከአንድ በውሂበጎታው ውስጥ ከተቀመጠ ጥብቅ ክትፍ ፍጪ ጋር እናጣምራለን፡፡ ይህን መንገድ በመጠቀም:-

teteqami.magberya_ysmula

የማግበሪያ ይስሙላውን መድረስ እና ይህን በመሰለ ኮድ ደግሞ ተጠቃሚውን ማረጋገጥ እንችላለን:-

teteqami.teregagtualn?(:magberya, ysmula)

(ይህ በዝርዝር 9.6 ውስጥ የተበየነውን የተረጋግጧልን? (teregagtualn?) ዘዴን ማሻሻልን ይጠይቃል።)

እንዲሁም በተጠቃሚ ቅርጸቱ ውስጥ አንድ ንቅ (nq) የተባለ የቡልየን ባሕሪ እናክላለን፤ ይህም በክፍል 10.4.1 ላይ ያየነው ዓይነት በራስ-የመነጨ የቡልየን ዘዴን በመጠቀም አንድ ተጠቃሚ ንቅ መሆኑን ለመፈተሽ ያስችለናል።

if teteqami.nq? ...

በመጨረሻም፣ በዚህ ስልጠና ውስጥ ባንጠቀማቸውም፣ ለወደፊቱ ማጣቀሻ እንዲሆነን ከተፈለገ በማለት የተጠቃሚዎቹ መለያ መስራት የጀመረበትን ቀን እና ሰዓት በውሂበጎታው ላይ መዝገበናል። ሙሉ የውሂብ ቅዱ በምስል 11.1 ላይ ይታያል፡፡

user_model_account_activation
ምስል 11.1: የተጠቃሚ ቅርጸቱ ከታከሉ የመለያ ማግበሪያ ባሕሪዎች ጋር።

ምስል 11.1 ላይ ያለውን የውሂብ ቅድ ወደ ውሂበጎታው ለማከል የሚደረገው ፍልሰት በማዘዥያ መስመሩ ላይ ሶስት ባሕሪዎችን ያክላል:-

$ rails generate migration add_magberya_to_teteqamis \
  magberya_fech:string nq:boolean nq_at:datetime

ዝርዝር 11.2 ላይ እንደሚታየው፣ በዝርዝር 10.54 ላይ ለ‘አስተዳዳሪ (astedadari) ባሕሪ እንዳደረግነው ሁሉ፣ ለ‘( nq) ባሕሪም አንድ ነባሪ የ‘ሃሰት (false) ዋጋን እናክላለን፡፡

ዝርዝር 11.2: (መረጃ-ጠቋሚ የተጨመረበት) አንድ የመለያ ማግበሪያ ፍልሰት። db/migrate/[ማህተመጊዜ]_add_magberya_to_teteqamis.rb
class AddMagberyaToTeteqamis < ActiveRecord::Migration[6.0]
  def change
    add_column :teteqamis, :magberya_fech, :string
    add_column :teteqamis, :nq, :boolean, default: false
    add_column :teteqamis, :nq_at, :datetime
  end
end

ከዚያም እንደተለመደው፣ ፍልሰቱን ተግባራዊ እናደርጋለን፡-

$ rails db:migrate

የማግበሪያ ይስሙላ መልሰጥሪ

እያንዳንዱ አዲስ የተመዝገብ ተጠቃሚ ማግበርያ ስለሚያስፈልገው፣ ለእያንዳንዱ የተጠቃሚ ቁስ ከመፈጠሩ በፊት አንድ የማግበሪያ ይስሙላ እና አንድ ፍጪን መሰየም ይኖርብናል። በክፍል 6.2.5 ውስጥ አንድ ተመሳሳይ ሃሳብን አይተናል፤ በክፍሉም አንድ ተጠቃሚን ውሂበጎታው ውስጥ ከማስቀመጣችን በፊት የኤመልእክት አድራሻውን ወደ ንዑስ-ፊደል ቀይረናል፡፡ በዛ ሁኔታ ላይ፣ አንድ የ‘ከመቀመጥ_በፊት (before_save) መልሰጥሪን ከንዑስ-ፊደል (downcase) ዘዴ ጋር በማጣመር ተጠቅመናል (ዝርዝር 6.32)። አንድ የ‘ከመቀመጥ_በፊት (before_save) መልሰጥሪ፣ ቁሱ ውሂበጎታው ላይ ከመቀመጡ በፊት በራስሰር ይጠራል፣ ይህም በሁለቱም ማለት አዲስ ቁስ በሚፈጠርበት እና ቁሱ በሚዛመንበት ጊዜ ሳይቀር ይጠራል፡፡ በማግበሪያ ፍጪው ረገድ የምንፈልገው መልሰጥሪ ግን ተጠቃሚው ከተፈጠረ ብቻ ስራውን የሚጀምር ነው፡፡ ይህንን ለማድረግ ደግሞ አንድ ከመፈጠር_በፊት (before_create) የተባለ መልሰጥሪ ያስፈልገናል፤ ይህንንም እንደሚከተለው አድርገን እንበይነዋለን:-

before_create :magberya_fech_fter

ይህ ዘዴ ማጣቀሻ (Method Reference) ተብሎ የሚጠራ ኮድ፣ ሬይልስን አንድ ማግበርያ_ፈጪ_ፍጠር (magberya_fech_fter) የተባለ ዘዴን እንዲፈልግ እና ተጠቃሚው ከመፍጠሩ በፊት እንዲያስኬደው ያዘጋጀዋል፡፡ (በዝርዝር 6.32 ውስጥ ለ‘ከመቀመጥ_በፊት (before_save) መልሰጥሪ አንድ ግልጽ ጥምርን አሳልፈንለት ነበር፤ በአጠቃላይ የሚመረጠው ግን የዘዴ ማጣቀሻ ስልቱ ነው።) የ‘ማግበርያ_ፈጪ_ፍጠር (magberya_fech_fter) ዘዴው ራሱ ጥቅም ላይ የሚውለው በተጠቃሚ ቅርጸቱ ውስጣዊ አሰራር ላይ ብቻ ነው፤ ይህ ማለት ዘዴው ከተጠቃሚ (Teteqami) ክፍል ውጪ ባሉ ሌላ ክፍሎች ላይ ጥቅም ላይ እንዳይውል መጋለጥ የለበትም ማለት ነው፤ በክፍል 7.3.2 ውስጥ እንዳየነው፣ በሩቢ መንገድ ይህንን ማከናወኑ ደግሞ የግል (private) የተባለውን ቁልፍቃልን እንዲህ አድርጎ በመጠቀም ነው:-

private

  def magberya_fech_fter
    # ይስሙላውን እና ፍጪውን ፍጠር።
  end

ልክ በዚህ የሰሌዳ ክፍለ ጊዜ ውስጥ እንደሚታየው፣ በአንድ ክፍል ውስጥ ከ‘ግል (private) ቁልፍቃል በኋላ፣ የተበየኑ ዘዴወች ሁሉ በራስሰር ከሌላው ክፍል ወይም ቁስ የተደበቁ ናቸው:-

$ rails console
>> Teteqami.first.magberya_fech_fter
NoMethodError: private method `magberya_fech_fter' called for #<Teteqami>

የ‘ከመፈጠር_በፊት (before_create) መልሰጥሪው ጥቅሙ፣ ይስሙላውን እና ተዛማጅ ፍጪውን መሰየም ነው፤ ይህንንም እንደሚከተለው አድርገን ማከናወን እንችላል፡-

self.magberya_ysmula  = Teteqami.adis_ysmula
self.magberya_fech    = Teteqami.fech(magberya_ysmula)

ይህ ኮድ በቀላሉ፣ በዝክረ ይስሙላ ጥቅም ላይ የዋሉትን የፍጪ እና የይስሙላ ዘዴወችን በድጋሜ ይጠቀማል፣ ይህንንም ከዝርዝር 9.3 የ‘ዘክር (zekr) ዘዴ ጋር በማነጻጸር ማየት እንችላለን:-

# በቋሚ ክፍለጊዜዎች ውስጥ ለመጠቀም አንድ ተጠቃሚን በውሂበጎታው ውስጥ መዘከር።
def zekr
  self.zkre_ysmula = Teteqami.adis_ysmula
  update_attribute(:zkre_fech, Teteqami.fech(zkre_ysmula))
end

በ‘ዘክር (zekr) ሁኔታ ላይ ያለው ዋናው ልዩነት የ‘ባሕሪ_አዘምን (update_attribute) አጠቃቀሙ ነው፤ ዝክረ ይስሙላወች እና ፍጪወች የተፈጠሩት፣ ከድሮው ተፈጥረው በውሂበጎታ ውስጥ ላሉት ተጠቃሚዎች ስለሆነ እነሱን ለማዘመን ይህንን ዘዴ መጠቀሙ የግድ ነው፤ ከመፈጠር_በፊት (before_create) መልሰጥሪ ግን በአንጻሩ ተጠቃሚው ከመፈጠሩ በፊት የሚከሰት ነው፤ ስለዚህ ምንም ዓይነት የሚዘመን ባሕሪ የለም ማለት ነው፤ እናም የሁለቱ ልዩነት ይሄው ነው። በመልሰጥሪው ምክንያት፣ አንድ አዲስ ተጠቃሚ ከአዲስ.ተጠቃሚ (Teteqami.new) ጋር ሲበየን (ልክ በዝርዝር 7.19 ላይ እንዳለው የተጠቃሚ ምዝገባ) ሁለቱንም ማለት የ‘ማግበርያ_ይስሙላ (magberya_ysmula) እና የ‘ማግበርያ_ፈጪ (magberya_fech) ባሕሪወችን በራስሰር ያገኛል፤ የኋለኛው ባሕሪ ውሂበጎታው ውስጥ ካለው አንድ አምድ ጋር ስለሚዛመድ (ምስል 11.1) ተጠቃሚው ሲቀመጥ ውሂበጎታው ላይ በራስሰር ይጻፋል።

እስከአሁን ድረስ የተወያየንባቸውን ነገሮች በአንድላይ ማስቀመጡ፣ በዝርዝር 11.3 ውስጥ የሚታየውን የተጠቃሚ ቅርጸትን ያስገኛል፡፡ በማግበሪያ ይስሙላው ምናባዊ ተፈጥሮ ምክንያት እንደተጠየቀው፣ በቅርጸታችን ውስጥ አንድ ሁለተኛ የ‘ባሕሪ_መዳረሻ‘ን (attr_accessor) አክለናል፡፡ በዛውም የዝርዝር 6.32 የኤመልእክት አድራሻ ንዑስ-ፊደል መልሰጥሪን በአንድ የዘዴ ማጣቀሻ ለመተካት እድሉን እንደተጠቀምን አስተውሉ፡፡

ዝርዝር 11.3: በተጠቃሚ ቅርጸት ውስጥ የመለያ ማግበሪያ ኮድን ማከል። አረንጓዴ app/models/teteqami.rb
class Teteqami < ApplicationRecord
  attr_accessor :zkre_ysmula, :magberya_ysmula
  before_save   :emelekt_nious_melkefidel
  before_create :magberya_fech_fter
  validates :sim,  presence: true, length: { maximum: 50 }
  .
  .
  .
  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

መዝራት እና የእቃ ተጠቃሚዎች

ከመቀጠላችን በፊት፣ በዝርዝር 11.4 እና ዝርዝር 11.5 ውስጥ እንደሚታዩት፣ የናሙና እና የፈተና ተጠቃሚዎችን ከመጀመሪያው ይነቁ ዝንድ፣ የዘራችን እና የእቃወቻችንን ውሂቦች ማዘመን አለብን፡፡ (የ‘ጊዜ.ሰቅ.አሁን (Time.zone.now) ዘዴ በአገልጋዩ ላይ ያለውን የጊዜ ሰቅ ከግምት ውስጥ በማስገባት፣ ወቅታዊውን ማህተመጊዜ የሚመልስ አንድ አብሮገነብ የሬይልስ ረጅ ነው።)

ዝርዝር 11.4: የዘር ተጠቃሚዎችን በነባሪነት ማንቃት። db/seeds.rb
# አንድ ዋና የናሙና ተጠቃሚን መፍጠር።
Teteqami.create!(sim:  "Abnet Teteqami",
             emelekt: "msalie@railstutorial.org",
             password:              "foobar",
             password_confirmation: "foobar",
             astedadari: true,
             nq: true,
             nq_at: Time.zone.now)

# መአት ተጠቃሚዎችን ማመንጨት።
99.times do |n|
  sim  = Faker::Name.name
  emelekt = "msalie-#{n+1}@railstutorial.org"
  password = "mehlefeqal"
  Teteqami.create!(sim:  sim,
               emelekt: emelekt,
               password:              password,
               password_confirmation: password,
               nq: true,
               nq_at: Time.zone.now)
end
ዝርዝር 11.5: የእቃ ተጠቃሚዎችን ማንቃት። test/fixtures/teteqamis.yml
michael:
  sim: Abnet Teteqami
  emelekt: michael@misalei.com
  password_digest: <%= Teteqami.fech('mehlefeqal') %>
  astedadari: true
  nq: true
  nq_at: <%= Time.zone.now %>

ermias:
  sim: Ermias Leake
  emelekt: duchess@example.gov
  password_digest: <%= Teteqami.fech('mehlefeqal') %>
  nq: true
  nq_at: <%= Time.zone.now %>

gerie:
  sim: Tomas Gerie
  emelekt: hands@example.gov
  password_digest: <%= Teteqami.fech('mehlefeqal') %>
  nq: true
  nq_at: <%= Time.zone.now %>

abeba:
  sim: Abeba Melake
  emelekt: boss@example.gov
  password_digest: <%= Teteqami.fech('mehlefeqal') %>
  nq: true
  nq_at: <%= Time.zone.now %>

<% 30.times do |n| %>
teteqami_<%= n %>:
  sim:  <%= "Teteqami #{n}" %>
  emelekt: <%= "teteqami-#{n}@example.com" %>
  password_digest: <%= Teteqami.fech('mehlefeqal') %>
  nq: true
  nq_at: <%= Time.zone.now %>
<% end %>

ዝርዝር 11.4 ላይ የተደረጉትን ለውጦች ለመተግበር፣ እንደተለመደው ውሂቡን በድጋሜ ለመዝራት፣ ውሂበጎታውን በድጋሜ አስጀምሩ፡-

$ rails db:migrate:reset
$ rails db:seed

መልመጃዎች

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

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

  1. በዚህ ክፍል ውስጥ ከተደረጉት ለውጦች በኋላም፣ የፈተና ስብስቡ አሁንም አረንጓዴ መሆኑን አረጋግጡ።
  2. በሰሌዳው ውስጥ፣ አንድ የተጠቃሚ ቁስን ከፈጠራችሁ በኋላ፣ የ‘ማግበርያ_ፈጪ_ፍጠር (magberya_fech_fter) ዘዴን በፈጠራችሁት የተጠቃሚ ቁስ ላይ በመጥራት፣ ዘዴው አንድ የግል ዘዴ በመሆኑ የተነሳ፣ አንድ የ‘ዘዴስህተትየለም (NoMethodError) ስህተትን በሰሌዳው ውስጥ እንደሚያስነሳ አረጋግጡ፡፡ የተጠቃሚው የማግበርያ ፍጪ ዋጋ ምንድነው?
  3. ዝርዝር 6.35 ላይ፣ የኤመልእክት አድራሻን ንዑስ-ፊደል ለማድረግ በቀላሉ እንዲህ ኤመልእክት.ንዑስፊደል (emelekt.downcase!) (ማለት ያለ ምንም ምደባ) በማለት በአንድ መስመር ላይ መጻፍ እንደምንችል አይተናል፤ ስለዚህ በዝርዝር 11.3 ላይ ያለውን የ‘ኤመልእክት_ንዑስ_መልከፊደል (emelekt_nious_melkefidel) ዘዴን በዛ መልኩ ጻፉ እና ለውጡ መስራቱን ለማረጋገጥ የፈተና ስብስቡን አስኪዱ።

11.2 የመለያ ማግበሪያ ኤመልእክቶች

የውሂብ ቅዱ ስለተጠናቀቀ አሁን አንድ የመለያ ማግበሪያ ኤመልእክትን ለመላክ የሚያስፈልገውን ኮድ ለማከል ዝግጁ ነን፡፡ ይህንን ተግባራዊ ለማድረግ፣ አንድ የተግባር መላኪያ (Action Mailer) የተባለ ቤተኮድን በመጠቀም፣ አንድ የተጠቃሚ መላኪያን (Teteqami mailer) ማከል ሲሆን፤ ይህንንም አንድ የኤመልእክትን ከአንድ ማግበሪያ አገናኝ ጋር ለመላክ፣ በተጠቃሚዎች መቆጣጠሪያ የ‘ፍጠር (create) ተግባር ውስጥ እንጠቀምበታለን፡፡ የኤመልእክት መላኪያዎቹ እንደ መቆጣጠሪያ ተግባር ሲዋቀሩ፣ የኤመልእክት ዝግጁገጽታወች ደግሞ ልክ እንደ ትይታወች ይበየናሉ፡፡ እነዚህ ዝግጁገጽታወች የማግበሪያ ይስሙላ አገናኞችን እና ከሚነቃው መለያ ጋር የሚዛመደውን የኤመልእክት አድራሻ ያካትታሉ።

11.2.1 የመላኪያ ዝግጁገጽታወች

ዝርዝር 11.6 ላይ እንደሚታየው፣ ልክ እንደ ቅርጸቶች እና መቆጣጠሪያወች፣ አንድ መላኪያንም ሬይልስ አመንጪን (rails generate) በመጠቀም ማመንጨት እንችላለን፡-

ዝርዝር 11.6: የተጠቃሚ መላኪያን ማመንጨት
$ rails generate mailer TeteqamiMailer meleya_magberya meda_masjemer

እዚህ ጋር፣ ዝርዝር 11.6 አሁን አስፈላጊ ከሆነው የ‘መለያ_ማግበርያ (meleya_magberya) ዘዴ በተጨማሪ፣ በምዕራፍ 12 ላይ የምንፈልገውን የ‘መዳ_ማስጀመር (meda_masjemer) ዘዴንም አመንጪቶልናል፤ ይህ ዘዴ መሕለፈቃልን ዳግም ለማስጀመር የሚያገለግል ዘዴ ሲሆን የመጀመሪያው ቃል (meda)፣ የአማርኛውን ቃል ለማሳጠር ሲባል “መሕለፈቃል ዳግም” የሚለውን ትርጓሜ እንዲይዝ ተብሎ የተደረገ አሕጽሮተ ቃል መሆኑን ልትገነዘቡት ይገባል፡፡

ዝርዝር 11.6 ውስጥ ያለው ትእዛዝ ለእያንዳንዱ መላኪያ ሁለት የትይታ ዝግጁገጽታወችን ያመነጫል፣ እነሱም አንድ ለጥሬ-ጽሑፍ ኤመልእክት እና አንድ ለሃ.ጽ.መ.ቋ ኤመልእክት የሚያገለግሉ ዝግጁገጽታወች ናቸው። የመለያ ማግበሪያ መላኪያ ዘዴወቹ በዝርዝር 11.7 እና ዝርዝር 11.8 ውስጥ ይታያሉ፡፡ (ተጓዳኞቹን የመሕለፈቃል ዳግም ማስጀመሪያ ዝግጁገጽታወች በምዕራፍ 12 ላይ እናስተናግዳቸዋለን።)

ዝርዝር 11.7: የመነጨው የመለያ ማግበሪያ የጽሑፍ ትይታ። app/views/teteqami_mailer/meleya_magberya.text.erb
Teteqami#meleya_magberya

<%= @greeting %>, find me in app/views/teteqami_mailer/meleya_magberya.text.erb
ዝርዝር 11.8: የመነጨው የመለያ ማግበሪያ የሃ.ጽ.መ.ቋ ትይታ። app/views/teteqami_mailer/meleya_magberya.html.erb
<h1>Teteqami#meleya_magberya</h1>

<p>
  <%= @greeting %>, find me in app/views/teteqami_mailer/meleya_magberya.html.erb
</p>

እስኪ አንዴ የመነጩት መላኪያዎች እንዴት እንደሚሰሩ ለማወቅ እንመልከታቸው (ዝርዝር 11.9 እና ዝርዝር 11.10)፡፡ በዝርዝር 11.9 ላይ በአፕልኬሽኑ ውስጥ ላሉት ሁሉም መላኪያዎች አንድ የጋራ ቅጽ (from) የሚል ነባሪ አድራሻ እንዳለ እናያለን፣ በተጨማሪም፣ በዝርዝር 11.10 ውስጥ ያሉ ሁለት ዘዴወች እያንዳንዱ አንድ የተቀባይ አድራሻ እንዳላቸውም እናያለን፡፡ (ምንም እንኳን በዚህ ስልጠና ላይ አስፈላጊ ባይሆንም፣ ዝርዝር 11.9 ከኤመልእክት ቅርጸት ጋር የሚዛመድ አንድ የኤመልእክት መላኪያ ገጽታንም ይጠቀማል፤ በውጤቱ የተገኙት የሃ.ጽ.መ.ቋው እና የጥሬ-ጽሑፍ መላኪያ ገጽታወቹ በ‘አፕ/ትይታወች/ገጽታዎች (app/views/layouts) ፋይል ውስጥ ሊገኙ ይችላሉ፡፡) የመነጨው ኮድ አንድ ቅርፀ ተለዋዋጪንም (@greeting) አክሏል፣ ይህም በመቆጣጠሪያወች ውስጥ ያሉ ቅርፀ ተለዋዋጮች በተራው ትይታ ውስጥ እንደሚገኙ ሁሉ፣ በተመሳሳይ መንገድ በመላኪያ ትይታወች ውስጥም እንደዛው ይገኛሉ፡፡

ዝርዝር 11.9: የመነጨው የአፕልኬሽኑ መላኪያ። app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  default from: 'from@example.com'
  layout 'mailer'
end
ዝርዝር 11.10: የመነጨው የተጠቃሚ መላኪያ። app/mailers/teteqami_mailer.rb
class TeteqamiMailer < ApplicationMailer

  # Subject can be set in your I18n file at config/locales/en.yml
  # with the following lookup:
  #
  #   en.teteqami_mailer.meleya_magberya.subject
  #
  def meleya_magberya
    @greeting = "Hi"

    mail to: "to@example.org"
  end

  # Subject can be set in your I18n file at config/locales/en.yml
  # with the following lookup:
  #
  #   en.teteqami_mailer.meda_masjemer.subject
  #
  def meda_masjemer
    @greeting = "Hi"

    mail to: "to@example.org"
  end
end

አንድ የሚሰራ የማግበሪያ ኤመልእክትን ለመላክ፣ በመጀመሪያ በዝርዝር 11.11 ላይ እንደሚታየው፣ የመነጨውን ዝግጁገጽታ እናበጀዋለን፡፡ ከዚያ፣ ተጠቃሚን የያዘ አንድ ቅርፀ ተለዋዋጪን እንፈጥር እና (እሱን ትይታ ላይ ለመጠቀም) ከዚያ ውጤቱን ወደ ተጠቃሚ.ኤመልእክት (teteqami.emelekt) እንሰዳለን (ዝርዝር 11.12)፡፡ በዝርዝር 11.12 ላይ እንደሚታየው፣ የ‘መልእክት (mail) ዘዴው፣ ዋጋው የኤመልእክቱ ርዕሰ-ጉዳይ ጥቅም ላይ የሚውል አንድ ርዕሰ-ጉዳይ (subject) የተባለ ቁልፍንም ይወስዳል። ማሳሰቢያ:- በምርት ላይ ኤመልእክትን (ክፍል 11.4) ለመላክ ካቀዳችሁ፣ በዝርዝር 11.11 ውስጥ ያለውን “noreply@example.com” ‘ን በእውነተኛ የኤመልእክት አድራሻችሁ መተካት ይኖርባችኋል፡፡

ዝርዝር 11.11: የአፕልኬሽኑ መላኪያ ከአንድ አዲስ ነባሪ ቅጽ (from) አድራሻ ጋር። app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  default from: "noreply@msalie.com"
  layout 'mailer'
end
ዝርዝር 11.12: የመለያ ማግበሪያ አገናኝን መላክ። ቀይ app/mailers/teteqami_mailer.rb
class TeteqamiMailer < ApplicationMailer

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

  def meda_masjemer
    @greeting = "Hi"

    mail to: "to@example.org"
  end
end

(መለያ_ማግበርያ‘ውን (meleya_magberya) አንድ ነጋሪአሴት እንዲወስድ ስላደረግነው) ዝርዝር 11.12 ላይ ያለው የመግለጫ ጽሑፉ እንደተመለከተው፣ ፈተኖቹ በአሁኑ ጊዜ ቀይ ሁነዋል፤ በክፍል 11.2.3 ላይ ወደ አረንጓዴ እንቀይራቸዋለን፡፡

ልክ ተራ ትይታዎች ላይ ክት ሩቢን እንደተጠቀምን ሁሉ፣ የዝግጁገጽታ ትይታዎችን ለማበጀትም ክት ሩቢን መጠቀም እንችላለን፤ በዚህ ሁኔታ ላይ አንድ ለተጠቃሚው በስሙ ሰላምታ የሚያቀርብ ጽሑፍ እና አንድ ብጁ የማግበሪያ አገናኝን እናበጃለን፡፡ ዕቅዳችን ተጠቃሚውን በኤመልእክት አድራሻው ፈልጎ ማግኘት እና የመለያ ይስሙላውን ማረጋገጥ ነው፤ ስለሆነም ወደ ተጠቃሚው የምንልከው አገናኝ፣ ሁለቱንም ማለት የኤመልእክት አድራሻውን እና ይስሙላውን ማካተት ይኖርበታል። አንድ የመለያ ማግበሪያ ሃብትን በመጠቀም የመለያ ማግበሪያውን ስለቀረጽን፣ ይስሙላው እራሱ በዝርዝር 11.1 ላይ የተበየነው፣ ስዩሙ ማዘዋወሪያ ላይ ልክ እንደ ነጋሪአሴቱ ዋጋ ሆኖ ሊታይ ይችላል:-

edit_meleya_magberya_url(@teteqami.magberya_ysmula, ...)

የዚህን አሰራር ታስታውሱ ከሆነ:-

edit_teteqami_url(teteqami)

አንድ ይህን የመሰለ ቅርጸት ያለው ዓ.አ.ሃ.አን ያስገኝ ነበረ:-

http://www.msalie.com/teteqamis/1/edit

አሁን ደግሞ ተዛማጁ የመለያ ማግበሪያ አገናኝ መሰረተ ዓ.አ.ሃ.አው የሚከተለውን አይነት ይመስላል:-

http://www.msalie.com/meleya_magberyas/q5lt38hQDc_959PVoo6b7A/edit

እዚህ ጋር ይህ q5lt38hQDc_959PVoo6b7A ከ‘አዲስ_ይስሙላ (adis_ysmula) ዘዴው የመነጨ አንድ ደህንነቱ የተጠበቀ የዓ.አ.ሃ.አ መሰረተ64 ሃረግ ሲሆን (ዝርዝር 9.2)፣ ይህም ልክ በ‘/ተጠቃሚወች/1/አርትዕ (/teteqamis/1/edit) ውስጥ እንዳለው የተጠቃሚ-መታወቂያ አንድ ዓይነት ሚናን ይጫወታል፡፡ በተላይ ደግሞ፣ በማግበሪወች መቆጣጠሪያ አርትዕ (edit) ተግባር ውስጥ ይስሙላው በ‘ሰሚአሴቶቹ (params) ተርታው ውስጥ ልክ እንደ ሰሚአሴቶች[:መታወቂያ] (params[:id]) ሆኖ ይገኛል፡፡

ኤመልእክቱን ከዓ.አ.ሃ.አ ጋር ለማካተት አንድ የመጠይቅ ሰሚአሴትን (query parameter) መጠቀም ይኖርብናል፣ ይህም በ ዓ.አ.ሃ.አው ውስጥ ከጥያቄ ምልክቱ በኋላ፣ ልክ እንደ ቁልፍ እና ዋጋ ሁኖ ይታያል:-6

meleya_magberyas/q5lt38hQDc_959PVoo6b7A/edit?email=foo%40msalie.com

በኤመልእክት አድራሻው ውስጥ ያለው የ ‘@’ ምልክት %40 ሆኖ ይታያል፤ ይህም የዓ.አ.ሃ.አው ዋጋ ተቀባይነት ያለው ለመሆኑ ዋስትናን ይሰጥ ዘንድ፣ ሆሄው በመ.ል.አ.መ.ኮ ተጽፎ “እንዳመለጠ” ልብ ልትሉት ይገባል፡፡ በሬይልስ ውስጥ አንድ የመጠይቅ ሰሚአሴትን የማዘጋጀት መንገዱ፣ በስዩሙ ማዘዋወሪያ ውስጥ አንድ ተርታን በማካተት ነው፡-

edit_meleya_magberya_url(@teteqami.activation_token, emelekt: @teteqami.emelekt)

የመጠይቅ ሰሚአሴትን ለመበየን ስዩም ማዘዋወሪያውን በዚህ መንገድ በምንጠቀምበት ጊዜ፣ ሬይልስ ማንኛውንም ልዩ ሆሄ ወደ መ.ል.አ.መ.ኮ ሆሄ ቀይሮ በመጻፍ በራስሰር ያመልጣል። የተገኘው የኤመልእክት አድራሻ እንዲሁ በመቆጣጠሪያው ውስጥ በራስሰር ያልተመለጠ ሲሆን፣ በ‘ሰሚአሴቶች[:ኤመልእክት] (params[:emelekt]) በኩልም ይገኛል።

ዝርዝር 11.13 እና በዝርዝር 11.14 ላይ እንደሚታየው፣ በዝርዝር 11.12 ውስጥ ከተበየነው የ‘@ተጠቃሚ (@teteqami) ቅርፀ ተለዋዋጪ ጋር የተሰየመውን የአርትዖት ማዘዋወሪያ እና ክት ሩቢውን በመጠቀም፣ የሚያስፈልጉትን አገናኞች መፍጠር እንችላለን፡፡ በዝርዝር 11.14 ውስጥ ያለው የሃ.ጽ.መ.ቋ ዝግጁገጽታ አንድ ብቁ አገናኝን ለመስራት አንድ የ‘ዓገናኝ (link_to) ዘዴን እንደሚጠቀም ልብ በሉ፡፡

ማሳሰቡያ:- በዝርዝር 11.13 እና ዝርዝር 11.14 ውስጥ ያለው አስተያየት እንደሚያመለክተው፣ ሁለቱም ዝርዝሮች አንድ በጥሬ አማርኛ እና አንድ በእንግሊዝኛ ፊደላት የተጻፈ የአማርኛ መልእክት ምርጫወችን ይሰጣሉ፤ ይህ የሆነበት ምክንያት ፈተናው የ US-ASCII ማለት ለመረጃ ልውውጥ የአሜሪካ መደበኛ ኮድ (መ.ል.አ.መ.ኮ) ሆሄን በገጹ ላይ ስለሚጠይቅ እና የአማርኛው ሆሄ ሌላ አይነት የሆሄ ቋንቋን ስለሚጠቀም ነው፡፡ ስለሆነም የአማርኛውን ስሪት ተጠቅማችሁ ፈተናው አላልፍ ካላችሁ በነዚሁ ዝርዝሮች ውስጥ የተሰጠውን አማራጪ መጠቀም ይኖርባችኋል (አስተያየቱን ቀድቶ መገልበጥ እንደለለባችሁ ታውቁ ይሆናል)፡፡ (ፈተናው የማያልፈው በዚህ ምክንያት ብቻ መሆኑን ካረጋገጣችሁ በኋላ፣ ለመውደቅ ምክንያት የሆነውን ገጽ ሙሉ በሙሉ ወደ አማርኛው ስሪት በመቀየር የፈተናውን አለማለፍ ወደ ጎን መተው ትችላላችሁ፡፡)

ዝርዝር 11.13: የመለያ ማግበሪያ የጽሑፍ ትይታ። app/views/teteqami_mailer/meleya_magberya.text.erb
ሰላም <%= @teteqami.sim %>፣

እንኳን ወደ ማሳያ አፕልኬሽኑ በደህና መጡ! መለያዎን ለማንቃት: እታች ያለው አገናኝ ላይ ጠቅ ያድርጉ:-

<%= edit_meleya_magberya_url(@teteqami.magberya_ysmula,
                            emelekt: @teteqami.emelekt) %>

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

Selam  <%= @teteqami.sim %> :-

Enkuwan wede Masaya aplcashinu bedehna metu! Meleyawen lemanqat etach yalew
agenang lay teq yadrgu:-

<%= edit_meleya_magberya_url(@teteqami.magberya_ysmula,
                            emelekt: @teteqami.emelekt) %>
ዝርዝር 11.14: የመለያ ማግበሪያ በሃ.ጽ.መ.ቋ ትይታ። app/views/teteqami_mailer/meleya_magberya.html.erb
<h2>ማሳያ አፕልኬሽን</h2>

<p>ሰላም <%= @teteqami.sim %></p>

<p>
እንኳን ወደ ማሳያ አፕልኬሽኑ በደህና መጡ! መለያዎን ለማንቃት: እታች ያለው አገናኝ ላይ ጠቅ
ያድርጉ:-
</p>

<%= link_to "አንቃ", edit_meleya_magberya_url(@teteqami.magberya_ysmula,
                                            emelekt: @teteqami.emelekt) %>

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

<h1>Masaya Application</h1>

Selam  <%= @teteqami.sim %> :-

<p>
Enkuwan wede Masaya aplcashinu bedehna metu! Meleyawen lemanqat etach yalew
agenang lay teq yadrgu:-
</p>

<%= link_to "Anqa", edit_meleya_magberya_url(@teteqami.magberya_ysmula,
                                            emelekt: @teteqami.emelekt) %>

መልመጃዎች

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

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

  1. በሬይልስ ሰሌዳ ውስጥ የሲጂአይ (CGI) ክፍለክፍል የ‘አስመልጥ (escape) ዘዴው፣ በዝርዝር 11.15 ላይ እንደሚታየው፣ የኤመልእክት አድራሻውን እንዳስመለጠ አረጋግጡ፡፡ "Lwam Konjo!"? የሚለው ሆሄ የአምልጦ ዋጋ ምንድነው?
ዝርዝር 11.15: አንድ ኤመልእክትን በ‘ሲጂአይ.አስመልጥ (CGI.escape) ማስመለጥ፡፡
>> CGI.escape('tesheme@msalie.com')
=> "tesheme%40msalie.com"

11.2.2 የኤመልእክት ቅድመ-እይታወች

ዝርዝር 11.13 እና በዝርዝር 11.14 ውስጥ የተበየኑትን የዝግጁገጽታወች ውጤቶችን ለማየት እና የኤመልእክት መልእክቶቻችን ምን እንደሚመስሉ ለመመልከት፣ በሬይልስ የተዘጋጁ ልዩ ዓ.አ.ሃ.አወችን ማለት “የኤመልእክት ቅድመ-እይታዎችን (Email Previews)” መጠቀም እንችላለን፡፡ በመጀመሪያ ግን፣ በዝርዝር 11.16 ላይ እንደሚታየው፣ በአፕልኬሽናችን ማበልጸጊያ አካባቢ ላይ አንዳንድ ውቅሮችን ማከል ይኖርብናል፡፡

ዝርዝር 11.16: በማበልጸጊያ ውስጥ ኤመልእክትን ማቀናበር። config/environments/development.rb
Rails.application.configure do
  .
  .
  .
  config.action_mailer.raise_delivery_errors = false

  host = 'example.com' # Don't use this literally; use your local dev host instead
  # Use this on the cloud IDE.
  config.action_mailer.default_url_options = { host: host, protocol: 'https' }
  # Use this if developing on localhost.
  # config.action_mailer.default_url_options = { host: host, protocol: 'http' }
  .
  .
  .
end

ዝርዝር 11.16 አንድ ምሳሌ.ኮም ('example.com') የተባለ የአስተናጋጅ ስምን ይጠቀማል፣ እዛው ውስጥ ባለው አስተያየት ላይ እንደተመለከተው፣ የራሳችሁን የማበልጸጊያ አካባቢ የአስተናጋጅ አድራሻን መጠቀም ይኖርባችኋል፡፡ ለምሳሌ:- በደመና ቅ.ማ.አ እንደዚህ አድርጋችሁ መጠቀም ትችላላችሁ:-

host = '<የአስራስድስትዮሽ ሃረግ>.vfs.cloud9.us-east-2.amazonaws.com'   # ደመና ቅ.ማ.አ
config.action_mailer.default_url_options = { host: host, protocol: 'https' }

ይህም እርግጠኛ ዓ.አ.ሃ.አው በአሳሻችሁ ላይ የሚታየው ዓ.አ.ሃ.አ ላይ የተመሰረተ መሆን ይገባዋል (ምስል 11.2)። (በተለይ us-east-2 የሚለው ክፍል ሊለያይ እንደሚችል ልብ ልትሉ ይገባል)

images/figures/hex_string
ምስል 11.2: የደመና ቅ.ማ.አው የዓ.አ.ሃ.አ አስተናጋጅ።

አንድ የሰፈር ስርዓትን የምትጠቀሙ ከሆነ ደግሞ፣ በምትኩ ይህንን መጠቀም ትችላላችሁ:-

host = 'localhost:3000'                     # የሰፈር አገልጋይ
config.action_mailer.default_url_options = { host: host, protocol: 'http' }

በተለይ፣ በላይኛው ምሳሌ ላይ ጥ.ሃ.ጽ.ማ.ስ (https) የሚለው ወደ ሃ.ጽ.ማ.ስ (http) እንደተቀየረ አስተውሉ፡፡

ዝርዝር 11.17 ላይ እንደሚታየው፣ በዝርዝር 11.16 ላይ ያደረግነውን ውቅረት ለማንቃት፣ የማበልጸጊያ አገልጋዩን እንደገና ካስጀመርን በኋላ፣ በክፍል 11.2 ላይ በራስሰር የመነጨውን የተጠቃሚ መላኪያ ቅድመ-እይታ ፋይልን ማዘመን ይኖርብናል፡፡

ዝርዝር 11.17: በራስሰር የመነጩት የተጠቃሚ መላኪያ ቅድመ-እይታዎች። 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
    TeteqamiMailer.meleya_magberya
  end

  # Preview this email at
  # http://localhost:3000/rails/mailers/teteqami_mailer/meda_masjemer
  def meda_masjemer
    TeteqamiMailer.meda_masjemer
  end

end

ዝርዝር 11.12 ውስጥ የተበየነው የ‘መለያ_ማግበርያ (meleya_magberya) ዘዴ አንድ ብቁ የተጠቃሚ ቁስን የሚያካትት፣ አንድ ነጋሪአሴትን ስለሚያስፈልግ፣ በዝርዝር 11.17 ውስጥ ያለው ኮድ አሁን ባለበት ሁኔታ አይሰራም፡፡ ይህን ለማስተካከል፣ በማበልጸጊያ ውሂበጎታ ውስጥ ካለው ከመጀመሪያው ተጠቃሚ ጋር፣ አንድ ተጠቃሚ (teteqami) የተባለ ተለዋዋጪን ከመደብን በኋላ ከዚያ እሱኑ እንደ አንድ ነጋሪአሴት በ‘ተጠቃሚመላኪያ.መለያማግበሪያ (TeteqamiMailer.meleya_magberya) ላይ አሳልፈነዋል (ዝርዝር 11.18)። ዝርዝር 11.18 በተጨማሪ፣ ተጠቃሚ.ማግበሪያይስሙላ‘ን (teteqami.magberya_ysmula) ከአንድ አዲስ የይስሙላ ዋጋ ጋር እንደመደበው ልብ በሉ፣ ይህ ደግሞ አስፈላጊ ነገር ነው፤ ምክንያቱም በዝርዝር 11.13 እና በዝርዝር 11.14 ውስጥ ያሉት የመለያ ማግበሪያ ዝግጁገጽወች አንድ የመለያ ማግበሪያ ይስሙላ ስለሚያስፈልጋቸው ነው፡፡ (ማግበርያ_ይስሙላ (magberya_ysmula) ምናባዊ ባሕሪ ስለሆነ፣ ከውሂበጎታው የመጣው ተጠቃሚ የመለያ ማግበሪያ ይስሙላ የለውም (ክፍል 11.1)።)

ዝርዝር 11.18: ለመለያ ማግበሪያ አንድ የሚሰራ የቅድመ-እይታ ዘዴ። 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
    TeteqamiMailer.meda_masjemer
  end

end

እንደ ዝርዝር 11.18 ባለው የቅድመ-እይታ ኮድ፣ የመለያ ማግበሪያ ኤመልእክቶችን ለመመልከት የተጠቆሙትን ዓ.አ.ሃ.አዎች መጎብኘት እንችላለን፡፡ (የደመና ቅ.ማ.አን እየተጠቀማችሁ ከሆነ፣ ይህንን:- localhost:3000 በተዛማጁ መሰረታዊ ዓ.አ.ሃ.አ መተካት ይኖርባችኋል።) በውጤቱ የተገኙት የሃ.ጽ.መ.ቋ እና የጽሑፍ ኤመልእክቶች በምስል 11.3 እና በምስል 11.4 ላይ ይታያሉ፡፡

images/figures/account_activation_html_preview
ምስል 11.3: በሃ.ጽ.መ.ቋ የተዘጋጀው የመለያ ማግበሪያ የኤመልእክት ቅድመ-እይታ፡፡
images/figures/account_activation_text_preview
ምስል 11.4: በጽሑፍ የተዘጋጀው የመለያ ማግበሪያ የኤመልእክት ቅድመ-እይታ፡፡

መልመጃዎች

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

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

  1. የኤመልእክት ዝግጁገጽታወቻችሁን በአሳሻችሁ ላይ አንድ ባንድ ተመልከቱ፡፡ የቅድመ-እይታዎቹ የቀን መስኮች መቸ ይላሉ?

11.2.3 ኤመልእክትን መፈተን

እንደ አንድ የመጨረሻ ደረጃ ሂደት ይሆነን ዘንድ፣ በኤመልእክት ቅድመ-እይታ ውስጥ የተመለከቱትን ውጤቶች በደንብ ለማረጋገጥ፣ ሁለት ፈተናወችን እንጽፋለን፡፡ ይህም እንደተጠበቀው ከባድ አይደለም፣ ምክንያቱም ሬይልስ ለእኛ ጠቃሚ የሆኑ የፈተና ምሳሌዎችን ስለፈጠረልን ነው (ዝርዝር 11.19)፡፡

ዝርዝር 11.19: በሬይልስ የመነጨው የተጠቃሚ መላኪያ ፈተና። ቀይ test/mailers/teteqami_mailer_test.rb
require 'test_helper'

class TeteqamiMailerTest < ActionMailer::TestCase

  test "meleya_magberya" do
    mail = TeteqamiMailer.meleya_magberya
    assert_equal "Meleya magberya", mail.subject
    assert_equal ["to@example.org"], mail.to
    assert_equal ["from@example.com"], mail.from
    assert_match "Hi", mail.body.encoded
  end

  test "meda_masjemer" do
    mail = TeteqamiMailer.meda_masjemer
    assert_equal "Mehlefeqal dagm masjemerya", mail.subject
    assert_equal ["to@example.org"], mail.to
    assert_equal ["from@example.com"], mail.from
    assert_match "Hi", mail.body.encoded
  end
end

ክፍል 11.2.1 እንደተጠቀሰው፣ በዝርዝር 11.19 ውስጥ ያሉት ፈተናዎች አሁን ቀይናቸው፡፡

ዝርዝር 11.19 ላይ የተደረጉት ፈተኖች፣ በአንድ ሃረግ ወይንም በአንድ መደበኛ ሂሳበሃረግ ላይ ሊጠቀሙበት የሚችሉትን፣ ሃይለኛውን የ‘አቻነት_አረጋግጥ (assert_match) ዘዴን ይጠቀማሉ፡፡

assert_match 'foo', 'foobar'      # እውነት
assert_match 'baz', 'foobar'      # ሃሰት
assert_match /\w+/, 'foobar'      # እውነት
assert_match /\w+/, '$#!*+@'      # ሃሰት

ዝርዝር 11.20 ውስጥ ያለው ፈተና፣ የተጠቃሚ ስሙ፣ የመለያ ማስጀመሪያ ይስሙላው እና የተመለጠው የኤመልእክት (ማለት ለዓ.አ.ሃ.አ ተስማሚ የሆነ የኤመልእክቱ) በመልእክቱ አካል ላይ መታየታቸውን ለማረጋገጥ አቻነት_አረጋግጥ‘ን (assert_match) ይጠቀማል፡፡ እዚሁ ዝርዝር መጨረሻ ላይ፣ የተጠቃሚ የኤመልእክት አድራሻን ለማምለጥ (ለዓ.አ.ሃ.አ ተስማሚ ለማድረግ) የ

CGI.escape(teteqami.email)

መጠቀምን ልብ በሉ፣ በክፍል 11.2.1.1 ውስጥ፣ ይህንኑ በመጠቀም አንድ የኤመልእክትን ለዓ.አ.ሃ.አ ተስማሚ ለማድረግ በግልጽ አይተነው ነበር፡፡7 ማሳሰቢያ:- በምርት ላይ ኤመልእክትን (ክፍል 11.4) ለመላክ ካቀዳችሁ፣ በዝርዝር 11.11 ውስጥ ያለውን “noreply@example.com” ‘ን በእውነተኛ የኤመልእክት አድራሻችሁ መተካት ይኖርባችኋል፡፡

ዝርዝር 11.20: ወቅታዊውን የኤመልእክት አተገባበር መፈተን፡፡ ቀይ 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
end

ዝርዝር 11.20 አንድ የማግበሪያ ይስሙላን ለእቃ ተጠቃሚው እንደጨመረ ልብ በሉ፣ እንደዚያ ባይደረግ ኑሮ ግን ባዶ በሆነ ነበረ። (ዝርዝር 11.20 የመነጨውን እና በክፍል 12.2.2 ላይ በተሻሻለ መልኩ መልሰን ወደነበረበት ቦታ የምናክለውን፣ የመሕለፈቃል ዳግም ማስጀመሪያ ፈተናንም አስወግዷል፡፡)

ዝርዝር 11.20 ውስጥ ያለው ፈተና እንዲያልፍ ለማድረግ፣ በዝርዝር 11.21 ላይ እንደሚታየው፣ የፈተና ፋይላችንን በተገቢው የግዛት አስተናጋጅ ማዋቀር ይኖርብናል፡፡

ዝርዝር 11.21: የግዛት አስተናጋጁን ለፈተና ማቀናበር። አረንጓዴ config/environments/test.rb
Rails.application.configure do
  .
  .
  .
  config.action_mailer.delivery_method = :test
  config.action_mailer.default_url_options = { host: 'msalie.com' }
  .
  .
  .
end

ከላይ ባለው ኮድ፣ የመላኪያው ፈተና አረንጓዴመሆን ይገባዋል:-

ዝርዝር 11.22: አረንጓዴ
$ rails test:mailers

መልመጃዎች

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

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

  1. ሙሉው የፈተና ስብስብ አኑንም አረንጓዴመሆኑን አረጋግጡ፡፡
  2. ዝርዝር 11.20 ውስጥ ያለውን የ‘ሲጂአይ.አስመልጥ (CGI.escape) ዘዴን ብታስወግዱት፣ ፈተናው ቀይ እንደሚሆን አረጋግጡ፡፡

11.2.4 የተጠቃሚዎች መፍጠሪያ ተግባርን ማዘመን

መላኪያውን በአፕልኬሽናችን ላይ ለመጠቀም፣ በዝርዝር 11.23 ላይ እንደሚታየው፣ ተጠቃሚዎችን ለመመዝገብ እንጠቀምበት የነበረው የ‘ፍጠር (create) ተግባር ላይ ሶስት መስመር ኮዶችን ማከል ይኖርብናል፡፡ ዝርዝር 11.23 በምዝገባ ወቅት፣ አንድ ተጠቃሚን የማዟዟሩን ባህሪ እንደቀየረው አስተውሉ። ከዚህ በፊት ወደ ተጠቃሚ መገለጫ ገጽ እናዟዙር ነበረ (ክፍል 7.4)፣ አሁን ግን ተጠቃሚው አንድ የመለያ ማግበሪያ እንዲኖረው ይፈለጋል፣ ስለዚህ በአሁኑ ጊዜ ተጠቃሚውን ወደ መገለጫ ግጹ ማዟዟሩ ምንም ትርጉም አይሰጥም፡፡ በምትኩ፣ አሁን ወደ ስረ ዓ.አ.ሃ.አው እናዟዙራለን።

ዝርዝር 11.23: የመለያ ማግበሪያን በተጠቃሚ መመዝገቢያ ውስጥ ማከል። ቀይ app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
  .
  .
  .
  def create
    @teteqami = Teteqami.new(teteqami_negariaseitoch)
    if @teteqami.save
      TeteqamiMailer.meleya_magberya(@teteqami).deliver_now
      flash[:info] = "መለያዎን ለማግበር እባክዎ ኤመልእክትዎን ይመልከቱ።"
      redirect_to root_url
    else
      render 'new'
    end
  end
  .
  .
  .
end

ምንም እንኳን አፕልኬሽኑ እንደተነደፈው እየሰራ ቢሆንም፣ ዝርዝር 11.23 ወደ መገለጫ ገጹ ፋንታ፣ ወደ ስረ ዓ.አ.ሃ.አ ስለሚያዟዟር እና ተጠቃሚውን እንደበፊቱ ስለማያስገባ፣ የፈተና ስብስቡ በአሁኑ ጊዜ ቀይሁኗል፤ በዝርዝር 11.24 ላይ እንደሚታየው፣ ለፈተናው መውደቅ ምክንያት የሆኑት ፈተናወች ላይ ለጊዜው አስተያየት በማድረግ ፈተናው እንዲያልፍ እናደርገዋለን። በክፍል 11.3.3 ውስጥ እነዚህ ፈተናወች ላይ ያደረግነውን አስተያየት በማስወገድ የመለያ ማግበሪያ ፈተናወችን የሚያሳልፉ አዲስ ፈተናወችን እንጽፋለን፡፡

ዝርዝር 11.24: ያወደቁ ፈተናወች ላይ ጊዜያዊ አስተያየት ማድረግ፡፡ አረንጓዴ 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:              "foo",
                                         password_confirmation: "bar" } }
    end
    assert_template 'teteqamis/new'
    assert_select 'div#ስህተት_ማብራሪያ'
    assert_select 'div.field_with_errors'
  end

  test "ብቁ የምዝገባ መረጃ" do
    get temezgeb_path
    assert_difference 'Teteqami.count', 1 do
      post teteqamis_path, params: { teteqami: { sim:  "Abnet Teteqami",
                                         emelekt: "teteqami@misalei.com",
                                         password:              "password",
                                         password_confirmation: "password" } }
    end
    follow_redirect!
    # assert_template 'teteqamis/show'
    # assert geb_tual?
  end
end

አሁን ልክ እንደ አንድ አዲስ ተጠቃሚ ሁናችሁ ብትመዘግቡ፣ በምስል 11.5 ላይ እንደሚታየው፣ ልትዟዟሩ እና እንዲሁም በዝርዝር 11.25 ላይ እንደሚታየው ዓይነት አንድ የኤመልእክት ሊመነጪ ይገባል፡፡ በአንድ የማበልጸጊያ አካባቢ ውስጥ አንድ ትክክለኛ የኤመልእክትን እንደማታገኙ አስተውሉ፤ ነገር ግን በአገልጋዩ ዘገባ ውስጥ ውጤቱን ማየት ትችላላችሁ፡፡ (እሱን ለማየት ትንሽ ወደ ላይ መሸብለል ሊኖርባችሁ ይችላል።) በክፍል 11.4 ውስጥ በአንድ የምርት ማበልጸጊያ ላይ ትክክለኛ የኤመልእክትን እንዴት አድርጎ መላክ እንደሚቻል እንመለከታለን፡፡

ዝርዝር 11.25: ከአገልጋዩ ዝጋቤ ውስጥ የተገኘ አንድ የመለያ ማግበር የኤመልእክት ናሙና።
TeteqamiMailer#meleya_magberya: processed outbound mail in 2.2ms
Delivered mail 5fdd5bec2e61b_f68763b063175@winnber.local.mail (3.9ms)
Date: Fri, 18 Dec 2020 17:48:28 -0800
From: noreply@example.com
To: michael@michaelhartl.com
Message-ID: <5d606e97b7a44_28872b106582df988776a@ip-172-31-25-202.mail>
Subject: የመለያ ማግበሪያ
Mime-Version: 1.0
Content-Type: multipart/alternative;
 boundary="--==_mimepart_5d606e97b6f16_28872b106582df98876dd";
 charset=UTF-8
Content-Transfer-Encoding: 7bit


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

ሰላም Michael Hartl,

እንኳን ወደ ማሳያ አፕልኬሽኑ በደህና መጡ! መለያዎን ለማንቃት: እታች ያለው አገናኝ ላይ ጠቅ
ያድርጉ:-

http://localhost:3000/meleya_magberyas/PHf-NVErMV8Gvg5IDIG1EA/
edit?emelek=michael%40michaelhartl.com

----==_mimepart_5d606e97b6f16_28872b106582df98876dd
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>ሰላም Michael Hartl</p>

<p>
እንኳን ወደ ማሳያ አፕልኬሽኑ በደህና መጡ! መለያዎን ለማንቃት: እታች ያለው አገናኝ ላይ ጠቅ ያድርጉ:-
</p>

<a href="http://localhost:3000/meleya_magberyas/PHf-NVErMV8Gvg5IDIG1EA/
edit?emelekt=michael%40michaelhartl.com">አንቃ</a>
  </body>
</html>

----==_mimepart_5d606e97b6f16_28872b106582df98876dd--
images/figures/redirected_not_activated
ምስል 11.5: የመነሻ ገጹ ከምዝገባ በኋላ ከአንድ የማግበሪያ መልእክት ጋር፡፡

መልመጃዎች

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

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

  1. ልክ እንደ አንድ አዲስ ተጠቃሚ ሁናችሁ በድራችሁ ላይ በመመዝገብ እና፣ ወደ መነሻ ገጹ መዟዟራችሁን አረጋግጡ። በአገልጋዩ ዘገባ ውስጥ የመነጨው የኤመልእክት ይዘቱ ምንድነው? የማግበሪያ ይስሙላው ዋጋውስ ምንድነው?
  2. በሰሌዳው ውስጥ፣ አዲሱ ተጠቃሚ እንደተፈጠረ መለያው ግን ገና እንዳልነቃ አረጋግጡ፡፡

11.3 መለያውን ማንቃት

አሁን በዝርዝር 11.25 ላይ እንደተለመደው፣ አንድ በትክክለኛው መንገድ የመነጨ የኤመልእክት ስላለን፣ ተጠቃሚውን የሚያነቃውን፣ የ‘አርትዕ (edit) ተግባርን በመለያ ማግበሪያ መቆጣጠሪያው ውስጥ መጻፍ ይኖርብናል፡፡ እንደተለመደው ለዚህ ተግባር አንድ ፈተናን እንጽፋለን፣ ከዚያ ኮዱ ከተፈተነ በኋላ፣ አንዳንድ ተግባራትን ከመለያ ማግበሪያ መቆጣጠሪያው ወደ ተጠቃሚ ቅርጸቱ ለማሸጋገር ፈተናውን እናጣራዋለን፡፡

11.3.1 የተረጋግጧልን? ዘዴን አጠቃላይ ማድረግ

የማግበሪያ ይስሙላው እና የኤመልእክቱ በ‘ሰሚአሴቶች[:መታወቂያ]‘ው (params[:id]) እና በ‘ሰሚአሴቶች[:ኤመልእክቱ] (params[:email]) ውስጥ በቅደም ተከተል የሚገኙ መሆናቸውን በክፍል 11.2.1 ላይ ባደረግነው ውይይት ላይ በደንብ እንደተብራሩ አስታውሱ፡፡ የመሕለፈቃል አሰራር ምሳሌን ከዝርዝር 8.7 እና የዝክረ ይስሙላወች አሰራርን ከዝርዝር 9.9 ላይ በመከተል፣ ከታች የተመለከተውን በሚመስል ኮድ፣ ተጠቃሚውን ፈልጎ ለማግኘት እና ለማረጋገጥ አቅደናል:-

teteqami = Teteqami.find_by(emelekt: params[:emelekt])
if teteqami && teteqami.teregagtualn?(:magrerya, params[:id])

(ደቂቃ ባልሞላ ጊዜ ውስጥ እንደምናየው፣ ከዚህ በላይ ባለው ሂሳበሃረግ ላይ አንድ ተጨማሪ ቡልየን እናክልበታለን፡፡ እስኪ የቱ ላይ እንደምናክል የምታውቁ ከሆነ ገምቱ።)

ከዚህ በላይ ያለው ኮድ፣ የመለያ ማግበሪያ ፍጪው ከቀረበው ይስሙላ ጋር የሚዛመድ መሆኑን ለመፈተን የ‘ተረጋግጧልን? (teregagtualn?) ዘዴን ይጠቀማል፣ በአሁኑ ጊዜ ግን ይህ ዘዴ አይሰራም፤ ምክንያቱም ይህ ዘዴ ለዝክረ ይስሙላው ብቻ ተብሎ የተሰራ ስለሆነ ነው (ዝርዝር 9.6)፡፡

# የቀረበው ይስሙላ ከፍጪው ጋር አቻ ከሆነ እውነትን ይመለሳል።
def teregagtualn?(zkre_ysmula)
  return false if zkre_fech.nil?
  BCrypt::Password.new(zkre_fech).is_password?(zkre_ysmula)
end

እዚህ ላይ የዝክረ_ይስሙላ‘ው (zkre_ysmula) በተጠቃሚ ቅርጸት ውስጥ የሚገኝ አንድ ባሕሪ ነው፤ እናም በቅርጸቱ ውስጥ እንደሚከተለው አድርገን እንዳዲስ መጻፍ እንችላለን:-

self.zkre_fech

የሆነ ሆኖ እኛ ተገቢውን ሰሚአሴት ወደ ተረጋግጧልን? (teregagtualn?) ዘዴ ከማሳለፍ ይልቅ፣ ይህንን ዘዴ ወደ አንድ ተለዋዋጪ በመቀየር፣ የሚገባው ዘዴ ላይ እንደዚህ ብለን ልንጠራው እንፈልጋለን:-

self.magberya_fech

መፍትሄው የመጀመሪያውን የፕሮግራምአዳቅሌ (Metaprogramming) ምሳሌያችንን ያሳትፋል፣ ፕሮግራምአዳቅሌ ማለት፣ አንድ ፕሮግራምን የሚጽፍ አንድ ፕሮግራም ማለት ነው፡፡ (ፕሮግራምአዳቅሌ፣ የሩቢ ፕሮግራም በጣም አመች ከሆነባቸው ነገሮች ውስጥ አንዱ ነው፤ እናም የሬይልስ “አስማታዊ” ገጸባህሪዎች የተገኙትም በሩቢ ፕሮግራምአዳቅሌ ጥቅም ምክንያት ነው፡፡) በዚህ ጉዳይ ላይ መፍትሄው ሃያሉ የ‘ላክ (send) ዘዴ ነው፣ ይህም በሰጠነው አንድ ቁስ ላይ “አንድ መልእክትን በመላክ” በመረጥነው አንድ ስም ላይ አንድ ዘዴን እንድንጠራ ያስችለናል፡፡ ለምሳሌ፣ በዚህ የሰሌዳ ክፍለጊዜ ውስጥ የአንድ ድርድር ርዝመትን ለመፈለግ፣ በአንድ አገሬ የሩቢ ቁስ ላይ የ‘ላክ (send) ዘዴን እንጠቀማለን-

$ rails console
>> a = [1, 2, 3]
>> a.length
=> 3
>> a.send(:length)
=> 3
>> a.send("length")
=> 3

እዚህ ጋር :እርዝመት (:length) ወካይን ወይም "እርዝመት" ("length") ሃረግን ወደ ላክ (send) ዘዴ አሳልፎ የተሰጠ ቁስ ላይ መጥራት እና የ‘እርዝመት (length) ዘዴን ተጠቅሞ የተሰጠ ቁስን መጥራት አንድ ዓይነት ውጤት እንዳላቸው እናያለን። ሁለተኛ እንደ አንድ ምሳሌ ይሆነን ዘንድ፣ ከውሂበጎታው ውስጥ የመጀመሪያውን ተጠቃሚ የ‘ማግበርያ_ፈጪ (magberya_fech) ባሕሪን እንደርስበታለን:-

>> ተጠቃሚ = Teteqami.first
>> ተጠቃሚ.magberya_fech
=> "$2a$10$4e6TFzEJAVNyjLv8Q5u22ensMt28qEkx0roaZvtRcp6UZKRM6N9Ae"
>> ተጠቃሚ.send(:magberya_fech)
=> "$2a$10$4e6TFzEJAVNyjLv8Q5u22ensMt28qEkx0roaZvtRcp6UZKRM6N9Ae"
>> ተጠቃሚ.send("magberya_fech")
=> "$2a$10$4e6TFzEJAVNyjLv8Q5u22ensMt28qEkx0roaZvtRcp6UZKRM6N9Ae"
>> bahri = :magberya
>> ተጠቃሚ.send("#{bahri}_fech")
=> "$2a$10$4e6TFzEJAVNyjLv8Q5u22ensMt28qEkx0roaZvtRcp6UZKRM6N9Ae"

በመጨረሻው ምሳሌ ላይ፣ ከ‘:ማግበርያ (:magberya) ወካይ ጋር እኩል የሆነ፣ አንድ የ‘ባህሪ (bahri) ተለዋዋጪን ከበየንን በኋላ፣ ተገቢውን የላክ (send) ነጋሪአሴት ለመገንባት የሃረግ ውስጠገምትን እንደተጠቀምን አስተውሉ። ይህ 'magberya' ሃረግን በመጠቀምም መስራት ይችላል፣ አንድ ወካይን መጠቀሙ ግን በይበልጥ የተለመደ ነው፤ እናም በማናቸውም ሁኔታ ይህ ኮድ:-

"#{bahri}_fech"

አንዴ ሃረጉ ውስጠገምት ከተደረገለት በኋላ፣ ኮዱ እንደዚህ ይሆናል፡-

"magberya_fech"

(በክፍል 7.4.2 ውስጥ ወካዮች እንዴት ወደ ሃረግ ውስጠገምት እንደሚደረጉ አይተናል፡፡)

በዚህ የ‘ላክ (send) ውይይት ላይ በመመርኮዝ፣ የአሁኑን የተረጋግጧልን? (teregagtualn?) ዘዴን እንደሚመለከተው አድርገን እንዳዲስ መጻፍ እንችላለን:-

def teregagtualn?(zkre_ysmula)
  fech = self.send("zkre_fech")
  return false if fech.nil?
  BCrypt::Password.new(fech).is_password?(zkre_ysmula)
end

ይህንን ዝግጁይዞታ በቦታው ላይ በመተካት፣ ከፈጪው ስም ጋር አንድ የተግባር ነጋሪአሴትን በማከል ዘዴውን አጠቃላይ ማድረግ እንችላለን፣ እና ከዚያ ልክ እንደላይኛው፣ አንድ የሃረግ ውስጠገምትን መጠቀም እንችላለን:-

def teregagtualn?(bahri, ysmula)
  fech = self.send("#{bahri}_fech")
  return false if fech.nil?
  BCrypt::Password.new(fech).is_password?(zkre_ysmula)
end

(እዚህ ላይ፣ ሁለተኛውን ነጋሪአሴት ሁሉአቀፍ/አጠቃላይ መሆኑን ለማጉላት ስሙን ይስሙላ (ysmula) ብለን ቀይረነዋል)። በተጠቃሚ ቅርጸቱ ውስጥ ስለሆንን፣ ስነአጻጻፉ/ስነአነጋገሩ ትክክለኛ ስሪትን ይሰጥ ዘንድ፣ ራሥ‘ን (self) መተው እንችላለን:-

def teregagtualn?(bahri, ysmula)
  fech = send("#{bahri}_fech")
  return false if fech.nil?
  BCrypt::Password.new(fech).is_password?(zkre_ysmula)
end

አሁን እንደዚህ አድርገን በመጥራት የቀደመውን የተረጋግጧልን? (teregagtualn?) ባህሪ ማባዛት እንችላለን:-

teteqami.teregagtualn?(:zkre, zkre_ysmula)

ይህንን ውይይት በተጠቃሚ ቅርጸቱ ላይ ተግባራዊ ማድረጉ፣ በዝርዝር 11.26 ላይ የሚታየውን አጠቃላይ የተረጋግጧልን? (teregagtualn?) ዘዴን ይሰጠናል፡፡

ዝርዝር 11.26: የተጠቃለለው የተረጋግጧልን? (teregagtualn?) ዘዴ። ቀይ app/models/teteqami.rb
class Teteqami < ApplicationRecord
  .
  .
  .
  # የቀረበው ይስሙላ ከፍጪው ጋር አቻ ከሆነ እውነትን ይመለሳል።
  def teregagtualn?(bahri, ysmula)
    fech = send("#{bahri}_fech")
    return false if fech.nil?
    BCrypt::Password.new(fech).is_password?(ysmula)
  end
  .
  .
  .
end

ዝርዝር 11.26 ላይ ያለው የመግለጫ ጽሑፍ የፈተና ስብስቡ ቀይ እንደሆነ ያመለክታል:-

ዝርዝር 11.27: ቀይ
$ rails test

ለመውደቁ ምክንያት የሆኑት የ‘ዓሁን_ተጠቃሚ (ahun_teteqami) ዘዴ (ዝርዝር 9.9) እና ፍጪው ምንም (nil) አለመሆኑን የሚፈትኑት (ዝርዝር 9.17) ሁለቱም፣ ከሁለት ይልቅ አንድ ነጋሪአሴት የሚወስደውን የድሮውን የተረጋግጧልን? (teregagtualn?) ስሪትን ስለሚጠቀሙ ነው፡፡ ይህ አንድ የፈተና ስብስብ ሊይዘው የሚገባው የስህተት ዓይነት መሆኑን ልብ ልትሉ ይገባል።

ችግሩን ለማስተካከል፣ በዝርዝር 11.28 እና በዝርዝር 11.29 ላይ እንደሚታየው፣ የተጠቃለለውን ዘዴ ለመጠቀም ሁለቱን ጉዳዮች በቀላሉ እናዘምነለን፡፡ ዝርዝር 11.28ክፍል 9.3.2.1 ላይ የክፍለጊዜ ጥገና ችግርን ለመፍታት ለተሰጠው መልመጃ መልሱን እንደሚያካትት ልብ በሉ፤ ስለሆነም ያንን መልመጃ ካላጠናቀቃችሁ፣ የተጠቃሚ ቅርጸታችሁን ዝርዝር 9.36 ላይ በተሰጠው ኮድ ማዘመናችሁን አረጋግጡ፡፡

ዝርዝር 11.28: የተጠቃለለውን የተረጋግጧልን? (teregagtualn?) ዘዴን በ‘ዓሁን_ተጠቃሚ (ahun_teteqami) ውስጥ መጠቀም። ቀይ app/helpers/sessions_helper.rb
module SessionsHelper
  .
  .
  .
  # ከዝክረ ይስሙላ ብስኩቱ ጋር የተጎዳኘ ተጠቃሚን ይመልሳል።
  def ahun_teteqami
    if (teteqami_id = session[:teteqami_id])
      teteqami = Teteqami.find_by(id: teteqami_id)
      @ahun_teteqami ||= teteqami if session[:yismule_kflegzie] == teteqami.yismule_kflegzie
    elsif (teteqami_id = cookies.encrypted[:teteqami_id])
      teteqami = Teteqami.find_by(id: teteqami_id)
      if teteqami && teteqami.teregagtualn?(:zkre, cookies[:zkre_ysmula])
        gba teteqami
        @ahun_teteqami = teteqami
      end
    end
  end
  .
  .
  .
end
ዝርዝር 11.29: የተጠቃለለውን የተረጋግጧልን? (teregagtualn?) ዘዴን በተጠቃሚ ፈተና ውስጥ መጠቀም፡፡ አረንጓዴ test/models/teteqami_test.rb
require 'test_helper'

class TeteqamiTest < ActiveSupport::TestCase

  def setup
    @teteqami = Teteqami.new(sim: "Abnet Teteqami",
                            emelekt: "teteqami@misalei.com",
                        password: "yonatan", password_confirmation: "yonatan")
  end
  .
  .
  .
  test "ተረጋግጧልን? አንድ የ`ምንም ፍጪ ላለው ተጠቃሚ ሃሰትን መመለስ አለበት" do
    assert_not @teteqami.teregagtualn?(:zkre, '')
  end
end

በዚህ ጊዜ፣ ፈተናወቹ በሙሉ አረንጓዴመሆን አለባቸው:-

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

ከላይ እንዳለው ዓይነት ኮድን ያለ አንድ እጅግ ጠንካራ የፈተና ስብስብ ማጣራቱ፣ በጣም አደጋ ላይ ለሚጥል ስህተት ያጋልጣል፣ እናም ለዚህ ነው እኛ በክፍል 9.1.2 እና በክፍል 9.3 ላይ ጥሩ ፈተናወችን ለመጻፍ እንደዛ የደከምነው፡፡

መልመጃዎች

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

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

  1. በሰሌዳው ላይ አንድ አዲስ ተጠቃሚን ፍጠሩ እና ዘክሩት፡፡ የተጠቃሚው የዝክር እና የማግበሪያ ይስሙላወቹ ምንድናቸው? ተዛማጁ ፍጪውስ?
  2. ዝርዝር 11.26 ላይ የተገኘውን የተጠቃለለ የተረጋግጧልን? (teregagtualn?) ዘዴን በመጠቀም፣ ተጠቃሚው በዝክረ ይስሙላው እና በማግበሪያ ይስሙላው መሰረት የተረጋገጠ መሆኑን አረጋግጡ፡፡

11.3.2 የማግበሪያ የአርትዖት ተግባር

ልክ እንደ ዝርዝር 11.26 አይነት ባለው የተረጋግጧልን? (teregagtualn?) ዘዴ ጋር፣ በ‘ሰሚአሴቶች (params) ተርታ ውስጥ ካለው የኤመልእክት አድራሻ ጋር የሚዛመድ ተጠቃሚን የሚያረጋግጥ አንድ የ‘አርትዕ (edit) ተግባርን ለመጻፍ አሁን ዝግጁ ነን፡፡ ተቀባይነት ላለው ተጠቃሚ የምናደርገው ፈተና ይህንን ዓይነት ይመስላል:-

if teteqami && !teteqami.nq? && teteqami.teregagtualn?(:magberya, params[:id])

እዚህ ላይ የ‘!ተጠቃሚ.ንቅነውን? (!teteqami.nq?) መኖርን አስተውሉ፣ ይህም ከዚህ ከላይ እንደተጠቀሰው የተጨማረ ቡሊያን ነው። ይህ የእኛን ኮድ ቀድሞውኑ የነቁ ተጠቃሚዎችን እንዳያነቃ ይከላከላል፣ ይህ አስፈላጊ ነው፣ ምክንያቱም ተጠቃሚዎች ማንነታቸውን ካረጋገጡ በኋላ ስለምናስገባ፣ እናም የማግበሪያ አገናኝን ያገኙ አጥቂዎች ልክ እንደ ተጠቃሚው ሆነው እንዲገቡ ስለማንፈልግ ነው።

ተጠቃሚው ከላይ ባሉት ቡልየኖች መሰረት ከተረጋገጠ፣ ተጠቃሚውን ማንቃት እና የ‘ነቃ_በ (nq_at) ማህተመጊዜውን ማዘመን ይኖርብናል:-8

teteqami.update_attribute(:nq,    true)
teteqami.update_attribute(:nq_at, Time.zone.now)

ይህም በዝርዝር 11.31 ውስጥ ወደሚታየው ወደ አርትዕ (edit) ተግባር ያመራናል፡፡ ዝርዝር 11.31 አንድ ብቁ ያልሆነ የማግበሪያ ይስሙላ ሁኔታን እንደሚያስተናግድም አስተውሉ፤ ይህም አልፎ አልፎ ሊከሰት የሚችል ነገር ቢሆንም፣ በዚህ ሁኔት ላይ ወደ ስረ ዓ.አ.ሃ.አው ማዟዟሩ ግን ቀላል ነው፡፡

ዝርዝር 11.31: መለያዎችን ለማንቃት የሚያገለግል አንድ የ‘አርትዕ (edit) ተግባር። app/controllers/meleya_magberyas_controller.rb
class MeleyaMagberyasController < ApplicationController

  def edit
    teteqami = Teteqami.find_by(emelekt: params[:emelekt])
    if teteqami && !teteqami.nq? && teteqami.teregagtualn?(:magberya, params[:id])
      teteqami.update_attribute(:nq,    true)
      teteqami.update_attribute(:nq_at, Time.zone.now)
      gba teteqami
      flash[:success] = "መለያው ነቅቷል!"
      redirect_to teteqami
    else
      flash[:danger] = "ልክ ያልሆነ ማግበሪያ አገናኝ"
      redirect_to root_url
    end
  end
end

ዝርዝር 11.31 ውስጥ ካለው ኮድ ጋር፣ አግባብነት ያለው ተጠቃሚን ለማንቃት አሁን ዝርዝር 11.25 ላይ የሚገኘው ዓ.አ.ሃ.አ ቀድታችሁ በአድራሻ መጻፊያችሁ ላይ መገልበጥ መቻል አለባችሁ፡፡ ለምሳሌ፣ በእኔ ስርዓት ላይ ይህንን ዓ.አ.ሃ.አ ጎብኝቻለሁ:-

http://localhost:3000/meleya_magberyas/PHf-NVErMV8Gvg5IDIG1EA/
edit?emelek=michael%40michaelhartl.com

እናም በምስል 11.6 ውስጥ የሚታየውን ውጤት አግኝቻለሁ፡፡

images/figures/activated_user
ምስል 11.6: ከአንድ የተሳካ የመለያ ንቃት በኋላ፡ የመገለጫ ገጽ እይታ።

በእርግጥ በአሁኑ ጊዜ የተጠቃሚ ማግበሪያ ምንም ነገር አያደርግም፣ ምክንያቱም ተጠቃሚዎች እንዴት መግባት እንዳለባቸው የሚወስነው ኮድ አልተለወጠም፡፡ የመለያ ማግበሪያው አንድ ትርጉም እንዲኖረው ለማድረግ፤ ተጠቃሚዎች ከነቁ ብቻ እንዲገቡ ማስቻል አለብን፡፡ ይህንን ለማድረግ በዝርዝር 11.32 ላይ እንደሚታየው፣ ተጠቃሚው መንቃቱን እና አለመንቃቱን ለማረጋገጥ፣ ተጠቃሚ.ንቅነውን? (teteqami.nq?) ዘዴን እንጠቀማለን፣ ይህ ዘዴ እውነትን ከመለሰ፣ ተጠቃሚውን እናስገባለን፣ አለበለዚያ ግን ከአንድ የማስጠንቀቂያ መልእክት ጋር ወደ ስረ ዓ.አ.ሃ.አው እናዟዙራለን (ምስል 11.7)።

ዝርዝር 11.32: ያልነቁ ተጠቃሚዎችን እንዳይገቡ መከላከል፡፡ app/controllers/sessions_controller.rb
class SessionsController < ApplicationController

  def new
  end

  def create
    @teteqami = Teteqami.find_by(emelekt: params[:session][:emelekt].downcase)
    if @teteqami && @teteqami.authenticate(params[:session][:password])
      if @teteqami.nq?
        adrasha_astelalfie = session[:adrasha_astelalfie]
        reset_session
        params[:session][:ዘክረኝ] == '1' ? zekr(@teteqami) : ersa(@teteqami)
        gba @teteqami
        redirect_to adrasha_astelalfie || @teteqami
      else
        message  = "መለያዎት አልነቃም "
        message += "ለማንቃት ኤመልእክትዎት ላይ አንድ የማንቂያ አገናኝን ይመልከቱ፡፡"
        flash[:warning] = message
        redirect_to root_url
      end
    else
      flash.now[:danger] = "ልክ ያልሆነ የኤመልእክት/የይለፍ ቃል ጥምረት"
      render 'new'
    end
  end

  def destroy
    wta if gebtual?
    redirect_to root_url
  end
end
images/figures/not_activated_warninga
ምስል 11.7: ገና ላልነቃ ተጠቃሚ የቀረበ አንድ የማስጠንቀቂያ መልእክት።

በዚያ፣ አንድ ተጨማሪ ማሻሻያን ከማከል በስተቀር፣ አሁን የተጠቃሚ ማግበሪያ መሰረታዊ ተግባር ተጠናቋል። (ይህ ማሻሻያም ያልነቁ ተጠቃሚዎች እንዳይታዩ ማድረግ ሲሆን፣ ይህም ልክ እንደ አንድ መልመጃ ይሆናችሁ ዘንድ፣ ለናንተ ተትቷል (ክፍል 11.3.3.1)።) በክፍል 11.3.3 ውስጥ የተወሰኑ ፈተናወችን በማከል እና ከዚያ ትንሽ የኮድ ማጣራትን በማድረግ ሂደቱን እናጠናቅቃለን።

መልመጃዎች

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

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

  1. ክፍል 11.2.4 ውስጥ በኤመልእክት የመነጨውን ዓ.አ.ሃ.አ ቀድታችሁ በአድራሻ መጻፊያችሁ ላይ ገልበጡ። የማግበሪያ ይስሙላው ዋጋ ምንድነው?
  2. ከዚህ በላይ ያለው መልመጃ፣ ዓ.አ.ሃ.አ ላይ ባለው የማግበሪያ ይስሙላ መሰረት፣ ተጠቃሚው የተረጋገጠ መሆኑን በሰሌዳው ላይ አረጋግጡ፡፡ ተጠቃሚው አሁን ንቅ ነውን?

11.3.3 የማግበሪያ ፈተና እና ማጣራት

በዚህ ክፍል ውስጥ፣ ለመለያ ማግበሪያ አንድ የውህደት ፈተናን እናክላለን፡፡ በብቁ መረጃ ለመመዝገብ የሚያስችል አንድ ፈተና ቀደም ሲል ስለነበረን፣ በክፍል 7.4.4 (ዝርዝር 7.31) ውስጥ በበለጸገው ፈተና ላይ አንዳንድ ሂደቶችን እናክልበታለን። እነዚህን ፈተናወች ለማከል የምናደርጋቸው ሂደቶች በጣም ጥቂቶች እና ሲበዛ ግልጾች ናቸው፤ እስኪ ከቻላችሁ ከዝርዝር 11.33 ፈተና ጋር አንድ ዓይነት የሆነ ፈተናን ለመጻፍ ትችሉ ከሆነ ሞክሩ፡፡ (በዝርዝር 11.33 ውስጥ በደማቅ ቀለም የተቀቡት መስመሮች፣ በጣም አስፈላጊ እና በቀላሉ ሳይታዩ ሊታለፉ የሚችሉ ኮዶችን ያመለክታሉ፣ በተጨማሪ ሌሎች አዳዲስ ኮዶችም ታክለዋል፣ ስለሆነም ሁሉንም ኮዶች፣ የፈተና ፋይላችሁ ላይ ማከላችሁን በደንብ አረጋግጡ፡፡)

ዝርዝር 11.33: የተጠቃሚ መመዝገቢያ ፈተና ላይ የመለያ ማስጀመሪያውን ማከል። አረንጓዴ test/integration/teteqamis_temezgeb_test.rb
require 'test_helper'

class TeteqamisTemezgebTest < ActionDispatch::IntegrationTest

  def setup
    ActionMailer::Base.deliveries.clear
  end

  test "ብቁ ያልሆነ የምዝገባ መረጃ" do
    get temezgeb_path
    assert_no_difference 'Teteqami.count' do
      post teteqamis_path, params: { teteqami: { sim:  "",
                                         emelekt: "teteqamis@invalid",
                                         password:              "foo",
                                         password_confirmation: "bar" } }
    end
    assert_template 'teteqamis/new'
    assert_select 'div#ስህተት_ማብራሪያ'
    assert_select 'div.field_with_errors'
  end

  test "ከመለያ ማግበሪያ ጋር ብቁ የምዝገባ መረጃ" do
    get temezgeb_path
    assert_difference 'Teteqami.count', 1 do
      post teteqamis_path, params: { teteqami: { sim:  "Abnet Teteqami",
                                         emelekt: "teteqami@misalei.com",
                                         password:              "password",
                                         password_confirmation: "password" } }
    end
    assert_equal 1, ActionMailer::Base.deliveries.size
    teteqami = assigns(:teteqami)
    assert_not teteqami.nq?
    # ከማንቃት በፊት ለመግባት መሞከር።
    gba_ende(teteqami)
    assert_not geb_tual?
    # ብቁ ያልሆነ የማግበሪያ ይስሙላ።
    get edit_meleya_magberya_path("ብቁ ያልሆነ ይስሙላ", emelekt: teteqami.emelekt)
    assert_not geb_tual?
    # ብቁ ይስሙላ፣ ከተሳሳተ ኤመልእክት ጋር።
    get edit_meleya_magberya_path(teteqami.magberya_ysmula, emelekt: 'የስህተት')
    assert_not geb_tual?
    # ብቁ የማግበሪያ ይስሙላ።
    get edit_meleya_magberya_path(teteqami.magberya_ysmula, emelekt: teteqami.emelekt)
    assert teteqami.reload.nq?
    follow_redirect!
    assert_template 'teteqamis/show'
    assert geb_tual?
  end
end

ዝርዝር 11.33 ውስጥ ብዙ ኮዶች አሉ፤ ነገር ግን አንድ አዲስ ብቸኛ ኮድ ያለው እዚህ መስመር ላይ ነው:-

assert_equal 1, ActionMailer::Base.deliveries.size

ይህ ኮድ በትክክል 1 መልእክት እንደተሰደደ ያረጋግጣል፡፡ የ‘ላኪዎች (deliveries) ድርርድ ሁሉአቀፍ (ሁሉም ቦታ ላይ የሚገኝ) ስለሆነ፣ ሌሎች ማናቸውንም ፈተናወች፣ (ምዕራፍ 12 ላይ እንደሚያጋጥመው) የኤመልእክት የሚሰዱ ከሆነ፣ የእኛን ኮድ እንዳይሰብር ለመከላከል የ‘አዘጋጅ (setup) ዘዴን በመጠቀም የ‘ላኪዎች (deliveries) ድርድሩን አጽድተን በድጋሜ ማስጀመር አለብን፡፡

ዝርዝር 11.33 በዚህ ስልጠና ውስጥ ለመጀመሪያ ጊዜ የ‘መድብ (assigns) ዘዴንም ተጠቅሟል፤ በምዕራፍ 9 ውስጥ አንድ መልመጃ (ክፍል 9.3.1.1) ላይ እንደተገለጸው መድብ (assigns) በተዛማጁ ተግባር ላይ ያሉ ቅርፀ ተለዋዋጮችን እንድንደርስ ያስችለናል፡፡ ለምሳሌ የተመለከትን እንደሆን:- የተጠቃሚ መቆጣጠሪያ የ‘ፍጠር (create) ተግባሩ፣ @ተጠቃሚ (@teteqami) የተባለ አንድ ቅርፀ ተለዋዋጪን በይኗል (ዝርዝር 11.23)፤ ስለዚህ መድብ(:ተጠቃሚ) (assigns(:teteqami)) ብለን በመጠቀም እሱን በፈተናው ውስጥ ልንደርስበት እንችላለን። የ‘መድብ (assigns) ዘዴ ከአምስተኛው የሬይልስ እትም ጀምሮ፣ በሬይልስ ፈተናወች ላይ በአዲስ መልክ ለመተካት በሂደት ላይ ይገኛል (ተቋርጧል)። ይሁን እንጅ እኔ ግን እስካሁን ድረስ በብዙ አውዶች ውስጥ ጠቃሚ ሆኖ አግኝቼዋለሁ፤ እናም የዚህ ዘዴ ጥቅም በዝርዝር 3.2 ውስጥ በተካተተው በሬይልስ-መቆጣጠሪያ-ፈተና (rails-controller-testing) እንቁ በኩል ይገኛል።

በመጨረሻም፣ ዝርዝር 11.33ዝርዝር 11.24 ላይ የተደረጉትን አስተያየቶች እነበሩበት እንደሚመልሳቸው አስተውሉ፡፡

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

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

አሁን በዝርዝር 11.33 ውስጥ ካለው ፈተና ጋር፣ አንዳንድ የተጠቃሚ ማንቀሳቀሻወችን ከመቆጣጠሪያው ወደ ቅርጸቱ በማሸጋገር ኮዱን ትንሽ ለማጣራት ዝግጁ ነን፡፡ በተለይም የተጠቃሚውን የማግበሪያ ባሕሪዎች ለማዘመን አንድ አግብር (agbr) የተባለ ዘዴን እና የማግበሪያ ኤመልእክትን ለመላክ የሚያገለግል አንድ ማግበርያ_ኤመልእክት_ላኪ (megberya_emelekt_laki) የተባለ ዘዴን እንሰራለን። ተጨማሪዎቹ ዘዴወች በዝርዝር 11.35 ውስጥ ይገኛሉ፣ በዝርዝር 11.36 እና በዝርዝር 11.37 ላይ ደግሞ የተጣሩት የአፕልኬሽኑ ኮዶች ይታያሉ፡፡

ዝርዝር 11.35: የተጠቃሚ ማግበሪያ ዘዴዎችን ወደ ተጠቃሚው ቅርጸት ማከል። app/models/teteqami.rb
class Teteqami < ApplicationRecord
  .
  .
  .
  # አንድ መለያን ያነቃል።
  def agbr
    update_attribute(:nq,    true)
    update_attribute(:nq_at, Time.zone.now)
  end

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

  private
    .
    .
    .
end
ዝርዝር 11.36: በተጠቃሚ ቅርጸቱ ቁስ በኩል ኤመልእክትን መላክ። app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
  .
  .
  .
  def create
    @teteqami = Teteqami.new(teteqami_negariaseitoch)
    if @teteqami.save
       @teteqami.megberya_emelekt_laki
      flash[:info] = "መለያዎን ለማግበር እባክዎ ኤመልእክትዎን ይመልከቱ።"
      redirect_to root_url
    else
      render 'new'
    end
  end
  .
  .
  .
end
ዝርዝር 11.37: በተጠቃሚ ቅርጸቱ ቁስ በኩል መለያን ማግበር። app/controllers/meleya_magberyas_controller.rb
class MeleyaMagberyasController < ApplicationController

  def edit
    teteqami = Teteqami.find_by(emelekt: params[:emelekt])
    if teteqami && !teteqami.nq? && teteqami.teregagtualn?(:magberya, params[:id])
      teteqami.agbr
      gba teteqami
      flash[:success] = "መለያው ነቅቷል!"
      redirect_to teteqami
    else
      flash[:danger] = "ልክ ያልሆነ ማግበሪያ አገናኝ"
      redirect_to root_url
    end
  end
end

ዝርዝር 11.35 ተጠቃሚ. (teteqami.) የሚለውን እንደሚያስወግድ አስተውሉ፣ ይህ የሆነበት ምክንያት በተጠቃሚ ቅርጸቱ ውስጥ እንደዚያ የሚባል ተለዋዋጪ ስለለ እና በዛ ምክንያት አፕልኬሽኑ ስለሚሰበር ነው:-

-teteqami.update_attribute(:nq,    true)
-teteqami.update_attribute(:nq_at, Time.zone.now)
+update_attribute(:nq,    true)
+update_attribute(:nq_at, Time.zone.now)

(እዚህ ላይ ተጠቃሚን (teteqami) ወደ ራሥ (self) መቀየር በቻልን ነበር፣ ነገር ግን በክፍል 6.2.5 ላይ ካስታወሳችሁ ራሥ‘ን (self) በአንድ ቅርጸት ውስጥ የመጠቀም ምርጫው በኛ እንደሚወሰን ተመልክተናል፡፡) በተጨማሪም፣ የተጠቃሚ መላኪያው ላይ ሲጠራ ከ‘@ተጠቃሚ (@teteqami) ወደ ራሥ (self) ይቀይራል:-

-TeteqamiMailer.meleya_magberya(@teteqami).deliver_now
+TeteqamiMailer.meleya_magberya(self).deliver_now

እንደነዚህ ዓይነት ጥቃቅን ነገሮች ናቸው በትክክል አንድ ቀላል ኮድን በማጣራት ሂደት ላይ በቀላሉ ሊረሱ የሚችሉት፣ ነገር ግን በአንድ ጥሩ የፈተና ስብስብ ጋማ ይባላሉ፡፡ ይህ የሚታወቀው ደግሞ ፈተናው እስከአሁን ድረስ አረንጓዴሲሆን ነው፡-

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

መልመጃዎች

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

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

  1. ዝርዝር 11.35 ውስጥ የተመለከተው የ‘አግብር (agbr) ዘዴ የ‘ባሕሪ_አዘምን‘ን (update_attribute) ሁለት ተግባራትን እንዲፈጽም ያስፈልጋል፣ እያንዳንዱ ተግባርም የተለየ የውሂበጎታ ግንኙነትን (ዝውውርን) ይጠይቃል፡፡ በዝርዝር 11.39 ውስጥ የሚታየው አብነት ላይ እንደተመለከተው፣ ይህን_ሙሉ የሚለው ቦታ ላይ የሚያስፈልገውን ኮድ በመሙላት፣ ሁለቱንም የ‘ባሕሪ_አዘምን (update_attribute) ዘዴ ጥሪዎች በ‘አምዶች_አዘምን (update_columns) ዘዴ በመተካት ወደ አንድ ነጠላ ጥሪ ለውጡ፡፡ (ልክ እንደ አምዶች_አዘምን (update_columns) ዘዴ የ‘ባሕሪ_አዘምን (update_attribute) ዘዴም የቅርጸት መልሰጥሪወችን ወይም ማረጋገጫወችን እንደማያስኬድ አስተውሉ፡፡) እነዚህን ለውጦች ካደረጋችሁ በኋላም የፈተና ስብስቡ አሁንም አረንጓዴመሆኑን አረጋግጡ።
  2. አሁን አፕልኬሽኑ ባለበት ደረጃ ላይ ሁሉንም ተጠቃሚዎች በማውጫ ገጹ ላይ የ‘/ተጠቃሚዎች (/teteqamis) ዓ.አ.ሃ.አን በመጎብኘት ማየት ይቻላል፣ በ‘/ተጠቃሚዎች/:መታወቂያ (/teteqamis/:id) ዓ.አ.ሃ.አ በኩል ደግሞ የእያንዳንዱን ተጠቃሚ ገጽ ማየት ይቻላል፣ ነገር ግን ተጠቃሚዎች ከተነቁ ብቻ እነሱን ማሳየቱ የበለጠ ትርጉም ይሰጣል፡፡ ስለዚህ በዝርዝር 11.40 ውስጥ የሚታየው አብነት ላይ እንደተመለከተው፣ ይህን_ሙሉ የሚለው ቦታ ላይ የሚያስፈልገውን ኮድ በመሙላት፣ ይህንን ባህሪይ በአፕልኬሽናችሁ ላይ አሟሉ።9 (ይህ አብነት በክፍል 13.3.3 ላይ በይበልጥ የምንማረውን የ‘ንቅ መዝገብ የ‘የት (where) ዘዴን ይጠቀማል።)
  3. እዚህ መልመጃ ውስጥ የሰራችኋቸውን ኮዶች ለመፈተን፣ ለሁለቱም ማለት ለ‘/ተጠቃሚዎች/ (/teteqamis) እና ለ‘/ተጠቃሚዎች/:መታወቂያ (/teteqamis/:id) የውህደት ፈተናወችን ጻፉ፡፡ ለ‘/ተጠቃሚዎች/ (/teteqamis) ፈተና የቀረበ አንድ አብነት በዝርዝር 11.41 ውስጥ ይታያል፡፡ /ተጠቃሚዎች/:መታወቂያ‘ን (/teteqamis/:id) ለመፈተን ደግሞ ሬይልስ የውህደት_ፈተና‘ን ለተጠቃሚ/ማሳያ አመንጪ‘ን (rails generate integration_test teteqami_show) ማስኬድ እና ከዚያም በዝርዝር 11.42 ላይ እንደሚታየው፣ አንድ ያልነቃ የእቃ ተጠቃሚን ማከል ይኖርባችኋል፡፡ ለዚህ ፈተና የሚሆን አንድ ተዛማጅ የፈተና አብነት በዝርዝር 11.43 ውስጥ ይታያል፡፡
ዝርዝር 11.39: የ‘አምዶች_አዘምን‘ን (update_columns) ለመጠቀም የሚያገለግል አንድ አብነት። app/models/teteqami.rb
class Teteqami < ApplicationRecord
  attr_accessor :zkre_ysmula, :magberya_ysmula
  before_save   :emelekt_nious_melkefidel
  before_create :magberya_fech_fter
  .
  .
  .
  # አንድ መለያን ያነቃል።
  def agbr
    update_columns(nq: ይህን_ሙሉ, nq_at: ይህን_ሙሉ)
  end

  # የማግበሪያ ኤመልእክትን ይልካል፡፡
  def megberya_emelekt_laki
    TeteqamiMailer.meleya_magberya(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
ዝርዝር 11.40: ንቅ ተጠቃሚዎችን ብቻ ለማሳየት የሚያገለግል አንድ የኮድ አብነት። app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
  .
  .
  .
  def index
    @teteqamis = Teteqami.where(nq: ይህን_ሙሉ).paginate(page: params[:page])
  end

  def show
    @teteqami = Teteqami.find(params[:id])
    redirect_to root_url and return unless ይህን_ሙሉ
  end
  .
  .
  .
end
ዝርዝር 11.41: ንቅ ተጠቃሚዎችን ብቻ ለማሳየት የሚያገለግል የፈተና አብነት። test/integration/teteqamis_index_test.rb
require 'test_helper'

class TeteqamisIndexTest < ActionDispatch::IntegrationTest

  def setup
    @astedadari         = teteqamis(:michael)
    @astedadari_yalhone = teteqamis(:ermias)
  end

  test "ገጸቁጥርን እና መሰረዝን የጨመረ አንድ አስተዳዳሪ ማውጫ" do
    gba_ende(@astedadari)
    yeteteqamiwech_yemejemeriya_gets = Teteqami.paginate(page: 1)
    yeteteqamiwech_yemejemeriya_gets.first.toggle!(:nq)
    get teteqamis_path
    assert_template 'teteqamis/index'
    assert_select 'div.pagination'
    assigns(:teteqamis).each do |teteqami|
      assert teteqami.ይህን_ሙሉ
      assert_select 'a[href=?]', teteqami_path(teteqami), text: teteqami.sim
      unless teteqami == @astedadari
        assert_select 'a[href=?]', teteqami_path(teteqami), text: 'ሰርዝ'
      end
    end
    assert_difference 'Teteqami.count', -1 do
      delete teteqami_path(@astedadari_yalhone)
    end
  end
  .
  .
  .
end
ዝርዝር 11.42: አንድ ያልነቃ ተጠቃሚን ማከል። test/fixtures/teteqamis.yml
michael:
  sim: Abnet Teteqami
  emelekt: michael@example.com
  password_digest: <%= Teteqami.fech('mehlefeqal') %>
  astedadari: true
  nq: true
  nq_at: <%= Time.zone.now %>

nqyalhone:
  sim: Nqyalhone Teteqami
  emelekt: nqyalhone@example.com
  password_digest: <%= Teteqami.fech('mehlefeqal') %>
  astedadari: false
  nq: false
.
.
.
ዝርዝር 11.43: የተጠቃሚ ማሳያ ገጽ ንቅ/ያልነቃ ባህሪን ለመፈተን የሚያገለግል አንድ አብነት። test/integration/teteqami_show_test.rb
require 'test_helper'

class TeteqamiShowTest < ActionDispatch::IntegrationTest
  def setup
    @nq_yalhone_teteqami  = teteqamis(:nqyalhone)
    @nq_teteqami = teteqamis(:gerie)
  end

  test "ተጠቃሚ ንቅ ባልሆነበት ጊዜ ማዟዟር አለበት" do
    get teteqami_path(@nq_yalhone_teteqami)
    assert_response      ይህን_ሙሉ
    assert_redirected_to ይህን_ሙሉ
  end

  test "ተጠቃሚ ንቅ ሲሆን ማሳየት አለበት" do
    get teteqami_path(@nq_teteqami)
    assert_response ይህን_ሙሉ
    assert_template ይህን_ሙሉ
  end
end

11.4 የኤመልእክት በምርት ላይ

አሁን በማበልጸጊያ ውስጥ የሚሰሩ የመለያ ማግበርዎችን አግኝተናል፣ በዚህ ክፍል ውስጥ በምርት ላይ አፕልኬሽኑ ትክክለኛ ኤመልእክትን መላክ እንዲችል እናዋቅረዋለን፡፡ ኤመልእክትን ለመላክ በመጀመሪያ አንድ የነጻ የኤመልእክት መላኪያ አገልግሎትን ለማግኘት የሚፈለገውን ቅድመ ዝግጅት እናደርጋለን፣ ከዚያም አፕልኬሽናችንን እናዋቅር እና መጨረሻ ላይ እናሰማራዋለን፡፡

በምርት ላይ ኤመልእክትን ለመላክ ሴንድግሪድ የተባለውን የኤመልእክት መላኪያ አገልግሎትን እንጠቀማለን፣ ይህም በሃረኩ ውስጥ በክፍያ የሚገኝ የሶፍትዌር ተጨማሪ-አገልግሎት (add-on) ነው፡፡ (ይህንን አገልግሎት ከሃረኩ ለማግኘት፣ በሃረኩ መለያችሁ ላይ የዱቤ ካርድ መረጃችሁን ማከልን ይጠይቃል፣ ይሁን እንጂ ስለተመዘገባችሁ ብቻ ከካርዳችሁ የሚቆረጥ ክፍያ አይኖርም፡፡) ለስራችን ማሳኪያ “ማስጀመሪያ (starter)” የተባለው ደረጃ በጣም ተስማሚ ነው፣ (ይህ ጽሑፍ እስከተጻፈበት ጊዜ ድረስ፣ በቀን 400 ኤመልእክትቶችን በነጻ መስደድ ይቻላል)። እሱንም እንደሚከተለው በማድረግ ወደ አፕልኬሽናችን ማከል እንችላለን:-

$ heroku addons:create sendgrid:starter

(ይህ የሃረኩ የማዘዥያ መስመር ትእዛዝ፣ በድሮወቹ ስርዓቶች ላይ ላይሰራ ይችላል። ስለዚህ እንዲህ አይነቱ ሁኔታ በሚያጋጥም ጊዜ፣ አንድም የሃረኩ ማዘዥያ መስመር መሳርያን ማዘመን ሲሆን፣ አለበለዚያ ደግሞ ይህንን የድሮውን የሃረኩ፣ ሃረኩ ሳንድግሪድ:ማስጀመሪያ ተጨማሪአገልግሎት:አክል (heroku addons:add sendgrid:starter) ትእዛዝን መሞከር ነው፡፡)

አፕልኬሽናችን ሴንድግሪድን እንዲጠቀም ለማዋቀር፣ የምርት አካባቢያችንን በ ቀ.መ.ማ.ስ (SMTP)10 ቅንብሮች መሙላት ይኖርብናል። በዝርዝር 11.44 ላይ እንደሚታየው፣ አንድ የ‘አስተናግድ (host) ተለዋዋጪን ከምርት ጣቢያ አድራሻችሁ ጋር መበየንም ይኖርባችኋል፡፡ የሃረኩ አፕልኬሽናችሁን የአስተናጋጅ ስም ለማግኘት አንዱ ብልሃት፣ በጊት የውቅረት ፋይል ላይ የፈልግ (grep) መገልገያን መጠቀም ነው:-

$ grep heroku .git/config
[remote "heroku"]
  url = https://git.heroku.com/mysterious-atoll-47182.git

ያ የኔን የሃረኩ አፕልኬሽን ዓ.አ.ሃ.አን ያሳያል። በዚህ ሁኒታ ላይ በዝርዝር 11.44 ውስጥ የ‘አስተናግድ (host) ተለዋዋጩ ይሄ ይሆናል ማለት ነው:-

host = 'https://mysterious-atoll-47182.herokuapp.com'
ዝርዝር 11.44: በምርት ውስጥ ሴንድግሪድን እንዲጠቀም ሬይልስን ማዋቀር። config/environments/production.rb
Rails.application.configure do
  .
  .
  .
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  host = '<የራሳችሁ የሃረኩ አፕልኬሽን>.herokuapp.com'
  config.action_mailer.default_url_options = { host: host }
  ActionMailer::Base.smtp_settings = {
    :address        => 'smtp.sendgrid.net',
    :port           => '587',
    :authentication => :plain,
    :user_name      => 'apikey',
    :password       => ENV['SENDGRID_API_KEY'],
    :domain         => 'heroku.com',
    :enable_starttls_auto => true
  }
  .
  .
  .
end

ዝርዝር 11.44 ውስጥ ያለው የኤመልእክት ውቅረቱ የተጠቃሚስሙን (user_name) በ‘አፕበቁልፍ ('apikey') እና የ‘መሕለፈቃሉ‘ን (password) ለሴንድግሪድ መለያው በአ.ፕ.በ ቁልፉ ያዘጋጃል፡፡ የኋለኛው በጠንካራ-ኮድ ከመደረግ ይልቅ በ‘አካባቢ (ENV) ተለዋዋጪ በኩል እንደሚደረስ ልታስተውሉ ይገባል። ይህ ለምርት አፕልኬሽኖች የተመረጠ አሰራር ነው፣ ለጥበቃ ሲባል (እንደ ጥሬ መሕለፈቃል የመሳሰሉ) ተነቃፊ የሆኑ መረጃወች፣ በአፕልኬሽኑ የኮድ ምንጪ ላይ በጪራሽ ማጋለጥ የለባቸውም።

ቀጣዩ ሂደት አስፈላጊውን የአ.ፕ.በ ቁልፍን መፍጠር ነው፣ ይህም ሃረኩን በምርት ላይ ኤመልእክትን እንዲልክ ያስችለዋል፡፡ ይህንን ለማድረግ በመጀመሪያ አንድ የሴንድግሪድ መለያን መፍጠር እና ማዋቀር ይኖርባችኋል:-

  1. ለሴንድግሪድ መለያ ተመዝገቡ፡፡ አስፈላጊውን መረጃ በምትሞሉበት ጊዜ የድርጅቱን ስም “Rails Tutorial” እና የድር ጣቢያውን ደግሞ https://www.railstutorial.org ብላችሁ መሙላት ትችላላችሁ (ምስል 11.8)።
  2. ኤመልእክታችሁን ፈትሹ እና የተመዘገባችሁበትን የኤመልእክት አድራሻ ለማስረገጥ አገናኙን ጠቅ ያድርጉ፡፡
  3. ምስል 11.9 ላይ እንደሚታየው፣ አንድ የተረጋገጠ ነጠላ ላኪ ፍጠሩ። ይህ አንድ መለያችሁ እንዳይቀዘቅዝ ወይም ልክ እንደ አንድ አይፈለጌ መልእክት ምልክት እንዳይደረግበት የተፈቀደ አንድ ልዩ ላኪ ነው። አስፈላጊውን መረጃ በምትሞሉበት ጊዜ፣ ትክክለኛውን የኤመልእክት አድራሻችሁን (ማለትም በዝርዝር 11.11 ውስጥ የተጠቀማችሁትን) እና የቤታችሁን ወይም የንግድ አድራሻችሁን ተጠቀሙ፡፡ የሆነ ችግር ካጋጠማችሁ፣ በሴንድግሪድ ነጠላ ላኪ ማረጋገጫ ገጽ ላይ ያሉትን መመሪያዎች ተከተሉ።
  4. ኤመልእክታችሁን ፈትሹ እና ነጠላ ላኪውን ለመፍጠር የተጠቀማችሁበትን የኤመልእክት አድራሻ ለማረጋገጥ አገናኙን ጠቅ ያድርጉ፡፡
images/figures/sendgrid_signup_information
ምስል 11.8: ለሴንድግሪድ በመመዝገብ ወቅት ዝርዝሮችን መሙላት፡፡
images/figures/sendgrid_single_sender
ምስል 11.9: አንድ የሴንድግሪድ ነጠላ ላኪን መፍጠር።

በአንድ የሴንድግሪድ መለያ አንድ የተረጋገጠ ነጠላ ላኪን ከፈጠራችሁ በኋላ፣ አሁን የሚከተሉትን ሂደቶች በመጠቀም አስፈላጊ የሆነውን የአ.ፕ.በ ቁልፍ ለመፍጠር ዝግጁ ናችሁ:-

  1. ቀድሞውኑ ካልገባችሁ፣ ወደ app.sendgrid.com/settings/api_keys ሂዱ እና ወደ ሴንትግሪድ ግቡ፡፡ ከገባችሁ በኋላ፣ ወደ ሴንድግሪድ አ.ፕ.በ ቁልፍ ገጽ በራስሰር ልትተላለፉ ይገባል (ምስል 11.10)።
  2. ምስል 11.10 ላይ እንደሚታየው፣ የ “Create API Key” አዝራርን ጠቅ አድርጉ፡፡
  3. ምስል 11.11 ላይ እንደሚታየው፣ የአ.ፕ.በ ቁልፍ መስኩን ስም በ “Rails Tutorial SendGrid API Key” ሙሉ።
  4. ውጤቱን ለመቅዳት በምስል 11.12 ላይ እንደሚታየው፣ የአ.ፕ.በ ቁልፉ ላይ ጠቅ ካደረጋችሁ በኋላ፣ ከዚያ ለማጠናቀቅ “Done” ‘ን ጠቅ አድርጉ፡፡
images/figures/sendgrid_api_key_page
ምስል 11.10: የሴንድግሪድ አ.ፕ.በ ቁልፍ ገጽ።
images/figures/sendgrid_create_api_key
ምስል 11.11: አንድ የሴንድግሪድ አ.ፕ.በ ቁልፍን መፍጠር።
images/figures/sendgrid_api_key
ምስል 11.12: የሴንድግሪድ አ.ፕ.በ ቁልፍ (መቅዳታችሁን አረጋግጡ!)።

የአ.ፕ.በ ቁልፍን ከቀዳችሁ በኋላ፣ ተዛማጁን የአካባቢ ተለዋዋጪ በ‘አዋቅር፡አዘጋጅ (config:set) ትእዛዝ ውስጥ በመገልበጥ ሃረኩን ማዘጋጀት አለባችሁ:-

$ heroku config:set SENDGRID_API_KEY=<የሴንድግሪድ አ.ፕ.በ ቁልፍን እዚህ ላይ ገልብጡ>

ይህ የአ.ፕ.በ ቁልፍ አሁን በዝርዝር 11.44 ላይ እንደተጠየቀው፣ በሃረኩ ላይ በ‘አካባቢ (ENV) ተለዋዋጪ በኩል ይገኛል፡፡

ያ የሴንድግሪድ ውቅረትን ያጠናቅቃል። በዚህ ጊዜ የርዕስ ቅርንጫፉን ወደ ዋና‘ው (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

አፕልኬሽናችሁ በሃረኩ ላይ መሰማራቱን ከጨረሰ በኋላ፣ አንድ እናንተ የምትቆጣጠሩት የኤመልእክት አድራሻን በመጠቀም፣ በምርት ላይ በሚገኘው የማሳያ አፕልኬሽን ተመዝገቡ፡፡ በምስል 11.13 ላይ እንደሚታየው፣ በክፍል 11.2 ውስጥ እንደተተገበረው፣ አንድ የማግበሪያ ኤመልእክትን ማግኘት አለባችሁ፡፡ በምስል 11.14 ውስጥ እንደሚታየው፣ አገናኙን ጠቅ በምታደርጉበት ጊዜ፣ ቃል እንደተገባው መለያው መንቃት አለበት፡፡

images/figures/activation_email_production
ምስል 11.13: በምርት ውስጥ የተላከ አንድ የመለያ ማግበሪያ ኤመልእክት።
images/figures/activated_in_production
ምስል 11.14: በምርት ውስጥ ስኬታማ የሆነ የመለያ ማግበሪያ።

በዚህ ክፍል ውስጥ ያሉ መመሪያዎች ቀንድ ዓላማ፣ ሃረኩን ለማሰማራት ልክ እንደ አንድ የጽንሰ-ሀሳብ ማረጋገጫ የታሰቡ መሆናቸውን አስተውሉ (ለዛም ነው አንድ የ herokuapp.com ንዑስ-ግዝአትን የተጠቀሙት)፡፡ የሴንድግሪድ ነጠላ ላኪ ማረጋገጫ ሂደቶችን መከተሉ፣ በምርት ውስጥ የመፈተኛ ኤመልእክቶችን ለመላክ ያስችላችኋል፣ ይህ ዘዴ ግን ለአንድ እውነተኛ የድርጣቢያ እንደ ዘላቂ መፍትሔ ሆኖ የተዘጋጀ አይደለም። አንድ ሙሉ በሙሉ የሚሰራ የምርት ድርጣቢያ፣ (በ በብጁ ግዝአት ላይ መሰረታዊ እውቀትን ለማግኘት የሚያስፈልገውን ተማርላይ እንደተገለጸው) በአጠቃላይ አንድ ብጁ ንዑስ-ግዝአትን መጠቀም እና የኤመልእክት አቅርቦትን ለማረጋገጥ ደግሞ የሴንድግሪድ ንዑስ-ግዝአት ማረጋገጫን መጠቀም ይኖርበታል፡፡ በብጁ ግዝአት ላይ መሰረታዊ እውቀትን ለማግኘት የሚያስፈልገውን ተማርን ከተከተላችሁ እና ክላውድፍሌርን ካቀናበራችሁ በኋላ፣ በአንድ ብጁ ንዑስ-ግዝአት፣ በምርት ላይ ኤመልእክትን ለመላክ፣ ለሚያስፈልገው የሴንድግሪድ (ግ.ስ.ስ) (DNS) ማረጋገጫ ሂደት11 ዝግጁ ትሆናላችሁ፡፡

መልመጃዎች

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

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

  1. በምርት ውስጥ ለአንድ አዲስ መለያ (ተጠቃሚ) ተመዝገቡ። ለተመዘገባችሁለት መለያ (ተጠቃሚ) አንድ የኤመልእክት አገኛችሁን?
  2. በማግበሪያ ኤመልእክቱ ውስጥ ያለውን አገናኝ ጠቅ በማድረግ እንደሚሰራ አረጋግጡ፡፡ በአገልጋይ ዘጋቢው ውስጥ ያለው ተዛማጁ ግቤት ምን ይመስላል? ጠቃሚ ምክር:- በማዘዥያ መስመሩ ላይ የ‘ሃረኩ ዘጋቢዎች‘ን (heroku logs) አስኪዱ።

11.5 ማጠቃለያ

ከተጨመረው የመለያ ማግበሪያ ጋር የማሳያ አፕኬሽናችን የመመዝገብ፣ የመግባት እና የመውጣት ፋብሪካው ሊጠናቀቅ ተቃርቧል። አንድ የቀረ ብቸኛ አስፈላጊ ገጸባህሪ ቢኖር፣ ተጠቃሚዎች መሕለፈቃላቸውን ከረሱ በድጋሜ እንዲያስጀምሩ የሚያስችል ገጸባህሪ ብቻ ነው። በሚቀጥለው ምዕራፍ 12 ላይ እንደምናየው፣ የመሕለፈቃል ዳግም ማስጀመርያው ብዙ ገጸባህሪያትን ከመለያ ማግበሪያው ይጋራል፣ ይህ ማለት እዚህ ምዕራፍ ላይ ያካበትነውን ዕውቀት በሚቀጥለው ምዕራፍ ላይ ልንጠቀምበት እንችላለን ማለት ነው፡፡

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

  • የመለያ ማግበሪያዎች የ‘ንቅ መዝገብ ቁሶች ባይሆኑም እንኳ፣ ልክ እንደ ክፍለጊዜወች፣ ልክ እንደ አንድ ሃብት ተደርገው ሊቀደዱ (ሊቀረጹ) እንደሚችሉ፣
  • ሬይልስ ኤመልእክትን ለመላክ፣ የድርጊት መልእክት ላኪ ተግባሮችን እና ትይታዎችን ማመንጨት እንደሚችል፣
  • የድርጊት መልእክት ላኪ፣ ጥሬ-ጽሑፍን እና ሃ.ጽ.መ.ቋን እንደሚደግፍ፣
  • ልክ እንደማንኛውም ተግባር እና ትይታ ላይ እንደሚገኙ ሁሉ፣ በሜይለር ተግባሮች ውስጥ የተበየኑ ቅርፀ ተለዋዋጮች በሜይለር ትይታወች ውስጥም እንደሚገኙ፣
  • የመለያ ማግበሪያ፣ መለያን ለማግበር የሚያገለግል ልዩ ዓ.አ.ሃ.አን ለመፍጠር፣ አንድ የመነጨ ይስሙላን እንደሚጠቀም፣
  • የመለያ ማግበርያዎች፣ ብቁ የማግበሪያ መጠይቆችን በጥብቅ ለመለየት፣ አንድ ክትፍ የማግበሪያ ፍጪን እንደሚጠቀሙ፣
  • ሁለቱም ማለት የመልእክት ላኪ ፈተና እና የውህደት ፈተናወች፣ የተጠቃሚ መልእክት ላኪ ባህሪን ለማጣራት ጠቃሚ እንደሆኑ እና በመጨረሻም
  • በምርት ውስጥ ሴንድግሪድን በመጠቀም ኤመልእክትን መላክ እንደምንችል ተምረናል።
1. ይህ ምዕራፍ በዝርዝር 11.6 ላይ መንጪቶ በምዕራፍ 12 ጥቅም ላይ ከዋለው መላኪያ በስተቀር በሌላ መልኩ ከሌሎች ምዕራፎች ጋር ፈጽሞ አይገናኝም። ስለሆነም አንባቢያን ይህንን ምዕራፍ በመዝለል (አስፈላጊ ከሆነ) ወደ ምዕራፍ 12 ወይም ምዕራፍ 13 ላይ መቀጠል ይችላሉ፤ ሆኖም የዚህ ምዕራፍ እና የሚቀጥለው ምዕራፍ ይዘቶች በቅርብ ስለሚዛመዱ ይህንን ምዕራፍ መዝለል እና ወደ ቀጣዩ ምዕራፍ ማለፍ ትንሽ አስቸጋሪ ሊሆን ይችላል፡፡ ይህ በንዲህ እያለ፣ ይህንን ምዕራፍ እና የሚቀጥለውን ምዕራፍ መዝለል እና መቀጠሉ ግን በጣም ከባድ አይደለም፡፡
2. ከዚህ መሰረታዊ ቅደም ተከተል ጋር የሚሄድ አንድ ሌላ ተጨማሪ ገጸባህሪ ቢኖር፣ መጀመሪያ የተሰደደው የመለያ ማግበርሪያ ለተጠቃሚው ሳይደርስ ቢቀር ወይም የተጠቃሚው አይፈለጌ መልእክት ውስጥ ቢገባ እንደገና የመለያ ማግበርሪያውን ለተጠቃሚው መላክ ነው፡፡ ይህንን ስልጠና ስታጠናቅቁ ይህንን ገጸባህሪ በአፕልኬሽናችሁ ላይ የማከል ችሎታው ይኖርባችኋል። ይህ በንዲህ እንዳለ ዲቫይስ የተባለው እንቁ አንድ የመለያ ማረጋገጫ በድጋሜ መስደድን የሚያካትት ገጸባህሪ ስላልለው፣ እሱን መጠቀምም ትችላላችሁ፡፡
3. የተጠቃሚው መታወቂያ በአፕልኬሽናችን ዓ.አ.ሃ.አ ውስጥ ስለተጋለጠ፣ የተጠቃሚውን የኤመልእክት አድራሻ ከመጠቀም ፈንታ የተጠቃሚውን መታወቂያ መጠቀም እንችል ነበር፣ ነገር ግን ለወደፊቱ በሆነ ምክንያት የተጠቃሚው መታወቂያ እንዳይታወቅ ለማድረግ ከፈለጋችሁ፣ የኤመልእክት አድራሻዎችን ከወዲሁ መጠቀሙ ለወደፊቱ ጥሩ መሰረትን ይጥላል (ለምሳሌ:- በአፕልኬሽናችሁ ውስጥ ምን ያህል ተጠቃሚዎች እንዳሉ ለማወቅ የሚጥሩትን ተቀናቃኞች ለመከላከል ሊያግዝ ይችላል)።
4. ዞሮዞሮ የአርትዕ (edit) ተግባርን መጠቀማችን ላይቀር የማዘዥያ መስመሩ ላይ አርትዕ‘ንም (edit) ባከልነው ነበር፣ ነገር ግን እሱን ከሌላው ትእዛዝ ጋር አብሮ ማከሉ የማንጠቀምባቸውን የፈተና እና የትይታ ፋይሎችን ይፈጥራል።
5. በሬይልስ 5 ውስጥ የታከለውን የ‘ጥብቅ_ይስሙላ_አለው (has_secure_token) መገልገያን የማንጠቀምበት ዋናው ምክንያት፣ ተጓዳኙን ይስሙላ ባልተከታተፈ ጥሬ ጽሑፍ መልክ በውሂበጎታው ውስጥ ስለሚያስቀምጥ ነው።
6. ዓ.አ.ሃ.አ በ /edit?name=Foo%20Bar&email=foo%40msalie.com ላይ እንደሚለው፣ በእና ሆሄ & የተለዩ በርካታ የቁልፍ እና ዋጋ ጥንዶችን ያካተተ በርካታ የመጠይቅ ሰሚአሴቶችን ሊይዝ ይችላል።
7. እኔ ይህንን ምዕራፍ በመጀመሪያ ስጽፍ፣ በሬይልስ ውስጥ እንዴት ለዓ.አ.ሃ.አ ተስማሚ የሆነ አጻጻፍ፣ መጻፍ እንደሚቻል (እንደሚመለጥ)፣ ምንም የማውቀው ነገር አልነበረም፤ እና በዛን ጊዜ እሱን ተሟሙቶ ማወቁ ራሱ ውሃ ያልገበበት (ንጹህ) ቴክኒካዊ ብልሃት ነበር (ሳጥን 1.2)፡፡ ምን አደረኩ መሰላችሁ?ruby rails escape url” ብየ ጎለጎልኩ (ጎግል አደረኩ) ይህም ሁለት ጥሩ የሆኑ አማራጮችን እንዳገኝ ረዳኝ፤ እነሱም URI.encode(str) እና CGI.escape(str) ነበሩ። ከዚያ ሁለቱንም ሞከርዃቸው እና የኋለኛው ከኔ ጋር እንደሚሰራ አረጋገጥኩ፡፡ (ERB::Util የተባለ አንድ ሌላ ሶስተኛ አማራጪ ቤተኮድም አለ፤ ይህም ተመሳሳይ ውጤት ያለው የዓ.አ.ሃ.አ ኢንኮድ ዘዴንም ይሰጣል፡፡)
8. እዚህ ላይ ባሕሪዎችን_አዘምን‘ን (update_attributes) በመጠቀም አንድ ጥሪ ከማድረግ ይልቅ ባሕሪ_አዘምን‘ን (update_attribute) ተጠቅመን ሁለት ጥሪዎችን አድርገናል፣ ለዚህ ምክንያቱም (በክፍል 6.1.5 መሰረት) ባሕሪዎችን_አዘምን (update_attributes) የብቃት ሂደትን ስለሚያስኬድ እና በዚህ አጋጣሚ ደግሞ የተጠቃሚውን መሕለፈቃል ስለሚጠይቀን ለዚህ ስራ ስለማይበቃ ነው።
9. ዝርዝር 11.40 ውስጥ በ‘ && ምትክ እናን (and) እንደሚጠቀም አስተውሉ፣ ሁለቱም በጣም ተመሳሳይ ናቸው፣ ነገር ግን የ && ስሌቱ ከፍ ያለ ቀደምትነት (Precedence) አለው፣ በዚህ ሁኔታ ላይ ከስር_ዓአሃአው (root_url) ጋር የተያያዘ ሲሆን፣ ይህን ችግር ለመፍታት ስር_ዓአሃአውን (root_url) በቅንፍ ውስጥ ማስገባት በቻልን ነበር፣ ነገር ግን እሱን በቅንፍ ውስጥ ከማስገባት ይልቅ፣ እሱን በስነአጻጻፉ/በስነአነጋገሩ ትክክለኛ በሆነ መንገድ ለመተካት እና‘ን (and) መጠቀምን መርጠናል።
10. ቀላል የመልእክት ማስተላለፊያ ስምምነት (ቀ.መ.ማ.ስ (SMTP)):- በኤሌክትሮኒክ መልእክት ለማስተላለፍ የተሰጠ አንድ መደበኛ የበይነመረብ የግንኙነት ስምምነት ነው፡፡
11. (ግ.ስ.ስ) ማለት የግዝአት ስም ስርዓት ማለት ነው፤ Domain Name System (DNS)