የመለያ ማግበሪያውን በምዕራፍ 11 ላይ ካጠናቀቅን በኋላ (በዛም የተጠቃሚውን የኤመልእክት አድራሻ በማረጋገጥ)፣ አሁን የመሕለፈቃል ዳግም ማስጀመርያን ለመተግበር አንድ ጥሩ አቋም ላይ እንገኛለን፣1 እና በዚህም የመሕለፈቃላቸውን ለሚረሱ ተጠቃሚዎች የተለመዱ ጉዳዮችን እናስተናግዳለን፡፡ ከዚህ በኋላ እንደምናየው፣ አብዛኞቹ ሂደቶች፣ በመለያ ማግበሪያ ላይ የተጠቀምንባቸው ሂደቶች ጋር ተመሳሳይ ስልሆኑ፣ በክፍል 11 ውስጥ የቀሰምናቸው እውቀቶችን እንደገና ለመጠቀም በርካታ እድሎች ይኖሩናል፡፡ ምንም እንኳን የመለያ ማግበሪያው ጋር ተመሳሳይ ቢሆንም፣ አጀማመሩ ግን ከሱ ይለያያል፤ (የኤመልእክትን እና አዲስ የመሕለፈቃል ማስረከቢያን ለማስተናገድ) የመሕለፈቃል ዳግም ማስጀመርያን ለመተግበር አንዱ ቅጽ ላይ የትይታ ለውጥ እና ሁለት አዲስ ቅጾችን ይፈልጋል።
ለመሕለፈቃል ዳግም ማስጀመርያው፣ አንድም ኮድ ከመጻፋችን በፊት እስኪ የምንጠብቀውን ውጤት በቅደም ተከተል በስእላዊ መግለጫ መልኩ እንመልከት። የማሳያ አፕልኬሽኑ የመግቢያ ቅጽ ላይ አንድ “መሕለፈቃልወን ረሱ” የተባለ አገናኝን በማከል እንጀምራለን (ምስል 12.1)። የ “መሕለፈቃልወን ረሱ” አገናኙ አንድ ቅጽ ይዞ ወደ አንድ ገጽ በመሄድ አንድ የኤመልእክት አድራሻን ይወስድ እና አንድ የመሕለፈቃል ዳግም ማስጀመሪያ አገናኝን ይልካል (ምስል 12.2)። የዳግም ማስጀመሪያ አገናኙ በምስል 12.3 ላይ እንደሚታየው፣ የተጠቃሚውን የመሕለፈቃል (ከማረጋገጫ ጋር) ዳግም ለማስጀመር አንድ ቅጽን ያመጣል፡፡
ምዕራፍ 11 ‘ን ተከታትላችሁ ከሆነ፣ በክፍል 11.2 (ዝርዝር 11.6) ላይ የተፈጠረ አንድ የመሕለፈቃል ዳግም ማስጀመርያ መላኪያ ከድሮው አላችሁ ማለት ነው፡፡ በዚህ ክፍል ውስጥ ከመላኪያው ጋር አብሮ ለሚሄደው የመሕለፈቃል ዳግም ማስጀመሪያ (ክፍል 12.1) አንድ ሀብትን እና አንድ የውሂብ ቅድን በማከል አስፈላጊውን ቅድመ ዝግጅት እናጠናቅቃለን። ትክክለኛውን የመሕለፈቃል ዳግም ማስጀመርያ በክፍል 12.3 ውስጥ እንተገብራለን፡፡
ከመለያ ማግበሪያዎች ጋር በተመሳሰለ መልኩ አጠቃላይ እቅዳችን፣ አንድ የመሕለፈቃል ዳግም ማስጀመሪያ ሃብትን ማድረግ ነው። እያንዳንዱ የመሕለፈቃል ዳግም ማስጀመርያ አንድ ዳግመማስጀመሪያ ይስሙላ እና አንድ ተዛማጅ የዳግመማስጀመሪያ ፍጪን ያካትታል፡፡ የትግበራው ዋናው ቅደም ተከተል እንደሚከተለው ይሆናል:-
የመሕለፈቃል ዳግም ማስጀመርያዎቹ፣ ልክ እንደ ክፍለጊዜወች (ክፍል 8.1) እና የመለያ ማግበሪያዎች (ምዕራፍ 11) ከንቅ መዝገብ ቅርጸት ጋር የሚዛመዱ ባይሆንም፣ ልክ እንደ አንድ ሃብት አድርገን እንቀርጻቸዋለን፡፡ እናም ተገቢዎቹን ውሂቦች (የዳግመማስጀመሪያ ይስሙላውንም ጨምሮ) በተጠቃሚ ቅርጸቱ ውስጥ እናካትታቸዋለን።
የመሕለፈቃል ዳግም ማስጀመርያዎችን ልክ እንደ አንድ ሃብት አድርገን ስለምንቆጥራቸው፣ ከእነሱ ጋር በመደበኛ ው.ሁ.ማ ዓ.አ.ሃ.አወች በኩል እንገኛለን። የ‘አርትዕ (edit
) ተግባር ብቻ ከሚያስፈልገው ከማግበሪያ አገናኝ በተለየ መልኩ፣ በዚህ ጊዜ የመሕለፈቃል ዳግም ማስጀመርያን ለማንቀሳቀስ፣ እንዲሁም እነሱን ለመፍጠር እና ለማዘመን ሁለቱንም ማለት የ‘አዲስ (new
) እና የ‘አርትዕ (edit
) ቅጾችን እናቀርባለን፣ ስለሆነም በድምሩ አራቱንም የሙሉው.ሁ.ማ ማዘዋወሪያወችን እንጠቀማለን።
እንደተለመደው፣ ለአዲሱ ገጸባህሪ አንድ የርእስ ቅርንጫፍ እናደርጋለን:-
$ git checkout -b መሕለፈቃልን-ዳግም-ማስጀመር
የመጀመሪያው ሂደታችን ለመሕለፈቃል ዳግም ማስጀመርያ ሃብቱ አንድ መቆጣጠሪያን ማመንጨት ነው፣ ከዚህ በላይ እንደተወያየነው፣ ሁለቱንም የ‘አዲስ (new
) እና የ‘አርትዕ (edit
) ተግባሮችን መስራት ነው:-
$ rails generate controller MedaMasjemers new edit --no-test-framework
እዚህ ላይ የፈተናወች መመንጨትን ለማምለጥ አንድ ባንዲራን እንዳካተትን ልብ በሉ። ይህ የሆነበት ምክንያት፣ የመቆጣጠሪያ ፈተናወችን ስለማንፈልግ እና በዚህ ፈንታ ፈተናውን በክፍል 11.3.3 ላይ ባለው የውህደት ፈተና ላይ ቀጥለን መገንባት ስለምንችል ነው።
አዲስ የመሕለፈቃል ዳግም ማስጀመርያውን ለመፍጠር (ምስል 12.2) እና በተጠቃሚ ቅርጸቱ (ምስል 12.3) ውስጥ መሕለፈቃሉን በመለወጥ እነሱን ለማዘመን፣ ሁለት ቅጾች እና እንዲሁም፣ ለአዲስ (new
) ፣ ለ‘ፍጠር (create
) ፣ ለ‘አርትዕ (edit
) እና ለ‘አዘምን (update
) የሚያገለግሉ ማዘዋወሪያወች ያስፈልጉናል፡፡ በዝርዝር 12.1 ላይ በሚታየው የ‘ሃብቶች (resources
) ዘዴ ይህንን ማዘጋጀት እንችላለን:-
config/routes.rb
Rails.application.routes.draw do
root 'quami_getss#menesha'
get '/erdata', to: 'quami_getss#erdata'
get '/silegna', to: 'quami_getss#silegna'
get '/agignun', to: 'quami_getss#agignun'
get '/temezgeb', to: 'teteqamis#new'
get '/gba', to: 'sessions#new'
post '/gba', to: 'sessions#create'
delete '/wta', to: 'sessions#destroy'
resources :teteqamis
resources :meleya_magberyas, only: [:edit]
resources :meda_masjemers, only: [:new, :create, :edit, :update]
end
በዝርዝር 12.1 ውስጥ ያለው የ‘ሃብቶች (resources
) ዘዴ በሰንጠረዥ 12.1 ውስጥ የተዘረዘሩትን የሙሉው.ሁ.ማ ማዘዋወሪያወችን ያዘጋጃል፡፡ በተለይም፣ በሰንጠረዥ 12.1 ውስጥ ያለው የመጀመሪያው ማዘዋወሪያ በዝርዝር 12.2 እና በምስል 12.4 ላይ እንደሚታየው፣ በዚህ የተሰየመ ማዘዋወሪያ በኩል:-
new_meda_masjemer_path
ለ “መሕለፈቃልወን ረሱ” ቅጽ አንድ አገናኝን ይሰጠዋል። (ሰንጠረዥ 12.1 በሰንጠረዡ ውስጥ ያሉ አባላት ከሰንጠረዡ አልፈው እንዳይወጡ ለማድረግ በ <ysmula> ምትክ <y> እና በ‘ይስሙላ (ysmula
) ምትክ ደግሞ y
ብሎ እንደጻፈ ልታስተውሉ ይገባል)
የሃ.ጽ.ማ.ስ መጠይቅ | ዓ.አ.ሃ.አ | ተግባር | ስዩም ማዘዋወሪያ |
GET |
/meda_masjemers/new | new |
new_meda_masjemer_path |
POST |
/meda_masjemers | create |
meda_masjemers_path |
GET |
/meda_masjemers/<y>/edit | edit |
edit_meda_masjemer_url(y) |
PATCH |
/meda_masjemers/<y> | update |
meda_masjemer_path(y) |
app/views/sessions/new.html.erb
<% provide(:title, "ይግቡ") %>
<h1 class="ራስጌ1">ይግቡ</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= form_with(url: gba_path, scope: :session, local: true) do |ቅ| %>
<%= ቅ.label :emelekt, 'ኤመልእክት' %>
<%= ቅ.email_field :emelekt, class: 'form-control' %>
<%= ቅ.label :password, 'መሕለፈቃል' %>
<%= link_to "(መሕለፈቃልወን ረሱ)", new_meda_masjemer_path %>
<%= ቅ.password_field :password, class: 'form-control' %>
<%= ቅ.label :ዘክረኝ, class: "አመልካችሳጥን ውስጠመስመር" do %>
<%= ቅ.check_box :ዘክረኝ %>
<span>በዚህ ኮምፕዩተር ላይ ዘክረኝ</span>
<% end %>
<%= ቅ.submit "ግባ", class: "btn btn-primary" %>
<% end %>
<p>አዲስ ተጠቃሚ? <%= link_to "ይመዝገቡ", temezgeb_path %></p>
</div>
</div>
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
edit
) ማዘዋወሪያ _መንገድ (_path
) ከተባለው አሰራር (ቅጽ) ይልቅ ለምን _ዓአሃአ (_url
) የተባለውን አሰራር (ቅጽን) መረጠ? ጠቃሚ ምክር:- መልሱ የማለያ ማግበሪያ መልመጃ ላይ ለቀረበው ጥያቄ የተሰጠው መልስ ጋር አንድ ዓይነት ነው (ክፍል 11.1.1.1)።
አንድ አዲስ የመሕለፈቃል ዳግም ማስጀመርያን ለመፍጠር፣ በቅድሚያ የውሂብ ቅዱን መበየን ይኖርብናል፣ ይህም ለመለያ ማግበርያ ከተጠቀምንበት ጋር ተመሳሳይ ነው (ምስል 11.1)፡፡ የዝክረ ይስሙላ (ምዕራፍ 9) እና የመለያ ማግበርያ ይስሙላን ንድፍ በመከተል (ምዕራፍ 11)፣ የመሕለፈቃል ዳግም ማስጀመርያወች፣ ዳግመማስጀመሪያ ኤመልእክት ጥቅም ላይ የሚውል አንድ ምናባዊ ዳግመማስጀመሪያ ይስሙላን፣ ተጠቃሚን ፈልጎ ለማምጣት ከአንድ የተዛመደ የዳግመማስጀመሪያ ፍጪ ጋር ያጣምራሉ፡፡ በምትኩ በውሂበጎታው ላይ ያልተከተፈ ይስሙላን ካስቀመጥን ግን፣ የውሂበጎታ መዳረሻ ያለው አንድ አጥቂ፣ ለተጠቃሚው የኤመልእክት አድራሻ አንድ የዳግም ማስጀመርያ መጠይቅን ሊልክ ይችላል፣ እና ከዚያም ተዛማጁን የመሕለፈቃል ዳግም ማስጀመርያ አገናኝን ለመጎብኘት፣ ይስሙላውን እና ኤመልእክቱን በመጠቀም መለያውን ሊቆጣጠር ይችላል፤ ስለዚህ ለመሕለፈቃል ዳግም ማስጀመሪያዎች አንድ ፍጪን መጠቀሙ በጣም አስፈላጊ ነው፡፡ ልክ እንደ አንድ ተጨማሪ የጥበቃ ጥንቃቄ ይሆነን ዘንድ፣ የዳግም ማስጀመሪያ አገናኙ ከተሰደደ ከሁለት ሰዓት በኋላ ጊዜው እንዲቃጠልም አቅደናል፣ ይህም የዳግም ማስጀመሪያው የተላክበትን ጊዜ መመዝገብን ይጠይቃል፡፡ በውጤቱ የተገኙት የ‘ፈጪ_ማስጀመር (masjemer_fech
) እና የ‘ፈጪ_ተሰደደ_በ (masjemer_tesedede_at
) ባሕሪወች በምስል 12.5 ላይ ይታያሉ፡፡
ባሕሪወቹን ከምስል 12.5 ለማከል የሚደረገው ፍልሰት የሚከተለውን ይመስላል:-
$ rails generate migration add_masjemer_to_teteqamis \
masjemer_fech:string masjemer_tesedede_at:datetime
ከዚያ እንደተለመደው አድርገን እናፈልሳለን:-
$ rails db:migrate
ለአዲስ መሕለፈቃል ዳግም ማስጀመሪያዎች ትይታ ገጽን ለማድረግ፣ የንቅ መዝገብ ሃብት ያልሆነ አንድ አዲስ ማለት ልክ ለመግቢያ ቅጽ (ዝርዝር 8.4) ማለት አንድ አዲስ ክፍለጊዜን ለመፍጠር፣ ከዚህ በፊት የተጠቀምንበትን መንገድ በመከተል፣ አንድ ተመሳሳይ ቅጽን እንሰራለን። አሁን ከምንሰራው ቅጽ ጋር ማጣቀሻ ይሆነን ዘንድ፣ ከዚህ በፊት የሰራነውን ቅጽ በዝርዝር 12.3 ላይ ደግመን አቅርበነዋል።
app/views/sessions/new.html.erb
<% provide(:title, "ይግቡ") %>
<h1 class="ራስጌ1">ይግቡ</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= form_with(url: gba_path, scope: :session, local: true) do |ቅ| %>
<%= ቅ.label :emelekt, 'ኤመልእክት' %>
<%= ቅ.email_field :emelekt, class: 'form-control' %>
<%= ቅ.label :password, 'መሕለፈቃል' %>
<%= link_to "(መሕለፈቃልወን ረሱ)", new_meda_masjemer_path %>
<%= ቅ.password_field :password, class: 'form-control' %>
<%= ቅ.label :ዘክረኝ, class: "አመልካችሳጥን ውስጠመስመር" do %>
<%= ቅ.check_box :ዘክረኝ %>
<span>በዚህ ኮምፕዩተር ላይ ዘክረኝ</span>
<% end %>
<%= ቅ.submit "ግባ", class: "btn btn-primary" %>
<% end %>
<p>አዲስ ተጠቃሚ? <%= link_to "ይመዝገቡ", temezgeb_path %></p>
</div>
</div>
አዲሱ የመሕለፈቃል ዳግም ማስጀመርያ ቅጹ፣ ከዝርዝር 12.3 ጋር ብዙ የሚመሳሰል ነገር አለው፤ በጣም ጉልህ የሆኑት ልዩነቶች ደግሞ፣ አንድ የተለየ ሃብት ላይ እና አንድ ዓ.አ.ሃ.አ ላይ በ‘ቅጽ_ጋር (form_with
) ውስጥ መጥራቱ እና በተጨማሪም የመሕለፈቃል ባሕሪውን ማስወገዱ ናቸው። ውጤቱም በዝርዝር 12.4 እና በምስል 12.6 ላይ ይታያል፡፡
app/views/meda_masjemers/new.html.erb
<% provide(:title, "መሕለፈቃልወን ረሱ") %>
<h1 class="ራስጌ1">መሕለፈቃልወን ረሱ</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= form_with(url: meda_masjemers_path, scope: :meda_masjemer,
local: true) do |ቅ| %>
<%= ቅ.label :emelekt, 'ኤመልእክት' %>
<%= ቅ.email_field :emelekt, class: 'form-control' %>
<%= ቅ.submit "አስረክብ", class: "btn btn-primary" %>
<% end %>
</div>
</div>
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
form_with
) ላይ @meda_masjemer
‘ን ከመጠቀም ይልቅ ለምን :meda_masjemer
‘ን ተጠቀመ?
የ‘ፍጠር
ተግባር።የምስል 12.6 ቅጽ በሚረከብበት ጊዜ፣ ተጠቃሚውን በኤመልእክት አድራሻው መሰረት ፈልጎ ማግኘት እና ባሕሪወቹን በመሕለፈቃል ዳግመማስጀመሪያ ይስሙላው እና የተሰደደበት ማህተመጊዜን ማለት ሁለቱንም ባሕሪዎች ማዘመን እንፈልጋለን፡፡ ከዚያ ስለሁኔታው አንድ ጠቃሚ መረጃ የሚሰጥ የብልጪታ መልእክት ጋር ወደ ስረ ዓ.አ.ሃ.አው እናዟዙራለን፡፡ ልክ እንደ ለመግቢያው እንዳደረግነው ሁሉ (ዝርዝር 8.11)፣ አንድ ብቁ ያልሆነ ርክብ በሚቀርብበት ጊዜ፣ አዲስ (new
) ገጹን ከአንድ የ‘አሁን.ብልጪታ (flash.now
) መልእክት ጋር በድጋሜ እናቀርባለን።2 ውጤቶቹ በዝርዝር 12.5 ውስጥ ይታያሉ፡፡
create
) ተግባር። app/controllers/meda_masjemers_controller.rb
class MedaMasjemersController < ApplicationController
def new
end
def create
@teteqami = Teteqami.find_by(emelekt: params[:meda_masjemer][:emelekt].downcase)
if @teteqami
@teteqami.masjemer_fech_fter
@teteqami.masjemer_emelekt_laki
flash[:info] = "አንድ የኤመልእክት ከመሕለፈቃል ዳግም ማስጀመርያ መመሪያጋ ተልኮልዋታል።"
redirect_to root_url
else
flash.now[:danger] = "የኤመልእክት አድራሻዎት አልተገኘም።"
render 'new'
end
end
def edit
end
end
በተጠቃሚ ቅርጸቱ ውስጥ ያለው ኮድ፣ በዝርዝር 12.6 ላይ እንደሚታየው፣ በ‘ከመፍጠር_በፊት (before_create
) መልሰጥሪ (ዝርዝር 11.3) ውስጥ ካገለገለው ከ‘ማግበርያ_ፈጪ_ፍጠር (magberya_fech_fter
) ዘዴ ጋር ትይዩ ነው፡፡
app/models/teteqami.rb
class Teteqami < ApplicationRecord
attr_accessor :zkre_ysmula, :magberya_ysmula, :masjemer_ysmula
before_save :emelekt_nious_melkefidel
before_create :magberya_fech_fter
.
.
.
# አንድ መለያን ያነቃል።
def agbr
update_columns(nq: true, nq_at: Time.zone.now)
end
# የማግበሪያ ኤመልእክትን ይልካል፡፡
def megberya_emelekt_laki
TeteqamiMailer.meleya_magberya(self).deliver_now
end
# የመሕለፈቃል ዳግም ማስጀመርያ ባሕርያትን ያዘጋጃል።
def masjemer_fech_fter
self.masjemer_ysmula = Teteqami.adis_ysmula
update_attribute(:masjemer_fech, Teteqami.fech(masjemer_ysmula))
update_attribute(:masjemer_tesedede_at, Time.zone.now)
end
# የመሕለፈቃል ዳግም ማስጀመር ኤመልእክትን ይልካል፡፡
def masjemer_emelekt_laki
TeteqamiMailer.meda_masjemer(self).deliver_now
end
private
# የኤመልክትን ወደ ንዑስ ፊደል ይለውጣል።
def emelekt_nious_melkefidel
self.emelekt.downcase!
end
# ማግበሪያ ይስሙላን እና ፍጪን ይፈጥር እና ይመድባል።
def magberya_fech_fter
self.magberya_ysmula = Teteqami.adis_ysmula
self.magberya_fech = Teteqami.fech(magberya_ysmula)
end
end
በምስል 12.7 ላይ እንደታየው፣ በዚህ ጊዜ የአፕልኬሽኑ ባህሪ ብቁ ባልሆኑ የኤመልእክት አድራሻዎች ላይ ቀድሞውኑ እየሰራ ይገኛል፡፡ አፕልኬሽኑ አንድ ብቁ የኤመልእክት አድራሻን በሚረከብበት ጊዜ እንዲሰራ ለማድረግ፣ አንድ የመሕለፈቃል ዳግም ማስጀመርያ መላኪያ ዘዴን መበየን ይኖርብናል፡፡
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
masjemer_fech
) እና የ‘ፈጪ_ተሰደደ_በ (masjemer_tesedede_at
) ባሕሪወች እንዳሉት ግን ሰሌዳችሁን በመጠቀም አረጋግጡ፡፡ የባሕሪወቹ ዋጋዎች ምንድናቸው?
በክፍል 12.1 ላይ በመሕለፈቃል ዳግም ማስጀመርያ መቆጣጠሪያ ውስጥ አንድ ሊሰራ ምንም ያልቀረው የ‘ፍጠር (create
) ተግባርን ትተን መጥተናል፡፡ አንድ የጎደለ ነገር ቢኖር፣ ብቁ የመሕለፈቃል ዳግም ማስጀመርያ ኤመልእክቶችን መላኪያ ዘዴው ብቻ ነው፡፡
ክፍል 11.1 ‘ን ተከታትላችሁ ከሆነ፣ በዝርዝር 11.6 በተፈጠረው የተጠቃሚ መላኪያ ምክንያት አንድ ነባሪ መዳ_ማስጀመር (meda_masjemer
) የተባለ የኤመልእክት መላኪያ ዘዴ በ‘ app/mailers/teteqami_mailer.rb
ፋይላችሁ ውስጥ አላችሁ ማለት ነው፡፡ ምዕራፍ 11 ‘ን ዘላችሁ የመጣችሁ ከሆነ ደግሞ ከታች የተመለከተውን ኮድ ቀድታችሁ (መለያ_ማግበርያ‘ን (meleya_magberya
) በመተው) ፋይላችሁ ላይ መግልበጥ እና የጎደለውን ፋይል እንዳስፈላጊነቱ በመፍጠር አብራችሁን መጓዝ ትችላላችሁ፡፡
እዚህ ላይ በዝርዝር 12.6 ውስጥ፣ በክፍል 11.3.3 ላይ የተጣራውን እና በቀጥታ በተጠቃሚ ቅርጸቱ ውስጥ የገባውን የተጠቃሚ መላኪያ የንድፍ ጥለት ተግባራዊ አድርገናል:-
TeteqamiMailer.meda_masjemer(self).deliver_now
የመሕለፈቃል ዳግም ማስጀመርያ መላኪያ ዘዴን እንዲሰራ ለማድረግ የሚያስፈልገው አሰራር፣ በክፍል 11.2 ላይ ካበለጸግነው የመለያ ማግበርያ መላኪያ ዘዴ አሰራር ጋር በጣም ተመሳሳይ ነው፡፡ በመጀመሪያ በተጠቃሚ መላኪያው ውስጥ (ዝርዝር 12.7) አንድ መዳ_ማስጀመር (meda_masjemer
) የተባለ ዘዴን እንፈጥራለን፣ እና ከዚያ በኋላ አንድ ለጥሬ-ጽሑፍ ኤመልእክት (ዝርዝር 12.8) እና አንድ ለሃ.ጽ.መ.ቋ ኤመልእክት የትይታ ዝግጁገጽታወችን እንበይናለን (ዝርዝር 12.9)፡፡
ማሳሰቢያ:- ምዕራፍ 11 ውስጥ በዝርዝር 11.13 እና በዝርዝር 11.14 ላይ እንዳደረጋችሁት ሁሉ፣ ፈተናው እየወደቀ እና በሬይልስ አገልጋዩ ውስጥ የተሰደደው የኤመልእክት ዳግም ማስጀመሪያ በግልጽ ያልቀረበ ከሆነ፣ ይህንን ችግር ለማቃለል አሁንም በድጋሜ፣ በዝርዝር 12.8 እና በዝርዝር 12.9 ውስጥ አስተያየት ከተደረገበት በታች ያሉትን ኮዶች ተጠቀሙ (አስተያየቱን ቀድታችሁ መገልበጥ እንደለለባችሁ ልትገነዘቡ ይገባል)።
app/mailers/teteqami_mailer.rb
class TeteqamiMailer < ApplicationMailer
def meleya_magberya(teteqami)
@teteqami = teteqami
mail to: teteqami.emelekt, subject: "የመለያ ማግበሪያ"
end
def meda_masjemer(teteqami)
@teteqami = teteqami
mail to: teteqami.emelekt, subject: "መሕለፈቃል ዳግም ማስጀመርያ"
end
end
app/views/teteqami_mailer/meda_masjemer.text.erb
መሕለፈቃልዎን ለማስጀመር እታች ያለውን አገናኝ ጠቅ ያድርጉ:-
<%= edit_meda_masjemer_url(@teteqami.masjemer_ysmula,
email: @teteqami.emelekt) %>
ይህ አገናኝ በሁለት ሰዓታት ውስጥ ጊዜው ይቃጠላል፡፡
መሕለፈቃልዎ ዳግም እንዲጀመር ካልጠየቁ ይህን ኤመልእክት ችላ ይበሉት መሕለፈቃልዎ እንዳለው
ይቆያል።
# ፈተናው እየወደቀ ካስቸገራችሁ ከዚህ በታች ያለውን፣ በእንግሊዝኛ የተጻፈ የሰላምታና የእንኳን
# ደህና መጡ ጽሑፍ ያካተተውን ኮድ ተጠቀሙ።
Mehlefeqalwen lemasjemer etach yalewn agenagn teq yadrgu:-
<%= edit_meda_masjemer_url(@teteqami.masjemer_ysmula,
email: @teteqami.emelekt) %>
Yih agenagn behulet seat wst gizew yiqatelal.
Mehlefeqalwe dagm endijemr kalteyequ yhnn emelekt chila ybelut mehlefeqalwe
endalew yiqoyal.
app/views/teteqami_mailer/meda_masjemer.html.erb
<h2>መሕለፈቃል ዳግም ማስጀመርያ Mehlefeqal dagm masjemerya</h2>
<p>መሕለፈቃልዎን ለማስጀመር እታች ያለውን አገናኝ ጠቅ ያድርጉ:-</p>
<%= link_to "መሕለፈቃል ዳግም ማስጀመርያ", edit_meda_masjemer_url(
@teteqami.masjemer_ysmula, email: @teteqami.emelekt) %>
<p>ይህ አገናኝ በሁለት ሰዓታት ውስጥ ጊዜው ይቃጠላል፡፡</p>
<p>
መሕለፈቃልዎ ዳግም እንዲጀመር ካልጠየቁ ይህን ኤመልእክት ችላ ይበሉት መሕለፈቃልዎ እንዳለው
ይቆያል።
</p>
# ፈተናው እየወደቀ ካስቸገራችሁ ከዚህ በታች ያለውን፣ በእንግሊዝኛ የተጻፈ የሰላምታና የእንኳን
# ደህና መጡ ጽሑፍ ያካተተውን ኮድ ተጠቀሙ።
<h1>Mehlefeqal dagm masjemerya</h1>
<p>Mehlefeqalwen lemasjemer etach yalewn agenagn teq yadrgu:-</p>
<%= link_to "mehlefeqal dagm masjemerya", edit_meda_masjemer_url(
@teteqami.masjemer_ysmula, email: @teteqami.emelekt) %>
<p>Yih agenagn behulet seat wst gizew yiqatelal.</p>
<p>
Mehlefeqalwe dagm endijemr kalteyequ yhnn emelekt chila ybelut mehlefeqalwe
endalew yiqoyal.
</p>
ለመለያ ማግበርያ ኤመልእክቶች ቅድመ-ትይታ (ክፍል 11.2)፣ የሬይልስ ኤመልእክቶች ቅድመ-ትይታን እንደተጠቀምን ሁሉ፤ አሁንም እሱኑ በመጠቀም የመሕለፈቃል ዳግም ማስጀመርያ ኤመልእክቶችን ማየት እንችላለን፡፡ ኮዱም በዝርዝር 12.10 ላይ እንደታየው፣ ከዝርዝር 11.18 ጋር ፍጹም ተመሳሳይ ነው፡፡
test/mailers/previews/teteqami_mailer_preview.rb
# Preview all emails at http://localhost:3000/rails/mailers/teteqami_mailer
class TeteqamiMailerPreview < ActionMailer::Preview
# Preview this email at
# http://localhost:3000/rails/mailers/teteqami_mailer/meleya_magberya
def meleya_magberya
teteqami = Teteqami.first
teteqami.magberya_ysmula = Teteqami.adis_ysmula
TeteqamiMailer.meleya_magberya(teteqami)
end
# Preview this email at
# http://localhost:3000/rails/mailers/teteqami_mailer/meda_masjemer
def meda_masjemer
teteqami = Teteqami.first
teteqami.masjemer_ysmula = Teteqami.adis_ysmula
TeteqamiMailer.meda_masjemer(teteqami)
end
end
በዝርዝር 12.10 ላይ በለው ኮድ መሰረት፣ የሃ.ጽ.መ.ቋ እና የጽሑፍ ኤመልእክት ቅድመ-ትይታዎች ይዞታ በምስል 12.8 እና በምስል 12.9 ላይ ይታያል፡፡
በዝርዝር 12.7፣ በዝርዝር 12.8 እና በዝርዝር 12.9 ላይ ባለው ኮድ አንድ ብቁ ኤመልእክት በሚረከብበት ጊዜ፣ የሚገኘው ውጤት በምስል 12.10 ላይ ይታያል፡፡ ተዛማጁ ኤመልእክትም በአገልጋዩ ዘገባ ውስጥ ይታያል። እናም ልክ በዝርዝር 12.11 ላይ ያለውን የሚመስል እይታ መምሰል ይኖርበታል፡፡
TeteqamiMailer#meda_masjemer: processed outbound mail in 4.2ms
Delivered mail 5fe53ee21cf8e_98561302903e@winnber.local.mail (2.5ms)
Date: Thu, 24 Dec 2020 17:22:42 -0800
From: noreply@example.com
To: msalie@railstutorial.org
Message-ID: <5fe53ee21cf8e_98561302903e@winnber.local.mail>
Subject: መሕለፈቃል ዳግም ማስጀመርያ
Mime-Version: 1.0
Content-Type: multipart/alternative;
boundary="--==_mimepart_5fe53ee21c85c_98561302897f";
charset=UTF-8
Content-Transfer-Encoding: 7bit
----==_mimepart_5d609328d5404_28872b106582ddf488531
Content-Type: text/plain;
charset=UTF-8
Content-Transfer-Encoding: 7bit
መሕለፈቃልዎን ለማስጀመር እታች ያለውን አገናኝ ጠቅ ያድርጉ:-
http://localhost:3000/meda_masjemers/ZorQc1WnjQY4UUljrxW5gw/
edit?email=msalie%40railstutorial.org
ይህ አገናኝ በሁለት ሰዓታት ውስጥ ጊዜው ይቃጠላል፡፡
መሕለፈቃልዎ ዳግም እንዲጀመር ካልጠየቁ ይህን ኤመልእክት ችላ ይበሉት መሕለፈቃልዎ እንዳለው
ይቆያል።
----==_mimepart_5d609328d5404_28872b106582ddf488531
Content-Type: text/html;
charset=UTF-8
Content-Transfer-Encoding: 7bit
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
/* Email styles need to be inline */
</style>
</head>
<body>
<h1>መሕለፈቃል ዳግም ማስጀመርያ</h1>
<p>መሕለፈቃልዎን ለማስጀመር እታች ያለውን አገናኝ ጠቅ ያድርጉ:-</p>
<a href="http://localhost:3000/meda_masjemers/ZorQc1WnjQY4UUljrxW5gw/
edit?email=msalie%40railstutorial.org">Reset password</a>
<p>ይህ አገናኝ በሁለት ሰዓታት ውስጥ ጊዜው ይቃጠላል፡፡</p>
<p>
መሕለፈቃልዎ ዳግም እንዲጀመር ካልጠየቁ ይህን ኤመልእክት ችላ ይበሉት መሕለፈቃልዎ እንዳለው
ይቆያል።
</p>
</body>
</html>
----==_mimepart_5d609328d5404_28872b106582ddf488531--
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
masjemer_fech
) እና የ‘ፈጪ_ተሰደደ_በ (masjemer_tesedede_at
) ባሕሪወች እንዳሉት አረጋግጡ፡፡
ዝርዝር 12.12 ላይ እንደሚታየው፣ ከመለያ ማግበርያ መላኪያ ዘዴ ፈተና ጋር (ዝርዝር 11.20) የሚመሳሰል አንድ ፈተና ለመሕለፈቃል ዳግም ማስጀመርያ መላኪያ ዘዴው እንጽፋለን። ማሳሰቢያ:- በምርት ላይ ኤመልእክትን (ክፍል 11.4) ለመላክ ካቀዳችሁ፣ በዝርዝር 12.12 ውስጥ ያለውን “noreply@example.com” ‘ን በእውነተኛ የኤመልእክት አድራሻችሁ መተካት ይኖርባችኋል (ማለት ዝርዝር 11.11 ላይ በተጠቀማችሁበት መተካት ይኖርባችኋል ማለት ነው)፡፡
test/mailers/teteqami_mailer_test.rb
require 'test_helper'
class TeteqamiMailerTest < ActionMailer::TestCase
test "meleya_magberya" do
teteqami = teteqamis(:michael)
teteqami.magberya_ysmula = Teteqami.adis_ysmula
mail = TeteqamiMailer.meleya_magberya(teteqami)
assert_equal "የመለያ ማግበሪያ", mail.subject
assert_equal [teteqami.emelekt], mail.to
assert_equal ["from@msalie.com"], mail.from
assert_match teteqami.sim, mail.body.encoded
assert_match teteqami.magberya_ysmula, mail.body.encoded
assert_match CGI.escape(teteqami.emelekt), mail.body.encoded
end
test "meda_masjemer" do
teteqami = teteqamis(:michael)
teteqami.masjemer_ysmula = Teteqami.adis_ysmula
mail = TeteqamiMailer.meda_masjemer(teteqami)
assert_equal "መሕለፈቃል ዳግም ማስጀመርያ", mail.subject
assert_equal [teteqami.emelekt], mail.to
assert_equal ["from@msalie.com"], mail.from
assert_match teteqami.masjemer_ysmula, mail.body.encoded
assert_match CGI.escape(teteqami.emelekt), mail.body.encoded
end
end
በዚህ ወቅት የፈተና ስብስቡ አረንጓዴመሆን አለበት:-
$ rails test
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
CGI.escape
) ጥሪን ብታስወግዱት ፈተናው ቀይ እንደሚሆን አረጋግጡ (ወደነበረበት መመለስ እንዳለባችሁ ልትገነዘቡ ይገባል)፡፡
አሁን ልክ እንደ ዝርዝር 12.11 ያለ በትክክል የመነጨ አንድ ኤመልእክት ስላለን፣ የተጠቃሚውን መሕለፈቃል ዳግም የሚያስጀመረውን የ‘አርትዕ edit
ተግባርን በመሕለፈቃል ዳግም ማስጀመርያወች መቆጣጠሪያ ውስጥ መጻፍ ይኖርብናል። ልክ በክፍል 11.3.3 ላይ እንዳደረግነው እንዲሁ፣ አንድ የተሟላ የውህደት ፈተናንም እንጽፋለን።
የ‘አርትዕ
) ተግበርልክ ዝርዝር 12.11 ላይ እንደሚታየው፣ ያሉ የመሕለፈቃል ዳግም ማስጀመርያ ኤመልእክቶች፣ እንደሚከተሉት አይነት የአገናኞች ቅጽን ይዘዋል:-
https://example.com//meda_masjemers/3BdBrXeQZSWqFIDRN8cxHA/edit?email=fu%40bar.com
እነዚህ አገናኞች እንዲሰሩ ለማድረግ፣ አንድ የመሕለፈቃል ዳግም ማስጀመርያ ቅጽ ያስፈልገናል፡፡ ተግባሩ በተጠቃሚ አርትዖት ትይታ በኩል ተጠቃሚዎችን ከማዘመን ጋር ተመሳሳይ ሲሆን (ዝርዝር 10.2)፣ በዚህ ጊዜ ግን ቅጹ የመሕለፈቃል እና የመሕለፈቃል ማረጋገጫ መስኮች ብቻ ይኖሩታል፡፡
እዚህ ላይ ግን አንድ የተወሳሰበ ነገር አለ፤ ማለት ተጠቃሚውን በኤመልእክት አድራሻው ፈልጎ ማግኘትን እንጠብቃለን፣ ይህ ማለት በ‘አርትዕ (edit
) እና በ‘አዘምን (update
) ተግባሮች ውስጥ የኤመልእክት አድራሻው ያስፈልገናል ማለት ነው። እዚህ ላይ የኤመልእክት አድራሻው በሚላከው አገናኝ ውስጥ ስለሚገኝ የ‘አርትዕ (edit
) ተግባሩ የኤመልእክት አድራሻውን በራስሰር ያገኘዋል፣ ነገር ግን ልክ ቅጹን ካስረከብን በኋላ ዋጋው ይጠፋል። ለዚህ መፍትሄው በገጹ ላይ ያለውን የኤመልእክት አድራሻ፣ ገጹ ላይ ሳይታይ ለማስቀመጥ የሚረዳ አንድ የተደበቀ መስክን (Hidden Field) በመጠቀም የኤመልእክት አድራሻውን ማግኘት እና ውጤቱን ከተቀረው የቅጹ መረጃ ጋር አብሮ እንዲረከብ ማድረግ ነው፡፡ ውጤቱም በዝርዝር 12.14 ውስጥ ይታያል፡-
app/views/meda_masjemers/edit.html.erb
<% provide(:title, 'መሕለፈቃል ዳግም ማስጀመርያ') %>
<h1 class="ራስጌ1">መሕለፈቃል ዳግም ማስጀመርያ</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= form_with(model: @teteqami, url: meda_masjemer_path(params[:id]),
local: true) do |ቅ| %>
<%= render 'gru/shtet_melektoch' %>
<%= hidden_field_tag :emelekt, @teteqami.emelekt %>
<%= ቅ.label :password, 'መሕለፈቃል' %>
<%= ቅ.password_field :password, class: 'form-control' %>
<%= ቅ.label :password_confirmation, "አረጋግጥ" %>
<%= ቅ.password_field :password_confirmation, class: 'form-control' %>
<%= ቅ.submit "መሕለፈቃልዎን ያዘምኑ", class: "btn btn-primary" %>
<% end %>
</div>
</div>
ዝርዝር 12.14 ለቅጽ መለያ ረጅ ይህንን ዓይነት የቅጽ መለያ ረጅ ከመጠቀም ፈንታ:-
hidden_field_tag :emelekt, @teteqami.emelekt
የዚህ ዓይነቱን የቅጽ መለያ ረጅን እንደሚጠቀም አስተውሉ:-
ቅ.hidden_field :emelekt, @teteqami.emelekt
ይህ የሆነበት ምክንያትም፣ የዳግም ማስጀመርያ አገናኙ፣ የኤመልእክቱን በ‘ሴሚአሴቶች[:ኤመልእክ] (params[:emelekt]
) ውስጥ ሲያስቀምጥ የኋለኛው ግን በ‘ሴሚአሴቶች[:ተጠቃሚ][:ተጠቃሚ] (params[:teteqami][:emelekt]
) ውስጥ ስለሚያስቀምጠው ነው።
ቅጹን ለማቅረብ፣ በመሕለፈቃል ዳግም ማስጀመርያዎች መቆጣጠሪያ የ‘አርትዕ (edit
) ተግባር ውስጥ አንድ @ተጠቃሚ (@teteqami
) የተባለ ተለዋዋጪን መበየን አለብን፡፡ ይህም ልክ እንደ መለያ ማግበርያው (ዝርዝር 11.31) የኤመልእክት አድራሻው፣ በ‘ሴሚአሴቶች[:ኤመልእክ‘ቱ] (params[:emelekt]
) ውስጥ ጋር የሚዛመደውን ተጠቃሚ ፈልጎ ማግኘትን ያሳትፋል። ከዚያ ተጠቃሚው ብቁ መሆኑን ማረጋገጥ ይኖርብናል፣ ማለትም መኖሩን፣ መንቃቱን እና ዳግመማስጀመሪያ ይስሙላው በ‘ሴሚአሴቶች[:መታወቂያ]‘ው (params[:id]
) መሰረት (በዝርዝር 11.26 ውስጥ የተበየነውን እና የተጠቃለለውን የተረጋግጧልን? (teregagtualn?
) ዘዴን በመጠቀም) መረጋገጡን ማረጋገጥ እንፈልጋለን። በ‘አርትዕ (edit
) እና በ‘አዘምን (update
) ተግባር ውስጥ አንድ ብቁ @ተጠቃሚ (@teteqami
) መኖሩ አስፈላጊ ስለሆነ፣ በዝርዝር 12.15 ላይ እንደሚታየው፣ ኮዱ እሱን እንዲያገኘው እና እንዲያረጋግጠው በሁለት ቅድመአጣሪወች ውስጥ እናስቀምጠዋለን፡፡
edit
) ተግባርን ማከል። app/controllers/meda_masjemers_controller.rb
class MedaMasjemersController < ApplicationController
before_action :teteqami_aggn, only: [:edit, :update]
before_action :bqu_teteqami, only: [:edit, :update]
.
.
.
def edit
end
private
def teteqami_aggn
@teteqami = Teteqami.find_by(emelekt: params[:emelekt])
end
# አንድ ብቁ ተጠቃሚን ያረጋግጣል።
def bqu_teteqami
unless (@teteqami && @teteqami.nq? &&
@teteqami.teregagtualn?(:masjemer, params[:id]))
redirect_to root_url
end
end
end
በሰንጠረዥ 11.1 ላይ የተመለከቱትን የማረጋገጫ ዘዴወች በዝርዝር 12.15 ላይ ይህንን:-
teregagtualn?(:masjemer, params[:id])
በዝርዝር 11.28 ላይ ይህንን:-
teregagtualn?(:zkre, cookies[:zkre_yamula])
በዝርዝር 11.31 ላይ ደግሞ ይህንን ተጠቅመናል:-
teregagtualn?(:magberya, params[:id])
ስለዚህ እዚህ ላይ ሶስቱም የማረጋገጫ ዘዴወች ያከትማሉ ማለት ነው።
ከላይ ካለው ኮድ ጋር፣ ዝርዝር 12.11 ጋር ተመሳሳይ የሆነውን አገናኝ በአሳሻችሁ አድራሻ መጻፍያ ላይ ማስገባቱ፣ አንድ የመሕለፈቃል ዳግም ማስጀመርያ ቅጽን ማቅረብ ይኖርበታል፡፡ ከሰሌዳ ዘጋቢው የተገኘውን አገናኝ ከሰሌዳው ቀድቶ በአሳሹ የአድራሻ መጻፍያ ላይ የመገልበጡ (ዝርዝር 12.11) ውጤት በምስል 12.11 ላይ ይታያል፡፡
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
የመለያ ማግበርያ የ‘አርትዕ (edit
) ዘዴ ስራው ተጠቃሚን ከ“ያልነቃ” ወደ “ንቅ” መቀያየር ሲሆን፣ የመሕለፈቃል ዳግም ማስጀመርያ የ‘አርትዕ (edit
) ዘዴ ግን ከሱ በተቃረነ መልኩ አንድ ራሱን የቻለ ቅጽ ነው፣ ስለሆነም ለአንድ ተዛማጅ የ‘አዘምን (update
) ተግባር መረጃዎችን ማስረከብ አለበት። ይህንን የ‘አዘምን (update
) ተግባር ለመበየን አራት ክስተቶችን ግምት ውስጥ ማስገባት ይኖርብናል፡-
አንደኛው (1)፣ ሁለተኛው (2) እና አራተኛው (4) ክስተቶች በመጠኑ ግልጽ ይመስላሉ፡፡ ሶስተኛው ክስተት ግን ያልተለመደ ክስተት ስለሆነ ከታች በደንብ ተብራርቷል፡፡
አንደኛው (1) ክስተት የ‘አርትዕ (edit
) እና የ‘አዘምን (update
) ተግባሮች ላይ ተፈጻሚ ይሆናል፣ ስለሆነም በአንድ ቅድመአጣሪ ውስጥ መሆን እንደሚገባው ምክንያት አለው:-
before_action :mabqiya_aregagtie, only: [:edit, :update] # ክስተት (1)
ይህም አንድ ማብቂያ_አረጋግጤ (mabqiya_aregagtie
) የተባለ የግል ዘዴ መበየንን ይጠይቃል:-
# የዳግም ማስጀመሪያ ይስሙላው ጊዜ ማብቃቱን ይፈትሻል።
def mabqiya_aregagtie
if @teteqami.mehlefeqal_damasjemerya_abqtualn?
flash[:danger] = "የመሕለፈቃል ዳግም ማስጀመርያ ጊዜው አብቅቷል።"
redirect_to new_meda_masjemer_url
end
end
በ‘ማብቂያ_አረጋግጤ (mabqiya_aregagtie
) ዘዴ ውስጥ የመቃጠያ ፍተሻውን ወደ መሕለፈቃል_ዳማስጀመሪያ_አብቅቷልን? (mehlefeqal_damasjemerya_abqtualn?
) ቅርፀ ዘዴ አስተላልፈነዋል፤ ይህ ትንሽ አወዛጋቢ ነው፣ እናም ከጥቂት ጊዜ በኋላ የምንበይነው ይሆናል፡፡
ዝርዝር 12.16 የእነዚህን ማጣሪያዎች አተገባበር እና ከአንደኛው (1) እስከ አራተኛው (4) ያሉትን ክስተቶች የሚተገብረውን የ‘አዘምን (update
) ተግባርን በአንድ ላይ በማጣመር ያሳያል። ሁለተኛው (2) ክስተት የ‘አርትዕ (edit
) ቅጽ እንደገና ሲቀርብ፣ በዝርዝር 12.14 ውስጥ ከጋራ ከፊል የተገኙ የስህተት መልዕክቶችን በራስሰር በማሳየት ይስተናገዳል፡፡ አራተኛው (4) ክስተት ከአንድ የተሳካ ለውጥ ጋር ይዛመዳል፣ ውጤቱም ልክ እንደ አንድ የተሳካ ግባት ጋር ተመሳሳይ ነው (ዝርዝር 8.32)፡፡
በሁለተኛው (2) ክስተት ያልተስተናገደው ብቸኛው ውድቀት መሕለፈቃሉ ባዶ በሚሆንበት ጊዜ ነው፣ ይህም በአሁኑ ጊዜ በተጠቃሚ ቅርጸታችን (ዝርዝር 10.13) የተፈቀደ ስለሆነ፣ ይህም መያዝ እና በቁም ነገር መስተካከልን ይፈልጋል፡፡3 ይህ ማለት ደግሞ ከላይ ከጠቀስናቸው ክስተቶች ውስጥ ሶስተኛው (3) ነው ማለት ነው፡፡ በዚህ ጉዳይ ላይ የእኛ ዘዴ፣ የ‘ስህተቶች.ጨምር (errors.add
) ዘዴን በመጠቀም በ‘@ተጠቃሚ (@teteqami
) ቁስ የስህተት መልዕክቶች ላይ አንድ ስህተትን በቀጥታ ማከል ይሆናል:-
@teteqami.errors.add(:password, :blank)
ይህ መሕለፈቃሉ ባዶ በሚሆንበት ጊዜ፣ ነባሪ መልእክቱ ባዶ ለሆነ ይዘት፣ ይጠቀምበት ዘንድ ያዘጋጀዋል።4
ከአንደኛው (1) እስከ አራተኛው (4) ያሉትን ስተቶች እና የ‘አዘምን (update
) ተግባርን ባንድነት ማስቀመጡ፣ በዝርዝር 12.16 ላይ ያለውን ውጤት ያስገኛል፡፡
update
) ተግባርን ማከል። app/controllers/meda_masjemers_controller.rb
class MedaMasjemersController < ApplicationController
before_action :teteqami_aggn, only: [:edit, :update]
before_action :bqu_teteqami, only: [:edit, :update]
before_action :mabqiya_aregagtie, only: [:edit, :update] # ክስተት (1)
def new
end
def create
@teteqami = Teteqami.find_by(emelekt: params[:meda_masjemer][:emelekt].downcase)
if @teteqami
@teteqami.masjemer_fech_fter
@teteqami.masjemer_emelekt_laki
flash[:info] = "አንድ የኤመልእክት ከመሕለፈቃል ዳግም ማስጀመርያ መመሪያዎችጋ ተልኮልዋታል።"
redirect_to root_url
else
flash.now[:danger] = "የኤመልእክት አድራሻዎት አልተገኘም።"
render 'new'
end
end
def edit
end
def update
if params[:teteqami][:password].empty? # ክስተት (3)
@teteqami.errors.add(:password, "ባዶ መሆን አይቻልም።")
render 'edit'
elsif @teteqami.update(teteqami_negariaseitoch) # ክስተት (4)
reset_session
gba @teteqami
flash[:success] = "መሕልፈቃልዎ ዳግም መስራት ጀምሯል።"
redirect_to @teteqami
else
render 'edit' # ክስተት (2)
end
end
private
def teteqami_negariaseitoch
params.require(:teteqami).permit(:password, :password_confirmation)
end
# ቅድመአጣሪወች
def teteqami_aggn
@teteqami = Teteqami.find_by(emelekt: params[:emelekt])
end
# አንድ ብቁ ተጠቃሚን ያረጋግጣል።
def bqu_teteqami
unless (@teteqami && @teteqami.nq? &&
@teteqami.teregagtualn?(:masjemer, params[:id]))
redirect_to root_url
end
end
# የዳግም ማስጀመሪያ ይስሙላው ጊዜ ማብቃቱን ይፈትሻል።
def mabqiya_aregagtie
if @teteqami.mehlefeqal_damasjemerya_abqtualn?
flash[:danger] = "የመሕለፈቃል ዳግም ማስጀመርያው ጊዜው አብቅቷል።"
redirect_to new_meda_masjemer_url
end
end
end
ለሁለቱም፣ ማለት የመሕለፈቃል እና የማረጋገጫ ባሕሪዎችን የሚፈቅድ፣ አንድ ተጠቃሚ_ነገሪአሴቶች (teteqami_negariaseitoch
) የተባለ ዘዴ እንዳከልን ልብ በሉ (ክፍል 7.3.2)።
ከዚህ በላይ እንደተጠቀሰው፣ ዝርዝር 12.16 ውስጥ ያለው አተገባበር፣ በኮዱ በኩል ለተጠቃሚ ቅርጸቱ፣ የመሕለፈቃል ዳግም ማስጀመርያ መቃጠያው፣ አንድ የቡልየን ፍተሻን ያቀርባል:-
@teteqami.mehlefeqal_damasjemerya_abqtualn?
ይሄ እንዲሰራ ለማድረግ፣ አንድ መሕለፈቃል_ዳማስጀመሪያ_አብቅቷልን? (mehlefeqal_damasjemerya_abqtualn?
) የተባለ ዘዴን መበየን ይኖርብናል፡፡ በክፍል 12.2.1 በኤመልእክት ዝግጁገጽታወች ውስጥ እንደተመለከተው፣ የመሕልፈቃል ዳግም ማስጀመርያው ከተላከ ከሁለት ሰዓት በላይ ከሆነው ልክ እንደተቃጠለ አድርገን እንደምንቆጥረው እናያለን፣ ይህንንም በሩቢ እንደሚከተለው አድርገን ልንገልጸው እንችላለን፡-
masjemer_tesedede_at < 2.hours.ago
ይህን የ <
ምልክትን እንደ “ያንሳል” ምልክት አድርጋችሁ ካነባባችሁት ግራ የሚያጋባ ሊሆን ይችላል፣ ምክንያቱም አባባሉ “ከሁለት ሰዓት ባነሰ ጊዜ ውስጥ የተላከ የመሕልፈቃል ዳግም ማስጀመርያ መልእክት” ስለሚመስል ነው፣ ይህም ከምንፈልገው ሃሳብ ጋር ይቃረናል፡፡ ስለዚህ በዚህ አውድ ውስጥ የ <
ምልክትን እንደ “ቀደም ብሎ” የሚለውን አባባል እንደሚይዝ መረዳት አስፈላጊ ነው፣ ይህም “ከሁለት ሰዓት በፊት ቀደም ብሎ የተላከ የመሕልፈቃል ዳግም ማስጀመርያ መልእክት” የሚለውን መልእክት ያመጣል፡፡ የምንፈልገውም ይሄን ነው። ይህም በዝርዝር 12.17 ውስጥ ወዳለው ወደ መሕለፈቃል_ዳማስጀመሪያ_አብቅቷልን? (mehlefeqal_damasjemerya_abqtualn?
) ዘዴ ይመራናል፡፡ (ንጽጽሩ ትክክለኛ መሆኑን ለማሳየት የቀረበውን አንድ መደበኛ ማሳያ ለማጤን በክፍል 12.6 የተሰጠውን ማረጋገጫ ተመልከቱ፡፡)
app/models/teteqami.rb
class User < ApplicationRecord
.
.
.
# አንድ የመሕለፈቃል ዳግም ማስጀመሪያ ጊዜው ካበቃ እውነትን ይመለሳል።
def mehlefeqal_damasjemerya_abqtualn?
masjemer_tesedede_at < 2.hours.ago
end
private
.
.
.
end
በዝርዝር 12.17 ውስጥ ካለው ኮድ ጋር በዝርዝር 12.16 ውስጥ ያለው የ‘አዘምን (update
) ተግባር አሁን መስራት ይኖርበታል፡፡ በብቁ እና ብቁ ባልሆነ ርክብ የሚገኙ ውጤቶች በምስል 12.12 ላይ እና በምስል 12.13 ላይ በቅደም ተከተል ይታያሉ፡፡ (በነገራችን ላይ የሰደድነው የመሕለፈቃል ዳግም ማስጀመሪያ ኤመልእክት ከሁለት ሰዓት በኋላ ጊዜው ሲቃጠል እንፈትሻለን ብለን ለሁለት ሰዓት መጠበቁ ትእግስትን መጨረስ ነው፡፡ እናም ይህንን የመፈተኑ ጉዳይ እንደ አንድ መልመጃ ይሆናችሁ ዘንድ፣ ለናንተ ተትቷል ("ከአቦል እስከ በረካ ቡና የምንጠጣበት ጊዜ አግኝተናል በለና" እንዳትሉኝ ብቻ) (ክፍል 12.3.3.1)፤ ለሶስቱ የ‘ከሆነ (if
) ቅርንጫፎች የሚሆኑ ፈተናዎችን ግን አብረን እንጽፋለን።)
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
masjemer_fech
) ባሕሪ ዋጋውን ፈልጋችሁ አውጡ። ከዚያ ብቁ እና ተዛማጅ የሆኑ መሕለፈቃሎችን በምስል 12.12 ላይ ለታየው ቅጽ አስረክቡ፡፡ ማስረከቡ የሚሰራ ይመስላልን? የተጠቃሚው የ‘ፈጪ_ማስጀመር (masjemer_fech
) ባሕሪ ላይ ምን ለውጥ አመጣ? ጠቃሚ ምክር:- አዲሱን ዋጋ ፈልጎ ለማውጣት ተጠቃሚ.ዳግምጫን‘ን (teteqami.reload
) ተጠቀሙ።
ይህን_ሙሉ
የሚለው ቦታ ላይ አስፈላጊውን ኮድ እንድትጨምሩ ይጠይቃል፡፡ ጠቃሚ ምክር:- በዝርዝር 9.36 ላይ ዝክረ ፈጪውን፣ እንደ አንድ የክፍለጊዜ ይስሙላ አድርገን እንዳዲስ ተጠቅመንበት እንደነበረ አስታውሱ፣ የተጠቃሚ ቅርጸቱም ይህንን ለመሰረዝ ከቀድሞው አንድ የተነደፈ ዘዴ አለው (ዝርዝር 9.11)፡፡
app/controllers/meda_masjemers_controller.rb
class MedaMasjemersController < ApplicationController
.
.
.
def update
if params[:teteqami][:password].empty?
@teteqami.errors.add(:password, "ባዶ መሆን አይቻልም።")
render 'edit'
elsif @teteqami.update(teteqami_negariaseitoch)
ይህን_ሙሉ
reset_session
gba @teteqami
flash[:success] = "መሕልፈቃልዎ ዳግም መስራት ጀምሯል።"
redirect_to @teteqami
else
render 'edit'
end
end
.
.
.
end
በዚህ ክፍል ውስጥ፣ በዝርዝር 12.16 ውስጥ ከሚገኙት ከሶስቱ ቅርንጫፎች ውስጥ ሁለቱን ብቻ የሚሸፍን አንድ የውህደት ፈተናን እንጽፋለን፣ ይህ ፈተናም ብቁ እና ብቁ ያልሆነ ርክብን የሚፈትን ይሆናል (ከዚህ በፊት እንደተጠቀሰው፣ ሶስተኛውን ቅርንጫፍ የመፈተኑ ጉዳይ ለናንተ እንደ አንድ መልመጃ ይሆን ዘንድ ተትቷል፡፡ (ክፍል 12.3.3.1)) ለመሕለፈቃል ዳግም ማስጀመርያ የሚሆን አንድ የፈተና ፋይልን በማመንጨት እንጀምራለን:-
$ rails generate integration_test meda_masjemers
invoke test_unit
create test/integration/meda_masjemers_test.rb
ምንም እንኳን አጀማመራቸው ላይ ልዩነት ቢኖርም፣ የመሕለፈቃል ዳግም ማስጀመርያን ለመፈተን የሚረዱን ቅደም ተከተሎች ከዝርዝር 11.33 ማለት ከመለያ ማግበርያ የፈተና ቅደም ተከተሎች ጋር ግን በአብዛኛው ትይዩ ናቸው፤ መጀመሪያ የ“መሕለፈቃልወን ረሱ” ቅጽን እንጎበኝ እና አንድ ብቁ እና አንድ ብቁ ያልሆነ የኤመልእክት አድራሻን እናስረክባለን፣ የፊተኛው፣ አንድ የመሕለፈቃል ዳግም ማስጀመርያ ይስሙላን ይፈጥር እና አንድ የዳግም ማስጀመርያ ኤመልእክትን ይልካል። ከዚያ ከኤመልእክቱ ያገኘነውን አገናኝ ጎብኝትን፣ ብቁ እና ብቁ ያልሆነ መረጃን እንደገና በማስረከብ፣ በእያንዳንዱ ሁኔታ ላይ የሚጠበቀውን ትክክለኛ ባህሪ እናረጋግጣለን፡፡ ኮድን ለማንበብ እጅግ የሚረዳ መልመጃ ሊሆን የሚችል ቅደም ተከተልን ይዞ የመጣው የፈተና ውጤት፣ በዝርዝር 12.19 ላይ ይታያል።
test/integration/meda_masjemers_test.rb
require 'test_helper'
class MedaMasjemersTest < ActionDispatch::IntegrationTest
def setup
ActionMailer::Base.deliveries.clear
@teteqami = teteqamis(:michael)
end
test "መሕለፈቃል ዳግም ማስጀመርያ" do
get new_meda_masjemer_path
assert_template 'meda_masjemers/new'
assert_select 'input[name=?]', 'meda_masjemer[emelekt]'
# ብቁ ያልሆነ ኤመልእክት
post meda_masjemers_path, params: { meda_masjemer: { emelekt: "" } }
assert_not flash.empty?
assert_template 'meda_masjemers/new'
# ብቁ ኤመልእክት
post meda_masjemers_path,
params: { meda_masjemer: { emelekt: @teteqami.emelekt } }
assert_not_equal @teteqami.masjemer_fech, @teteqami.reload.masjemer_fech
assert_equal 1, ActionMailer::Base.deliveries.size
assert_not flash.empty?
assert_redirected_to root_url
# የመሕለፈቃል ዳግም ማስጀመርያ ቅጽ
teteqami = assigns(:teteqami)
# የተሳሳተ ኤመልእክት
get edit_meda_masjemer_path(teteqami.masjemer_ysmula, emelekt: "")
assert_redirected_to root_url
# ያልነቃ ተጠቃሚ
teteqami.toggle!(:nq)
get edit_meda_masjemer_path(teteqami.masjemer_ysmula, emelekt: teteqami.emelekt)
assert_redirected_to root_url
teteqami.toggle!(:nq)
# ብቁ ኤመልእክት ከተሳሳተ ኤመልእክት ጋር
get edit_meda_masjemer_path('የተሳሳተ ይስሙላ', emelekt: teteqami.emelekt)
assert_redirected_to root_url
# ብቁ ኤመልእክት ከብቁ ይስሙላ ጋር
get edit_meda_masjemer_path(teteqami.masjemer_ysmula, emelekt: teteqami.emelekt)
assert_template 'meda_masjemers/edit'
assert_select "input[name=emelekt][type=hidden][value=?]", teteqami.emelekt
# ብቁ ያልሆነ መሕለፈቃል እና ማረጋገጫ
patch meda_masjemer_path(teteqami.masjemer_ysmula),
params: { emelekt: teteqami.emelekt,
teteqami: { password: "angesom",
password_confirmation: "araya" } }
assert_select 'div#error_explanation'
# ባዶ መሕለፈቃል
patch meda_masjemer_path(teteqami.masjemer_ysmula),
params: { emelekt: teteqami.emelekt,
teteqami: { password: "",
password_confirmation: "" } }
assert_select 'div#error_explanation'
# ብቁ መሕለፈቃል እና ማረጋገጫ
patch meda_masjemer_path(teteqami.masjemer_ysmula),
params: { emelekt: teteqami.emelekt,
teteqami: { password: "biniam",
password_confirmation: "biniam" } }
assert geb_tual?
assert_not flash.empty?
assert_redirected_to teteqami
end
end
በዝርዝር 12.19 ውስጥ ያሉትን አብዛኛዎቹን ሃሳቦች ቀደም ሲል በዚህ ስልጠና ላይ አይተናቸዋል፤ አንድ ያላየነው አዲስ ነገር ቢኖር የ‘ግብዓት (input
) መለያን መፈተንን ነው:-
assert_select "input[name=emelekt][type=hidden][value=?]", teteqami.emelekt
ይህ በአንድ የ‘ግብዓት (input
) መለያ ውስጥ ትክክለኛ ስም፣ (የተደበቀ) አይነት እና የኤመልእክት አድራሻ መኖሩን ያረጋግጣል:-
<input id="emelekt" name="emelekt" type="hidden" value="michael@example.com" />
በዝርዝር 12.19 ኮድ ውጤት ምክንያት የፈተና ስብስቡ አረንጓዴመሆን አለበት:-
$ rails test
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
masjemer_fech_fter
) ዘዴ ባሕሪ_አዘምን‘ን (update_attribute
) ሁለት ተግባራትን እንዲፈጽም ይጠይቃል፣ እያንዳንዱ ተግባርም አንድ የተለየ የውሂበጎታ ግንኙነትን ይጠይቃል፡፡ በዝርዝር 12.21 ውስጥ የሚታየው ዝግጁገጽታ ላይ እንደተመለከተው ይህን_ሙሉ
የሚለው ቦታ ላይ የሚያስፈልገውን ኮድ በመሙላት፣ ሁለቱንም የ‘ባሕሪ_አዘምን (update_attribute
) ዘዴ ጥሪዎች፣ አምዶች_አዘምን (update_columns
) በተባለ ዘዴ በመተካት ወደ አንድ ነጠላ ጥሪ ተኩ፡፡ እነዚህን ለውጦች ካደረጋችሁ በኋላ፣ የፈተና ስብስቡ አሁንም አረንጓዴመሆኑን አረጋግጡ። (በዝርዝር 11.39 ላይ የተሰጣችሁን መልመጃ ለማቃለል ያህል፣ ዝርዝር 12.21 የመልመጃውን መፍትሄ በከፊሉ ያካትታል፡፡)
ይህን_ሙሉ
የሚለው ቦታ ላይ የሚያስፈልገውን ኮድ በመሙላት፣ በዝርዝር 12.16 ውስጥ የመሕልፈቃል ዳግም ማስጀመሪያው ጊዜው እንደተቃጠለ የሚያረጋግጥ አንድ የውህደት ፈተናን ጻፉ፡፡ (ይህ ኮድ መልስ.አካል (response.body
) የተባለ ዘዴን ያስተዋውቃል፣ ይህም የገጹን ሙሉ የ‘ሃ.ጽ.መ.ቋ አካል ይመልሳል።) አንድ የተቃጠለ ጊዜ ውጤትን ለመፈተን የሚያገለግሉ ብዙ መንገዶች አሉ፣ ነገር ግን በዝርዝር 12.22 የቀረበው ዘዴ፣ የተመለሰው አካል በገጹ ውስጥ “expired” የሚል ቃል ማካተቱን (በመልከፊደል-ግድየለሽነት) ይፈትሻል።
masjemer_fech
) ባሕሪን በቀጥታ ለመፈተን፣ ተጠቃሚ.ዳግምጫን‘ን (teteqami.reload
) (ዝርዝር 11.33) እና (ለመጀመሪያ ጊዜ በዝርዝር 9.25 ላይ የታየውን) ምንምን-አረጋግጥ‘ን (assert_nil
) በአንድ ላይ አጣምሩ፡፡
update_columns
) ለመጠቀም የሚያገለግል አብነት። app/models/teteqami.rb
class Teteqami < ApplicationRecord
attr_accessor :zkre_ysmula, :magberya_ysmula, :masjemer_ysmula
before_save :emelekt_nious_melkefidel
before_create :magberya_fech_fter
.
.
.
# አንድ መለያን ያነቃል።
def agbr
update_columns(nq: true, nq_at: Time.zone.now)
end
# የመሕለፈቃል ዳግም ማስጀመር ኤመልእክትን ይልካል፡፡
def masjemer_emelekt_laki
TeteqamiMailer.meda_masjemer(self).deliver_now
end
# የመሕለፈቃል ዳግም ማስጀመርያ ባሕርያትን ያዘጋጃል።
def masjemer_fech_fter
self.masjemer_ysmula = Teteqami.adis_ysmula
update_columns(masjemer_fech: ይህን_ሙሉ, masjemer_tesedede_at: ይህን_ሙሉ)
end
# የመሕለፈቃል ዳግም ማስጀመር ኤመልእክትን ይልካል፡፡
def masjemer_emelekt_laki
TeteqamiMailer.meda_masjemer(self).deliver_now
end
private
# የኤመልክትን ወደ ንዑስ ፊደል ይለውጣል።
def emelekt_nious_melkefidel
self.emelekt = emelekt.downcase
end
# ማግበሪያ ይስሙላን እና ፍጪን ይፈጥር እና ይመድባል።
def magberya_fech_fter
self.magberya_ysmula = Teteqami.adis_ysmula
self.magberya_fech = Teteqami.fech(magberya_ysmula)
end
end
test/integration/meda_masjemers_test.rb
require "test_helper"
class MedaMasjemersTest < ActionDispatch::IntegrationTest
def setup
ActionMailer::Base.deliveries.clear
@teteqami = teteqamis(:michael)
end
.
.
.
test "ጊዜው ያለፈበት ይስሙላ" do
get new_meda_masjemer_path
post meda_masjemers_path,
params: { meda_masjemer: { emelekt: @teteqami.emelekt } }
@teteqami = assigns(:teteqami)
@teteqami.update_attribute(:masjemer_tesedede_at, 3.hours.ago)
patch meda_masjemer_path(@teteqami.masjemer_ysmula),
params: { emelekt: @teteqami.emelekt,
teteqami: { password: "foobar",
password_confirmation: "foobar" } }
assert_response :redirect
follow_redirect!
assert_match /ይህን_ሙሉ/i, response.body
end
end
app/controllers/meda_masjemers_controller.rb
class MedaMasjemersController < ApplicationController
.
.
.
def update
if params[:teteqami][:password].empty?
@teteqami.errors.add(:password, "ባዶ መሆን አይቻልም።")
render 'edit'
elsif @teteqami.update(teteqami_negariaseitoch)
gba @teteqami
@teteqami.update_attribute(:masjemer_fech, nil)
flash[:success] = "መሕልፈቃልዎ ዳግም መስራት ጀምሯል።"
redirect_to @teteqami
else
render 'edit'
end
end
.
.
.
end
አሁን በማበልጸጊያ ውስጥ የሚሰራ የመሕለፈቃል ዳግም ማስጀመርያ አለን፣ በዚህ ክፍል ውስጥ እሱኑ በምርት ውስጥም እንዲሰራ እናደርገዋለን፡፡ በዚህ ክፍል ውስጥ የምንከተላቸው ቅደም ተከተሎች በሙሉ ከመለያ ማግበርያ ጋር አንድ አይነት ስለሆኑ፣ ክፍል 11.4 ‘ን ከተከታተላችሁ በቀጥታ ወደ ዝርዝር 12.24 መዝለል ትችላላችሁ፡፡ አለበለዚያ ግን መጀመሪያ በክፍል 11.4 ውስጥ ያሉትን መመሪያዎች ተከትላችሁ ማጠናቀቅ እና ከዚያ ወደዚህ ተመልሳችሁ መምጣት ይኖርባችኋል።
በዚህ ጊዜ የርዕስ ቅርንጫፉን ከዋና ቅርንጫፉ ጋር ማዋሃድ ይኖርባችኋል (ዝርዝር 12.24)፡፡
መሕለፈቃልን-ዳግም-ማስጀመር
ቅርንጫፍን ከዋናው (main
) ቅርንጫፍ ጋር ማዋሃድ።
$ rails test
$ git add -A
$ git commit -m "የመሕለፈቃል ዳግም ማስጀመርያን ማከል"
$ git checkout main
$ git merge መሕለፈቃልን-ዳግም-ማስጀመር
ከዚያ ኮዱን ወደ ሩቅ ማከማቻ ግፉ እና ወደ ሃረኩ አሰማሩት:-
$ rails test
$ git push && git push heroku
$ heroku run rails db:migrate
አፕልኬሽናችሁ በሃረኩ ላይ ከተሰማራ በኋላ “መሕለፈቃልወን ረሱ” የሚለውን አገናኝ ላይ ጠቅ በማድረግ (ምስል 12.4) መሕለፈቃላችሁን ዳግም ማስጀመር ትችላላችሁ፡፡ ውጤቱ በምስል 12.14 ላይ እንደሚታየው፣ አንድ የዳግም ማስጀመሪያ ኤመልእክት መሆን አለበት፡፡ አገናኙን መከተል እና ብቁ ወይም ብቁ ያልሆኑ ርክቦችን ማስረከቡ፣ ልክ በማበልጸግ ላይ እንደሰሩት ሁሉ በምርቱ ላይም እንደዛው መስራት አለባቸው (ምስል 12.12 እና ምስል 12.13)፡፡ በተመሳሳይም፣ ተጠቃሚው መሕለፈቃሉን በተሳካ ሁኔታ ሲቀይር፣ ወደ መገለጫ ገጹ መዟዟር ይኖርበታል (ምስል 12.15)፡፡
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
heroku logs
) አስኪዱ።
ከተጨመረው የመሕለፈቃል ዳግም ማስጀመሪያ ጋር፣ የአፕልኬሽናችን የመመዝገቢያ፣ የመግቢያ እና የመውጫ ፋብሪካው፣ ሞያዊ የሆነ ደረጃን በመያዝ ተጠናቋል፡፡ ቀሪው የሩቢ ኦን ሬይልስ ስልጠና ትዊተር መሰል አጪርጽሑፎችን (ምዕራፍ 13) እና የተከታይ ተጠቃሚዎች የቅምጦች ሁኔታ ቀላቢ ላይ በመመስረት፣ አንድ ጣቢያን መገንባት ይሆናል (ምዕራፍ 14)፡፡ በሂደቱ ስለ ምስል ሰቀላ፣ ስለ ብጁ የውሂበጎታ መጠይቆች እና ስለ የላቀ የውሂብ ቅርጸት ከ‘ብዙ_አለው (has_many
) እና ብዙ_አለው በኩል (has_many :through
) ጋር ጨምሮ፣ ስለ አንዳንድ እጅግ ጠቃሚ ስለሆኑ የሬይልስ በይነገጻትም እንማራለን።
አንድ የመሕለፈቃል ዳግም ማስጀመሪያ፣ መቸ እንደሚቃጠል ለመወሰን የንጽጽር ፈተናው በዝርዝር 12.17 ላይ እንደሚታየው:-
masjemer_tesedede_at < 2.hours.ago
መሆኑን በክፍል 12.3 ተመልክተናል፡፡ አባባሉ “ከሁለት ሰዓት ባነሰ ጊዜ ውስጥ የተላከ የመሕለፈቃል ዳግም ማስጀመሪያ መልእክት” ተብሎ የሚነበብ ይመስላል፣ ይህም ከምንፈልገው ሃሳብ ጋር ይቃረናል፡፡ በዚህ ክፍል ውስጥ ከዚህ በላይ ያለው ንጽጽር ትክክል መሆኑን እናረጋግጣለን፡፡6
ሁለት የተለያዩ ጊዜያቶችን በመበየን እንጀምራለን፡፡ \( \Delta t_r \) የመሕለፈቃል ዳግም ማስጀመሪያው ከተላከበት ጊዜ ጀምሮ ያለውን ጊዜ ቢይዝ እና \( \Delta t_e \) ደግሞ ለመሕለፈቃል ዳግም ማስጀመሪያው የተላከው ኤመልእክት የሚቃጠልበትን የጊዜ ገደብ የሚይዝ ቢሆን (ለምሳሌ ሁለት ሰዓት)፣ የመሕለፈቃል ዳግም ማስጀመሪያው ከተላከ በኋላ ያለው ጊዜ፣ የተቃጠለበት ጊዜ ከተገደበው ጊዜ ከበለጠ፣ የመሕለፈቃል ዳግም ማስጀመሪያው ተቃጥሏል ማለት ነው:-
የአሁኑን ጊዜ \( t_N \) ብንል፣ የመሕለፈቃል ዳግም ማስጀመሪያው የተሰደደበት ጊዜን ደግሞ \( t_r \) ብንል እና የሚቃጠልበት ጊዜን \( t_e \) ብንል (ለምሳሌ ከሁለት ሰዓት በፊት)
እና
Eq. (12.2) እና Eq. (12.3) ‘ን በ (12.1) ውስጥ በማስገባት የሚከተለውን ማግኘት እንችላለን:-
ይህንንም በ \( -1 \) ማባዛቱ ይህንን ያስገኛል:-
(12.4) ‘ን \( t_e = \mathrm{ከ 2\ ሰዓት\ በፊት} \) ዋጋ ጋር ወደ ኮድ መለወጡ፣ በዝርዝር 12.17 ውስጥ የተመለከተውን የ‘መሕለፈቃል_ዳማስጀመሪያ_አብቅቷልን? (mehleefeqal_damasjemerya_abqtualn?
) ዘዴን ይሰጠል:-
def mehlefeqal_damasjemerya_abqtualn?
masjemer_tesedede_at < 2.hours.ago
end
በክፍል 12.3 ላይ እንደተጠቀሰው፣ የ <
ምልክትን “ያንሳል” ብለን ከማንበብ ይልቅ “ቀደም ብሎ” ብለን ካነበብነው ይህ ኮድ “የመሕለፈቃል ዳግም ማስጀመሪያው ከሁለት ሰዓት በፊት ቀደም ብሎ ተልኳል” የሚለውን የእንግሊዝኛ ዓረፍተ ነገር ትርጉም ይሰጣል፡፡
ሬይልስ-አይ18ኤን (rails-i18n)
እንቁን በምትጠቀሙበት ጊዜ፣ የ‘ስህተቶች.አክል(:መሕለፈቃል, :ባዶ) (errors.add(:password, :blank)
) ዘዴ፣ የስህተት መልእክቱን በመረጡት ቋንቋ እንደሚያቀርብ አበስረዋል (ይህ ማለት የስህተት መልእክቱ በአማርኛ እንዲሆን ከተፈለገ በአማርኛ እንዲሆን ማድረግ ይቻላል ማለት ነው)፡፡