በአሁኑ ጊዜ፡ ለድሩ አዲስ የተመዘገቡ ተጠቃሚዎች፣ ልክ መለያቸውን እንዳወጡ፣ ወዲያውኑ በመለያቸው የመጠቀም ሙሉ ችሎታ አላቸው (ምዕራፍ 7)፤ በዚህ ምዕራፍ ውስጥ ተጠቃሚወቹ ለመመዝገብ የተጠቀሙበት የኤመልእክት አድራሻ የራሳቸው መሆኑን ለማረጋገጥ፣ አንድ የመለያ ማግበሪያ ሂደትን ተግባራዊ እናደርጋለን።1 ይህም አንድ የማግበሪያ ይስሙላ እና አንድ ፍጪን ከአንድ ተጠቃሚ ጋር ማዛመድን፣ ለተጠቃሚው ይስሙላውን የያዘ አንድ አገናኝ ኤመልእክት ማድረግን እና ተጠቃሚው የተሰደደለትን አገናኝ ጠቅ በሚያደርግበት ጊዜ ማግበርን ያሳትፋል። በምዕራፍ 12 ላይ ተጠቃሚዎች መሕለፈቃላቸውን ከረሱ ዳግም እንዲያስጀምሩ ተመሳሳይ ሀሳቦችን ተግባራዊ እናደርጋለን፡፡ እነዚህን ሁለት ገጸባህሪያት ተግባር ላይ ለማዋል፣ ለእያንዳንዱ ገጸባህሪ አንድ አዲስ ሃብት መፍጠርን ስለሚያሳትፍ፣ እገረ መንገዳችንን ስለ መቆጣጠሪያወች፣ ማዘዋወሪያወች እና የውሂበጎታ ፍልሰቶች ተጨማሪ ምሳሌዎችን እንድናይ እድል ይሰጡናል። በሂደቱም በሬይልስ ውስጥ በምርት እና በማበልጸጊያ ውስጥ አንድ የኤመልእክትን እንዴት መላክ እንደሚቻል የመማር እድሉ ይኖረናል፡፡
የመለያ ማግበርሪያን የምናስተናግድበት የአሰራር ስልት ከተጠቃሚ መግቢያ (ክፍል 8.2) እና በተለይ ተጠቃሚዎችን ከመዘከር (ክፍል 9.1) ጋር ትይዩ ይሆናል፡፡ መሰረታዊው ቅደም ተከተል እንደሚከተለው ይቀርባል፡-2
የመለያ ማግበሪያ አሰራር ከመሕለፈቃል እና ከዝክረ ይስሙላ ጋር በመመሳሰሉ የተነሳ፣ ለመለያ ማግበሪያ (እንዲሁም ለመሕለፈቃል ዳግም ማስጀመሪያ) የ‘ተጠቃሚ.ፈጪ‘ን (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.2 ላይ ደግሞ የመለያ ማግበሪያ ኤመልእክቶችን ለመላክ አንድ መላኪያን (Mailer) እናክላለን። በክፍል 11.3 ላይ ሰንጠረዥ 11.1 ውስጥ የሚገኘውን የ‘ተረጋግጧልን? (teregagtualn?
) ዘዴ አጠቃላይ ስሪትን አካቶ ትክክለኛውን የመለያ ማግበሪያ ተግባራዊ እናደርጋለን።
በክፍል 8.1 ላይ እንዳለው የክፍለጊዜወች ቅድ የመለያ ማግበሪያው ከ‘ንቅ መዝገብ ቅርጸት ጋር ባይዛመድም፣ የመለያ ማግበሪያውን ግን ልክ እንደ አንድ ሃብት አድርገን ቅድ እናወጣለታለን። እናም ተገቢውን ውሂብ (የማግበሪያ ይስሙላውን እና የማግበሪያ ሁኔታውን ጨምሮ) በተጠቃሚው ቅርጸት ውስጥ እናካትተዋለን።
መለያ ማግበሪያወችን ልክ እንደ አንድ ሃብት አድርገን ስለምንቆጥራቸው፣ ከእነሱ ጋር በአንድ መደበኛ ው.ሁ.ማ ዓ.አ.ሃ.አ በኩል እንገናኛለን። የማግበሪያ አገናኙ የተጠቃሚውን የማግበር ሁኔታን ይቀይረዋል፣ እናም ለእንዲህ ዓይነቶቹ መሻሻሎች መደበኛው የው.ሁ.ማ አሰራር፣ ለ‘አዘምን (update
) ተግባር አንድ የ‘ዓዘምን (PATCH)
መጠይቅን መስጠት ነው (ሰንጠረዥ 7.1)፡፡ የግባሬ አገናኙ በአንድ ኤመልእክት በኩል መላክ አለበት፤ ይህም ከዓዘምን (PATCH)
ይልቅ የ‘ዓግኝ (GET)
መጠይቅን የሚሰጥ አንድ መደበኛ የአሳሽ ጠቅታ ማድረግን ያሳትፋል። በዚህ ንድፍ እገዳ ምክንያት፣ የ‘አዘምን (update
) ተግባርን መጠቀም አንችልም ማለት ነው፤ ስለሆነም በምትኩ ለ‘ዓግኝ (GET)
መጠይቆች ምላሽ የሚሰጠውን የ‘አርትዕ (edit
) ተግባርን እንጠቀማለን።
እንደተለመደው፣ ለአዲሱ ገጸባህሪ አንድ የርእስ ቅርንጫፍን እናደርጋለን:-
$ git checkout -b የመለያ-ማግበሪያ
ልክ እንደ ተጠቃሚዎች እና ልክ እንደ ክፍለጊዜወች፣ የመለያ ማግበሪያወች ሃብቶች ተግባሮችም (በአሁኑ ሁኔታ ላይ ብቸኛው ተግባር) በአንድ መለያ ማግበሪያወች መቆጣጠሪያ ውስጥ ይኖራሉ፡፡ እነሱንም እንደሚከተለው አድርገን ማመንጨት እንችላለን:-4
$ rails generate controller MeleyaMagberyas
በክፍል 11.2.1 እንደምንመለከተው፣ የመለያ ማግበሪያ ኤመልእክቱ አንድ የዚህን:-
edit_magberya_magberya_url(magberya_ysmula, ...)
አይነት ቅርጸት ያለው ዓ.አ.ሃ.አ ማድረግን ያሳትፋል፤ ይህ ማለት ለ‘አርትዕ (edit
) ተግባር አንድ ስዩም ማዘዋወሪያ ያስፈልገናል ማለት ነው፡፡ እሱንም በዝርዝር 11.1 ውስጥ በሚታየው በ‘ሃብቶች (resources
) ዘዴ ማዘጋጀት እንችላለን፣ ይህም በሰንጠረዥ 11.2 ውስጥ የሚታየውን የሙሉው.ሁ.ማ ማዘዋወሪያን ይሰጣል።
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) |
የመለያ ማግበሪያወች የውሂብ ቅዱን እና የኤመልእክት መላኪያውን ከጨረስን በኋላ፣ የ‘አርትዕ (edit
) ተግባሩን በክፍል 11.3.2 ላይ እንበይነዋለን፡፡
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
_path
) ብሎ ስዩም ማዘዋወሪያን ከመዘርዘር ይልቅ ለምን _ዓአሃአ (_url
) ብሎ ስዩም ማዘዋወሪያን ይዘረዝራል? ጠቃሚ ፍንጪ አሁን በአንድ ኤመልእክት ላይ ልንጠቀምበት ነው፡፡
በመግቢያው ላይ እንደተብራራው፣ በማግበሪያ ውስጥ አንድ ኤመልእክትን ለመጠቀም አንድ ልዩ የማግበሪያ ይስሙላ ያስፈልገናል፡፡ አንደኛው አማራጪ በውሂበጎታው ውስጥ የተቀመጠውን እና በማግበሪያ ዓ.አ.ሃ.አው ውስጥ የተካተተውን ማለት ሁለቱንም የያዘ አንድ ሃረግን መጠቀም ነው፤ ነገር ግን ውሂበጎታችን ከተጠለፈ ይህ አሰራር የጥበቃ ችግር ያስከትላል፡፡ ለምሳሌ፣ አንድ የውሂበጎታው መዳረሻ ያለው አጥቂ አዲስ የተፈጠሩ መለያዎችን ወዲያውኑ ሊያነቃ (በዚህም እንደ ተጠቃሚው ሁኖ መግባት ይችላል) እና ከዚያ ሁሉንም ነገር መቆጣጠር ይችል ዘንድ፣ መሕለፈቃሎቹን ሊለውጣቸው ይችላል፡፡ 5
ስለዚህ እንደዚህ ያሉ ክስተቶችን ለመከላከል፣ በምዕራፍ 6 የመሕለፈቃልን እና በምዕራፍ 9 ላይ ደግሞ ዝክረ ይስሙላ ላይ የተጠቀምነውን አሰራር በመከተል፣ አንድ በይፋ ለህዝብ የተጋለጠ ምናባዊ ባሕሪን ከአንድ በውሂበጎታው ውስጥ ከተቀመጠ ጥብቅ ክትፍ ፍጪ ጋር እናጣምራለን፡፡ ይህን መንገድ በመጠቀም:-
teteqami.magberya_ysmula
የማግበሪያ ይስሙላውን መድረስ እና ይህን በመሰለ ኮድ ደግሞ ተጠቃሚውን ማረጋገጥ እንችላለን:-
teteqami.teregagtualn?(:magberya, ysmula)
(ይህ በዝርዝር 9.6 ውስጥ የተበየነውን የተረጋግጧልን? (teregagtualn?
) ዘዴን ማሻሻልን ይጠይቃል።)
እንዲሁም በተጠቃሚ ቅርጸቱ ውስጥ አንድ ንቅ (nq
) የተባለ የቡልየን ባሕሪ እናክላለን፤ ይህም በክፍል 10.4.1 ላይ ያየነው ዓይነት በራስ-የመነጨ የቡልየን ዘዴን በመጠቀም አንድ ተጠቃሚ ንቅ መሆኑን ለመፈተሽ ያስችለናል።
if teteqami.nq? ...
በመጨረሻም፣ በዚህ ስልጠና ውስጥ ባንጠቀማቸውም፣ ለወደፊቱ ማጣቀሻ እንዲሆነን ከተፈለገ በማለት የተጠቃሚዎቹ መለያ መስራት የጀመረበትን ቀን እና ሰዓት በውሂበጎታው ላይ መዝገበናል። ሙሉ የውሂብ ቅዱ በምስል 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
) ዋጋን እናክላለን፡፡
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 የኤመልእክት አድራሻ ንዑስ-ፊደል መልሰጥሪን በአንድ የዘዴ ማጣቀሻ ለመተካት እድሉን እንደተጠቀምን አስተውሉ፡፡
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
) ዘዴ በአገልጋዩ ላይ ያለውን የጊዜ ሰቅ ከግምት ውስጥ በማስገባት፣ ወቅታዊውን ማህተመጊዜ የሚመልስ አንድ አብሮገነብ የሬይልስ ረጅ ነው።)
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
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
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
magberya_fech_fter
) ዘዴን በፈጠራችሁት የተጠቃሚ ቁስ ላይ በመጥራት፣ ዘዴው አንድ የግል ዘዴ በመሆኑ የተነሳ፣ አንድ የ‘ዘዴስህተትየለም (NoMethodError
) ስህተትን በሰሌዳው ውስጥ እንደሚያስነሳ አረጋግጡ፡፡ የተጠቃሚው የማግበርያ ፍጪ ዋጋ ምንድነው?
emelekt.downcase!
) (ማለት ያለ ምንም ምደባ) በማለት በአንድ መስመር ላይ መጻፍ እንደምንችል አይተናል፤ ስለዚህ በዝርዝር 11.3 ላይ ያለውን የ‘ኤመልእክት_ንዑስ_መልከፊደል (emelekt_nious_melkefidel
) ዘዴን በዛ መልኩ ጻፉ እና ለውጡ መስራቱን ለማረጋገጥ የፈተና ስብስቡን አስኪዱ።
የውሂብ ቅዱ ስለተጠናቀቀ አሁን አንድ የመለያ ማግበሪያ ኤመልእክትን ለመላክ የሚያስፈልገውን ኮድ ለማከል ዝግጁ ነን፡፡ ይህንን ተግባራዊ ለማድረግ፣ አንድ የተግባር መላኪያ (Action Mailer) የተባለ ቤተኮድን በመጠቀም፣ አንድ የተጠቃሚ መላኪያን (Teteqami mailer) ማከል ሲሆን፤ ይህንንም አንድ የኤመልእክትን ከአንድ ማግበሪያ አገናኝ ጋር ለመላክ፣ በተጠቃሚዎች መቆጣጠሪያ የ‘ፍጠር (create
) ተግባር ውስጥ እንጠቀምበታለን፡፡ የኤመልእክት መላኪያዎቹ እንደ መቆጣጠሪያ ተግባር ሲዋቀሩ፣ የኤመልእክት ዝግጁገጽታወች ደግሞ ልክ እንደ ትይታወች ይበየናሉ፡፡ እነዚህ ዝግጁገጽታወች የማግበሪያ ይስሙላ አገናኞችን እና ከሚነቃው መለያ ጋር የሚዛመደውን የኤመልእክት አድራሻ ያካትታሉ።
በዝርዝር 11.6 ላይ እንደሚታየው፣ ልክ እንደ ቅርጸቶች እና መቆጣጠሪያወች፣ አንድ መላኪያንም ሬይልስ አመንጪን (rails generate
) በመጠቀም ማመንጨት እንችላለን፡-
$ rails generate mailer TeteqamiMailer meleya_magberya meda_masjemer
እዚህ ጋር፣ ዝርዝር 11.6 አሁን አስፈላጊ ከሆነው የ‘መለያ_ማግበርያ (meleya_magberya
) ዘዴ በተጨማሪ፣ በምዕራፍ 12 ላይ የምንፈልገውን የ‘መዳ_ማስጀመር (meda_masjemer
) ዘዴንም አመንጪቶልናል፤ ይህ ዘዴ መሕለፈቃልን ዳግም ለማስጀመር የሚያገለግል ዘዴ ሲሆን የመጀመሪያው ቃል (meda)፣ የአማርኛውን ቃል ለማሳጠር ሲባል “መሕለፈቃል ዳግም” የሚለውን ትርጓሜ እንዲይዝ ተብሎ የተደረገ አሕጽሮተ ቃል መሆኑን ልትገነዘቡት ይገባል፡፡
በዝርዝር 11.6 ውስጥ ያለው ትእዛዝ ለእያንዳንዱ መላኪያ ሁለት የትይታ ዝግጁገጽታወችን ያመነጫል፣ እነሱም አንድ ለጥሬ-ጽሑፍ ኤመልእክት እና አንድ ለሃ.ጽ.መ.ቋ ኤመልእክት የሚያገለግሉ ዝግጁገጽታወች ናቸው። የመለያ ማግበሪያ መላኪያ ዘዴወቹ በዝርዝር 11.7 እና ዝርዝር 11.8 ውስጥ ይታያሉ፡፡ (ተጓዳኞቹን የመሕለፈቃል ዳግም ማስጀመሪያ ዝግጁገጽታወች በምዕራፍ 12 ላይ እናስተናግዳቸዋለን።)
app/views/teteqami_mailer/meleya_magberya.text.erb
Teteqami#meleya_magberya
<%= @greeting %>, find me in app/views/teteqami_mailer/meleya_magberya.text.erb
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
) አክሏል፣ ይህም በመቆጣጠሪያወች ውስጥ ያሉ ቅርፀ ተለዋዋጮች በተራው ትይታ ውስጥ እንደሚገኙ ሁሉ፣ በተመሳሳይ መንገድ በመላኪያ ትይታወች ውስጥም እንደዛው ይገኛሉ፡፡
app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
default from: 'from@example.com'
layout 'mailer'
end
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” ‘ን በእውነተኛ የኤመልእክት አድራሻችሁ መተካት ይኖርባችኋል፡፡
from
) አድራሻ ጋር። app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
default from: "noreply@msalie.com"
layout 'mailer'
end
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 ማለት ለመረጃ ልውውጥ የአሜሪካ መደበኛ ኮድ (መ.ል.አ.መ.ኮ) ሆሄን በገጹ ላይ ስለሚጠይቅ እና የአማርኛው ሆሄ ሌላ አይነት የሆሄ ቋንቋን ስለሚጠቀም ነው፡፡ ስለሆነም የአማርኛውን ስሪት ተጠቅማችሁ ፈተናው አላልፍ ካላችሁ በነዚሁ ዝርዝሮች ውስጥ የተሰጠውን አማራጪ መጠቀም ይኖርባችኋል (አስተያየቱን ቀድቶ መገልበጥ እንደለለባችሁ ታውቁ ይሆናል)፡፡ (ፈተናው የማያልፈው በዚህ ምክንያት ብቻ መሆኑን ካረጋገጣችሁ በኋላ፣ ለመውደቅ ምክንያት የሆነውን ገጽ ሙሉ በሙሉ ወደ አማርኛው ስሪት በመቀየር የፈተናውን አለማለፍ ወደ ጎን መተው ትችላላችሁ፡፡)
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) %>
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) %>
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
CGI
) ክፍለክፍል የ‘አስመልጥ (escape
) ዘዴው፣ በዝርዝር 11.15 ላይ እንደሚታየው፣ የኤመልእክት አድራሻውን እንዳስመለጠ አረጋግጡ፡፡ "Lwam Konjo!"
? የሚለው ሆሄ የአምልጦ ዋጋ ምንድነው?
CGI.escape
) ማስመለጥ፡፡
>> CGI.escape('tesheme@msalie.com')
=> "tesheme%40msalie.com"
በዝርዝር 11.13 እና በዝርዝር 11.14 ውስጥ የተበየኑትን የዝግጁገጽታወች ውጤቶችን ለማየት እና የኤመልእክት መልእክቶቻችን ምን እንደሚመስሉ ለመመልከት፣ በሬይልስ የተዘጋጁ ልዩ ዓ.አ.ሃ.አወችን ማለት “የኤመልእክት ቅድመ-እይታዎችን (Email Previews)” መጠቀም እንችላለን፡፡ በመጀመሪያ ግን፣ በዝርዝር 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
የሚለው ክፍል ሊለያይ እንደሚችል ልብ ልትሉ ይገባል)
አንድ የሰፈር ስርዓትን የምትጠቀሙ ከሆነ ደግሞ፣ በምትኩ ይህንን መጠቀም ትችላላችሁ:-
host = 'localhost:3000' # የሰፈር አገልጋይ
config.action_mailer.default_url_options = { host: host, protocol: 'http' }
በተለይ፣ በላይኛው ምሳሌ ላይ ጥ.ሃ.ጽ.ማ.ስ (https
) የሚለው ወደ ሃ.ጽ.ማ.ስ (http
) እንደተቀየረ አስተውሉ፡፡
በዝርዝር 11.17 ላይ እንደሚታየው፣ በዝርዝር 11.16 ላይ ያደረግነውን ውቅረት ለማንቃት፣ የማበልጸጊያ አገልጋዩን እንደገና ካስጀመርን በኋላ፣ በክፍል 11.2 ላይ በራስሰር የመነጨውን የተጠቃሚ መላኪያ ቅድመ-እይታ ፋይልን ማዘመን ይኖርብናል፡፡
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)።)
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 ላይ ይታያሉ፡፡
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
እንደ አንድ የመጨረሻ ደረጃ ሂደት ይሆነን ዘንድ፣ በኤመልእክት ቅድመ-እይታ ውስጥ የተመለከቱትን ውጤቶች በደንብ ለማረጋገጥ፣ ሁለት ፈተናወችን እንጽፋለን፡፡ ይህም እንደተጠበቀው ከባድ አይደለም፣ ምክንያቱም ሬይልስ ለእኛ ጠቃሚ የሆኑ የፈተና ምሳሌዎችን ስለፈጠረልን ነው (ዝርዝር 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” ‘ን በእውነተኛ የኤመልእክት አድራሻችሁ መተካት ይኖርባችኋል፡፡
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 ላይ እንደሚታየው፣ የፈተና ፋይላችንን በተገቢው የግዛት አስተናጋጅ ማዋቀር ይኖርብናል፡፡
config/environments/test.rb
Rails.application.configure do
.
.
.
config.action_mailer.delivery_method = :test
config.action_mailer.default_url_options = { host: 'msalie.com' }
.
.
.
end
ከላይ ባለው ኮድ፣ የመላኪያው ፈተና አረንጓዴመሆን ይገባዋል:-
$ rails test:mailers
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
CGI.escape
) ዘዴን ብታስወግዱት፣ ፈተናው ቀይ እንደሚሆን አረጋግጡ፡፡
መፍጠሪያ
ተግባርን ማዘመንመላኪያውን በአፕልኬሽናችን ላይ ለመጠቀም፣ በዝርዝር 11.23 ላይ እንደሚታየው፣ ተጠቃሚዎችን ለመመዝገብ እንጠቀምበት የነበረው የ‘ፍጠር (create
) ተግባር ላይ ሶስት መስመር ኮዶችን ማከል ይኖርብናል፡፡ ዝርዝር 11.23 በምዝገባ ወቅት፣ አንድ ተጠቃሚን የማዟዟሩን ባህሪ እንደቀየረው አስተውሉ። ከዚህ በፊት ወደ ተጠቃሚ መገለጫ ገጽ እናዟዙር ነበረ (ክፍል 7.4)፣ አሁን ግን ተጠቃሚው አንድ የመለያ ማግበሪያ እንዲኖረው ይፈለጋል፣ ስለዚህ በአሁኑ ጊዜ ተጠቃሚውን ወደ መገለጫ ግጹ ማዟዟሩ ምንም ትርጉም አይሰጥም፡፡ በምትኩ፣ አሁን ወደ ስረ ዓ.አ.ሃ.አው እናዟዙራለን።
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 ውስጥ እነዚህ ፈተናወች ላይ ያደረግነውን አስተያየት በማስወገድ የመለያ ማግበሪያ ፈተናወችን የሚያሳልፉ አዲስ ፈተናወችን እንጽፋለን፡፡
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 ውስጥ በአንድ የምርት ማበልጸጊያ ላይ ትክክለኛ የኤመልእክትን እንዴት አድርጎ መላክ እንደሚቻል እንመለከታለን፡፡
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--
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
አሁን በዝርዝር 11.25 ላይ እንደተለመደው፣ አንድ በትክክለኛው መንገድ የመነጨ የኤመልእክት ስላለን፣ ተጠቃሚውን የሚያነቃውን፣ የ‘አርትዕ (edit
) ተግባርን በመለያ ማግበሪያ መቆጣጠሪያው ውስጥ መጻፍ ይኖርብናል፡፡ እንደተለመደው ለዚህ ተግባር አንድ ፈተናን እንጽፋለን፣ ከዚያ ኮዱ ከተፈተነ በኋላ፣ አንዳንድ ተግባራትን ከመለያ ማግበሪያ መቆጣጠሪያው ወደ ተጠቃሚ ቅርጸቱ ለማሸጋገር ፈተናውን እናጣራዋለን፡፡
የተረጋግጧልን?
ዘዴን አጠቃላይ ማድረግየማግበሪያ ይስሙላው እና የኤመልእክቱ በ‘ሰሚአሴቶች[:መታወቂያ]‘ው (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?
) ዘዴን ይሰጠናል፡፡
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 ላይ ያለው የመግለጫ ጽሑፍ የፈተና ስብስቡ ቀይ እንደሆነ ያመለክታል:-
$ rails test
ለመውደቁ ምክንያት የሆኑት የ‘ዓሁን_ተጠቃሚ (ahun_teteqami
) ዘዴ (ዝርዝር 9.9) እና ፍጪው ምንም (nil
) አለመሆኑን የሚፈትኑት (ዝርዝር 9.17) ሁለቱም፣ ከሁለት ይልቅ አንድ ነጋሪአሴት የሚወስደውን የድሮውን የተረጋግጧልን? (teregagtualn?
) ስሪትን ስለሚጠቀሙ ነው፡፡ ይህ አንድ የፈተና ስብስብ ሊይዘው የሚገባው የስህተት ዓይነት መሆኑን ልብ ልትሉ ይገባል።
ችግሩን ለማስተካከል፣ በዝርዝር 11.28 እና በዝርዝር 11.29 ላይ እንደሚታየው፣ የተጠቃለለውን ዘዴ ለመጠቀም ሁለቱን ጉዳዮች በቀላሉ እናዘምነለን፡፡ ዝርዝር 11.28 በክፍል 9.3.2.1 ላይ የክፍለጊዜ ጥገና ችግርን ለመፍታት ለተሰጠው መልመጃ መልሱን እንደሚያካትት ልብ በሉ፤ ስለሆነም ያንን መልመጃ ካላጠናቀቃችሁ፣ የተጠቃሚ ቅርጸታችሁን ዝርዝር 9.36 ላይ በተሰጠው ኮድ ማዘመናችሁን አረጋግጡ፡፡
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
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
በዚህ ጊዜ፣ ፈተናወቹ በሙሉ አረንጓዴመሆን አለባቸው:-
$ rails test
ከላይ እንዳለው ዓይነት ኮድን ያለ አንድ እጅግ ጠንካራ የፈተና ስብስብ ማጣራቱ፣ በጣም አደጋ ላይ ለሚጥል ስህተት ያጋልጣል፣ እናም ለዚህ ነው እኛ በክፍል 9.1.2 እና በክፍል 9.3 ላይ ጥሩ ፈተናወችን ለመጻፍ እንደዛ የደከምነው፡፡
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
teregagtualn?
) ዘዴን በመጠቀም፣ ተጠቃሚው በዝክረ ይስሙላው እና በማግበሪያ ይስሙላው መሰረት የተረጋገጠ መሆኑን አረጋግጡ፡፡
የአርትዖት
ተግባርልክ እንደ ዝርዝር 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 አንድ ብቁ ያልሆነ የማግበሪያ ይስሙላ ሁኔታን እንደሚያስተናግድም አስተውሉ፤ ይህም አልፎ አልፎ ሊከሰት የሚችል ነገር ቢሆንም፣ በዚህ ሁኔት ላይ ወደ ስረ ዓ.አ.ሃ.አው ማዟዟሩ ግን ቀላል ነው፡፡
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 ውስጥ የሚታየውን ውጤት አግኝቻለሁ፡፡
በእርግጥ በአሁኑ ጊዜ የተጠቃሚ ማግበሪያ ምንም ነገር አያደርግም፣ ምክንያቱም ተጠቃሚዎች እንዴት መግባት እንዳለባቸው የሚወስነው ኮድ አልተለወጠም፡፡ የመለያ ማግበሪያው አንድ ትርጉም እንዲኖረው ለማድረግ፤ ተጠቃሚዎች ከነቁ ብቻ እንዲገቡ ማስቻል አለብን፡፡ ይህንን ለማድረግ በዝርዝር 11.32 ላይ እንደሚታየው፣ ተጠቃሚው መንቃቱን እና አለመንቃቱን ለማረጋገጥ፣ ተጠቃሚ.ንቅነውን? (teteqami.nq?
) ዘዴን እንጠቀማለን፣ ይህ ዘዴ እውነትን ከመለሰ፣ ተጠቃሚውን እናስገባለን፣ አለበለዚያ ግን ከአንድ የማስጠንቀቂያ
መልእክት ጋር ወደ ስረ ዓ.አ.ሃ.አው እናዟዙራለን (ምስል 11.7)።
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
በዚያ፣ አንድ ተጨማሪ ማሻሻያን ከማከል በስተቀር፣ አሁን የተጠቃሚ ማግበሪያ መሰረታዊ ተግባር ተጠናቋል። (ይህ ማሻሻያም ያልነቁ ተጠቃሚዎች እንዳይታዩ ማድረግ ሲሆን፣ ይህም ልክ እንደ አንድ መልመጃ ይሆናችሁ ዘንድ፣ ለናንተ ተትቷል (ክፍል 11.3.3.1)።) በክፍል 11.3.3 ውስጥ የተወሰኑ ፈተናወችን በማከል እና ከዚያ ትንሽ የኮድ ማጣራትን በማድረግ ሂደቱን እናጠናቅቃለን።
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
በዚህ ክፍል ውስጥ፣ ለመለያ ማግበሪያ አንድ የውህደት ፈተናን እናክላለን፡፡ በብቁ መረጃ ለመመዝገብ የሚያስችል አንድ ፈተና ቀደም ሲል ስለነበረን፣ በክፍል 7.4.4 (ዝርዝር 7.31) ውስጥ በበለጸገው ፈተና ላይ አንዳንድ ሂደቶችን እናክልበታለን። እነዚህን ፈተናወች ለማከል የምናደርጋቸው ሂደቶች በጣም ጥቂቶች እና ሲበዛ ግልጾች ናቸው፤ እስኪ ከቻላችሁ ከዝርዝር 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 ላይ የተደረጉትን አስተያየቶች እነበሩበት እንደሚመልሳቸው አስተውሉ፡፡
በዚህ ጊዜ፣ የፈተና ስብስቡ አረንጓዴመሆን አለበት፡-
$ rails test
አሁን በዝርዝር 11.33 ውስጥ ካለው ፈተና ጋር፣ አንዳንድ የተጠቃሚ ማንቀሳቀሻወችን ከመቆጣጠሪያው ወደ ቅርጸቱ በማሸጋገር ኮዱን ትንሽ ለማጣራት ዝግጁ ነን፡፡ በተለይም የተጠቃሚውን የማግበሪያ ባሕሪዎች ለማዘመን አንድ አግብር (agbr
) የተባለ ዘዴን እና የማግበሪያ ኤመልእክትን ለመላክ የሚያገለግል አንድ ማግበርያ_ኤመልእክት_ላኪ (megberya_emelekt_laki
) የተባለ ዘዴን እንሰራለን። ተጨማሪዎቹ ዘዴወች በዝርዝር 11.35 ውስጥ ይገኛሉ፣ በዝርዝር 11.36 እና በዝርዝር 11.37 ላይ ደግሞ የተጣሩት የአፕልኬሽኑ ኮዶች ይታያሉ፡፡
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
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
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
እንደነዚህ ዓይነት ጥቃቅን ነገሮች ናቸው በትክክል አንድ ቀላል ኮድን በማጣራት ሂደት ላይ በቀላሉ ሊረሱ የሚችሉት፣ ነገር ግን በአንድ ጥሩ የፈተና ስብስብ ጋማ ይባላሉ፡፡ ይህ የሚታወቀው ደግሞ ፈተናው እስከአሁን ድረስ አረንጓዴሲሆን ነው፡-
$ rails test
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
agbr
) ዘዴ የ‘ባሕሪ_አዘምን‘ን (update_attribute
) ሁለት ተግባራትን እንዲፈጽም ያስፈልጋል፣ እያንዳንዱ ተግባርም የተለየ የውሂበጎታ ግንኙነትን (ዝውውርን) ይጠይቃል፡፡ በዝርዝር 11.39 ውስጥ የሚታየው አብነት ላይ እንደተመለከተው፣ ይህን_ሙሉ
የሚለው ቦታ ላይ የሚያስፈልገውን ኮድ በመሙላት፣ ሁለቱንም የ‘ባሕሪ_አዘምን (update_attribute
) ዘዴ ጥሪዎች በ‘አምዶች_አዘምን (update_columns
) ዘዴ በመተካት ወደ አንድ ነጠላ ጥሪ ለውጡ፡፡ (ልክ እንደ አምዶች_አዘምን (update_columns
) ዘዴ የ‘ባሕሪ_አዘምን (update_attribute
) ዘዴም የቅርጸት መልሰጥሪወችን ወይም ማረጋገጫወችን እንደማያስኬድ አስተውሉ፡፡) እነዚህን ለውጦች ካደረጋችሁ በኋላም የፈተና ስብስቡ አሁንም አረንጓዴመሆኑን አረጋግጡ።
ይህን_ሙሉ
የሚለው ቦታ ላይ የሚያስፈልገውን ኮድ በመሙላት፣ ይህንን ባህሪይ በአፕልኬሽናችሁ ላይ አሟሉ።9 (ይህ አብነት በክፍል 13.3.3 ላይ በይበልጥ የምንማረውን የ‘ንቅ መዝገብ የ‘የት (where
) ዘዴን ይጠቀማል።)
rails generate integration_test teteqami_show
) ማስኬድ እና ከዚያም በዝርዝር 11.42 ላይ እንደሚታየው፣ አንድ ያልነቃ የእቃ ተጠቃሚን ማከል ይኖርባችኋል፡፡ ለዚህ ፈተና የሚሆን አንድ ተዛማጅ የፈተና አብነት በዝርዝር 11.43 ውስጥ ይታያል፡፡
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
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
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
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
.
.
.
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
አሁን በማበልጸጊያ ውስጥ የሚሰሩ የመለያ ማግበርዎችን አግኝተናል፣ በዚህ ክፍል ውስጥ በምርት ላይ አፕልኬሽኑ ትክክለኛ ኤመልእክትን መላክ እንዲችል እናዋቅረዋለን፡፡ ኤመልእክትን ለመላክ በመጀመሪያ አንድ የነጻ የኤመልእክት መላኪያ አገልግሎትን ለማግኘት የሚፈለገውን ቅድመ ዝግጅት እናደርጋለን፣ ከዚያም አፕልኬሽናችንን እናዋቅር እና መጨረሻ ላይ እናሰማራዋለን፡፡
በምርት ላይ ኤመልእክትን ለመላክ ሴንድግሪድ የተባለውን የኤመልእክት መላኪያ አገልግሎትን እንጠቀማለን፣ ይህም በሃረኩ ውስጥ በክፍያ የሚገኝ የሶፍትዌር ተጨማሪ-አገልግሎት (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'
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
) ተለዋዋጪ በኩል እንደሚደረስ ልታስተውሉ ይገባል። ይህ ለምርት አፕልኬሽኖች የተመረጠ አሰራር ነው፣ ለጥበቃ ሲባል (እንደ ጥሬ መሕለፈቃል የመሳሰሉ) ተነቃፊ የሆኑ መረጃወች፣ በአፕልኬሽኑ የኮድ ምንጪ ላይ በጪራሽ ማጋለጥ የለባቸውም።
ቀጣዩ ሂደት አስፈላጊውን የአ.ፕ.በ ቁልፍን መፍጠር ነው፣ ይህም ሃረኩን በምርት ላይ ኤመልእክትን እንዲልክ ያስችለዋል፡፡ ይህንን ለማድረግ በመጀመሪያ አንድ የሴንድግሪድ መለያን መፍጠር እና ማዋቀር ይኖርባችኋል:-
በአንድ የሴንድግሪድ መለያ አንድ የተረጋገጠ ነጠላ ላኪን ከፈጠራችሁ በኋላ፣ አሁን የሚከተሉትን ሂደቶች በመጠቀም አስፈላጊ የሆነውን የአ.ፕ.በ ቁልፍ ለመፍጠር ዝግጁ ናችሁ:-
የአ.ፕ.በ ቁልፍን ከቀዳችሁ በኋላ፣ ተዛማጁን የአካባቢ ተለዋዋጪ በ‘አዋቅር፡አዘጋጅ (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 ውስጥ እንደሚታየው፣ አገናኙን ጠቅ በምታደርጉበት ጊዜ፣ ቃል እንደተገባው መለያው መንቃት አለበት፡፡
በዚህ ክፍል ውስጥ ያሉ መመሪያዎች ቀንድ ዓላማ፣ ሃረኩን ለማሰማራት ልክ እንደ አንድ የጽንሰ-ሀሳብ ማረጋገጫ የታሰቡ መሆናቸውን አስተውሉ (ለዛም ነው አንድ የ herokuapp.com ንዑስ-ግዝአትን የተጠቀሙት)፡፡ የሴንድግሪድ ነጠላ ላኪ ማረጋገጫ ሂደቶችን መከተሉ፣ በምርት ውስጥ የመፈተኛ ኤመልእክቶችን ለመላክ ያስችላችኋል፣ ይህ ዘዴ ግን ለአንድ እውነተኛ የድርጣቢያ እንደ ዘላቂ መፍትሔ ሆኖ የተዘጋጀ አይደለም። አንድ ሙሉ በሙሉ የሚሰራ የምርት ድርጣቢያ፣ (በ በብጁ ግዝአት ላይ መሰረታዊ እውቀትን ለማግኘት የሚያስፈልገውን ተማርላይ እንደተገለጸው) በአጠቃላይ አንድ ብጁ ንዑስ-ግዝአትን መጠቀም እና የኤመልእክት አቅርቦትን ለማረጋገጥ ደግሞ የሴንድግሪድ ንዑስ-ግዝአት ማረጋገጫን መጠቀም ይኖርበታል፡፡ በብጁ ግዝአት ላይ መሰረታዊ እውቀትን ለማግኘት የሚያስፈልገውን ተማርን ከተከተላችሁ እና ክላውድፍሌርን ካቀናበራችሁ በኋላ፣ በአንድ ብጁ ንዑስ-ግዝአት፣ በምርት ላይ ኤመልእክትን ለመላክ፣ ለሚያስፈልገው የሴንድግሪድ (ግ.ስ.ስ) (DNS) ማረጋገጫ ሂደት11 ዝግጁ ትሆናላችሁ፡፡
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
heroku logs
) አስኪዱ።
ከተጨመረው የመለያ ማግበሪያ ጋር የማሳያ አፕኬሽናችን የመመዝገብ፣ የመግባት እና የመውጣት ፋብሪካው ሊጠናቀቅ ተቃርቧል። አንድ የቀረ ብቸኛ አስፈላጊ ገጸባህሪ ቢኖር፣ ተጠቃሚዎች መሕለፈቃላቸውን ከረሱ በድጋሜ እንዲያስጀምሩ የሚያስችል ገጸባህሪ ብቻ ነው። በሚቀጥለው ምዕራፍ 12 ላይ እንደምናየው፣ የመሕለፈቃል ዳግም ማስጀመርያው ብዙ ገጸባህሪያትን ከመለያ ማግበሪያው ይጋራል፣ ይህ ማለት እዚህ ምዕራፍ ላይ ያካበትነውን ዕውቀት በሚቀጥለው ምዕራፍ ላይ ልንጠቀምበት እንችላለን ማለት ነው፡፡
edit
) ተግባርን መጠቀማችን ላይቀር የማዘዥያ መስመሩ ላይ አርትዕ‘ንም (edit
) ባከልነው ነበር፣ ነገር ግን እሱን ከሌላው ትእዛዝ ጋር አብሮ ማከሉ የማንጠቀምባቸውን የፈተና እና የትይታ ፋይሎችን ይፈጥራል።has_secure_token
) መገልገያን የማንጠቀምበት ዋናው ምክንያት፣ ተጓዳኙን ይስሙላ ባልተከታተፈ ጥሬ ጽሑፍ መልክ በውሂበጎታው ውስጥ ስለሚያስቀምጥ ነው።/edit?name=Foo%20Bar&email=foo%40msalie.com
ላይ እንደሚለው፣ በእና ሆሄ &
የተለዩ በርካታ የቁልፍ እና ዋጋ ጥንዶችን ያካተተ በርካታ የመጠይቅ ሰሚአሴቶችን ሊይዝ ይችላል።URI.encode(str)
እና CGI.escape(str)
ነበሩ። ከዚያ ሁለቱንም ሞከርዃቸው እና የኋለኛው ከኔ ጋር እንደሚሰራ አረጋገጥኩ፡፡ (ERB::Util
የተባለ አንድ ሌላ ሶስተኛ አማራጪ ቤተኮድም አለ፤ ይህም ተመሳሳይ ውጤት ያለው የዓ.አ.ሃ.አ ኢንኮድ ዘዴንም ይሰጣል፡፡)update_attributes
) በመጠቀም አንድ ጥሪ ከማድረግ ይልቅ ባሕሪ_አዘምን‘ን (update_attribute
) ተጠቅመን ሁለት ጥሪዎችን አድርገናል፣ ለዚህ ምክንያቱም (በክፍል 6.1.5 መሰረት) ባሕሪዎችን_አዘምን (update_attributes
) የብቃት ሂደትን ስለሚያስኬድ እና በዚህ አጋጣሚ ደግሞ የተጠቃሚውን መሕለፈቃል ስለሚጠይቀን ለዚህ ስራ ስለማይበቃ ነው።&&
ምትክ እናን (and
) እንደሚጠቀም አስተውሉ፣ ሁለቱም በጣም ተመሳሳይ ናቸው፣ ነገር ግን የ &&
ስሌቱ ከፍ ያለ ቀደምትነት (Precedence) አለው፣ በዚህ ሁኔታ ላይ ከስር_ዓአሃአው (root_url
) ጋር የተያያዘ ሲሆን፣ ይህን ችግር ለመፍታት ስር_ዓአሃአውን (root_url
) በቅንፍ ውስጥ ማስገባት በቻልን ነበር፣ ነገር ግን እሱን በቅንፍ ውስጥ ከማስገባት ይልቅ፣ እሱን በስነአጻጻፉ/በስነአነጋገሩ ትክክለኛ በሆነ መንገድ ለመተካት እና‘ን (and
) መጠቀምን መርጠናል።