በዚህ ምዕራፍ ውስጥ የ‘አርትዕ (edit
)፣ የ‘አዘምን (update
)፣ የ‘ማውጫ (index
) እና የ‘አጥፋ (destroy
) ተግባሮችን በማከል ለተጠቃሚዎች ሃብቶች የው.ሁ.ማ ተግባሮችን (ሰንጠረዥ 7.1) እናጠናቅቃለን፡፡ ለተጠቃሚዎች መገለጫቸውን የሚያዘምኑበትን ችሎታ በመስጠት እንጀምራለን፤ ይህ ደግሞ አንድ የፈቀዳ ቅርጸትን ለማስፈጸም አንድ ተፈጥሯዊ እድልን ይሰጠናል (ይህም በምዕራፍ 8 ላይ ባለው የማረጋገጫ ኮድ ተግባራዊ ሊሆን ችሏል)፣ ከዚያ የሁሉንም ተጠቃሚዎች ዝርዝር እናዘጋጃለን (ይህ ማረጋገጫንም ያስፈልጋል)፣ ይህም የውሂብ ናሙናን እና ገጸቁጥርን ለማስተዋወቅ አንድ እድልን ይከፍታል። በመጨረሻም፣ ተጠቃሚዎችን ከውሂበጎታው የማጥፋት ችሎታን እናክላለን፤ ማንኛውም ተጠቃሚ እንደዚህ አይነት አደገኛ ኃይል እንዲኖረው መፍቀድ ስለማንችል፣ ሌሎች ተጠቃሚዎችን ለመሰረዝ ልዩ መብት የተፈቀደላቸው የአስተዳደር ተጠቃሚዎችን ለማስተናገድ አንድ ክፍልን እንፈጥራለን፡፡
የተጠቃሚ መረጃን የማረሙ ንድፍ፣ አዲስ ተጠቃሚወችን ከመፍጠር ጋር በጣም ትይዩ ነው (ምዕራፍ 7)፡፡ ለአዲስ ተጠቃሚዎች አንድ ትይታ ከሚያቀርብ አንድ የ‘አዲስ (new
) ተግባር ይልቅ፣ አንድ የተጠቃሚዎች አርትዕ ትይታን የሚያቀርብ አንድ የ‘አርትዕ (edit
) ተግባር አለን፤ በተመሳሳይ ፍጠር‘ን (create
) ለአንድ የ‘ዓስቀምጥ (POST)
መጠይቅ ምላሽ ከመስጠት ይልቅ፣ ለአንድ የ‘ዓዘም‘ን (PATCH)
መጠይቅ ምላሽ የምንሰጥበት አንድ የ‘አዘምን (update
) ተግባር አለን (ሳጥን 3.2)፡፡ እዚህ ላይ ትልቁ ልዩነት፣ ማንም ሰው መመዝገብ ቢችልም፤ መረጃውን ማዘመን የሚችለው ግን የአሁንተጠቃሚ ብቻ መሆኑ ነው። የምዕራፍ 8 የማረጋገጫ ፋብሪካውም የአሁንተጠቃሚ እንደሆነ ለማረጋገጥ፣ አንድ ቅድመአጣሪን (Before Filter) እንድንጠቀም ያስችለናል፡፡
ስራችንን ለመጀመር፣ በአንድ ተጠቃሚዎችን-ማዘመን
በተባለ ርዕስ ቅርንጫፍ ላይ በመስራት እንጀምር:-
$ git checkout -b ተጠቃሚዎችን-ማዘመን
ስእላዊ መግለጫው1 በምስል 10.1 ላይ በሚታየው የእርማት ቅጽ እንጀምራለን፡፡ በምስል 10.1 ላይ ያለውን ስእላዊ መግለጫ ወደ አንድ የሚሰራ ገጽ ለመቀየር፣ የተጠቃሚዎች መቆጣጠሪያ የ‘አርትዕ (edit
) ተግባርን እና የተጠቃሚ እርማት ትይታን መሙላት ይኖርብናል። ተገቢውን ተጠቃሚ ከውሂበጎታው ጎትቶ ማውጣት በሚፈልገው በ‘አርትዕ (edit
) ተግባር እንጀምራለን። ሰንጠረዥ 7.1 ላይ በተመለከተው መሰረት፣ ለአንድ ተጠቃሚ የእርማት ገጽ ትክክለኛው ዓ.አ.ሃ.አ /ተጠቃሚዎች/1/አርትዕ (/teteqamis/1/edit) መሆኑን ልብ ልትሉ ይገባል (እዚህ ላይ የተጠቃሚው መታወቂያ 1
ነው ካልን ማለት ነው)፡፡ የተጠቃሚው መታወቂያ በ‘ሰሚአሴቶች[:መታወቂያ] (params[:id]
) ተለዋዋጪ ውስጥ የሚገኝ መሆኑን አስተውሉ፣ ይህ ማለት በዝርዝር 10.1 ውስጥ በሚገኘው ኮድ ተጠቃሚውን መፈለግ እንችላለን ማለት ነው፡፡
edit
) ተግባር። app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
def show
@teteqami = Teteqami.find(params[:id])
end
def new
@teteqami = Teteqami.new
end
def create
@teteqami = Teteqami.new(teteqami_negariaseitoch)
if @teteqami.save
gba @teteqami
flash[:success] = "እንኳን ወደ ማሳያ አፕልኬሽኑ በደህና መጡ!"
redirect_to @teteqami
else
render 'new'
end
end
def edit
@teteqami = Teteqami.find(params[:id])
end
private
def teteqami_negariaseitoch
params.require(:teteqami).permit(:sim, :emelekt, :password,
:password_confirmation)
end
end
ተዛማጁ የተጠቃሚ የእርማት ትይታ በዝርዝር 10.2 ውስጥ ይታያል (ይህንን ራሳችሁ መፍጠር ይኖርባችኋል)፡፡ ይህ ዝርዝር 7.15 ውስጥ ካለው የአዲስ ተጠቃሚ ትይታ ጋር እንዴት እንደሚመሳሰል አስተውሉ፤ ይህ በጣም መደራረብ የተደጋገመው ኮድ ወደ አንድ ከፊል መጠራት እንዳለበት ያመላክታል፣ ይህንን ማድረጉም እንደ አንድ መልመጃ ይሆን ዘንድ ለናንተ ተትቷል (ክፍል 10.1.1.1)፡፡
app/views/teteqamis/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, local: true) do |ቅ| %>
<%= render 'gru/shtet_melektoch' %>
<%= ቅ.label :sim, 'ስም' %>
<%= ቅ.text_field :sim, class: 'form-control' %>
<%= ቅ.label :emelekt, 'ኤመልእክት' %>
<%= ቅ.email_field :emelekt, class: 'form-control' %>
<%= ቅ.label :password, 'መሕለፈቃል' %>
<%= ቅ.password_field :password, class: 'form-control' %>
<%= ቅ.label :password_confirmation, "አረጋግጥ" %>
<%= ቅ.password_field :password_confirmation, class: 'form-control' %>
<%= ቅ.submit "ለውጦችን አስቀምጥ", class: "btn btn-primary" %>
<% end %>
<div class="amsaya_artot">
<%= amsaya_le @teteqami %>
<a href="https://gravatar.com/emails" target="_blank">ቀይር</a>
</div>
</div>
</div>
እዚህ ጋር በክፍል 7.3.3 ውስጥ የተዋወቅነውን የጋራ የ‘ስህተት_መልእክቶች (shtet_melektoch
) ከፊልን በድጋሜ ተጠቅመናል፡፡ በነገራችን ላይ፣ በአምሳያ አገናኝ ውስጥ የ‘ኢላማ="_ባዶ" (target="_blank"
) ጥቅሙ፣ አሳሹ ገጹን በአንድ አዲስ መስኮት ወይም በትር ላይ እንዲከፍተው ለማድረግ ነው፤ ይህም ከሌሎች ጣቢያዎች ጋር መገናኘት በሚያስፈልግ ጊዜ፣ አንዳንድ ጊዜ ምቹ የማገናኛ ባህሪ ሊሆን ይችላል፡፡ (ከ‘ኢላማ="_ባዶ" (target="_blank"
) ጋር የተዛመደ አንድ አነስተኛ የጥበቃ ችግር አለ፤ ከዚህ ዝርዝር ጋር የመፋለሙ ጉዳይ፣ እንደ አንድ መልመጃ ይሆን ዘንድ ለናንተ ተትቷል (ክፍል 10.1.1.1)፡፡)
በምስል 10.2 ላይ እንደሚታየው፣ በዝርዝር 10.1 ውስጥ ባለው የ‘@ተጠቃሚ (@teteqami
) ቅርፀ ተለዋዋጪ፣ የእርማት ገጹ በትክክል መቅረብ አለበት። የነባር @ተጠቃሚ (@teteqami
) ተለዋዋጪ ባሕሪያትን በመጠቀም፣ ሬይልስ የ“ስም” እና የ“ኤመልክት” መስኮችን እንዴት አስቀድሞ በራስሰር እንደሚሞላ ልብ በሉ (ምስል 10.2)።
በዝርዝር 10.3 ውስጥ የምስል 10.2 ‘ን የሃ.ጽ.መ.ቋ ምንጪ በመመልከት፣ የተጠበቀውን አንድ የቅጽ መለያ እናያለን (ዝርዝሮቹ ትንሽ ሊለያዩ ይችላሉ)፡፡
<form accept-charset="UTF-8" action="/teteqamis/1" class="edit_teteqami"
id="edit_teteqami_1" method="post">
<input name="_method" type="hidden" value="patch" />
.
.
.
</form>
እዚህ ላይ የተደበቀውን የግብዓት መስክ ልብ በሉ:-
<input name="_method" type="hidden" value="patch" />
የድርአሳሾች በተፈጥሮዋቸው የ‘ዓዘምን (PATCH)
መጠይቆችን መላክ ስለማይችሉ፣ ሬይልስ በአንድ የ‘ዓስቀምጥ (POST)
መጠይቅ እና በአንድ የተደበቀ የ‘ግብዓት (input
) መስክ አሳሾችን ይሸውዳቸዋል (በው.ሁ.ማ ደንብ መሰረት ይህንን ተግባራዊ ለማድረግ ከሰንጠረዥ 7.1 የ‘ዓስቀምጥ (POST) መጠይቅ ያስፈልገዋል)።2
እዚህ ጋር ሌላ ማስተካከል ያለብን እንከን አለ እሱም:- በዝርዝር 10.2 ላይ የሚገኘው ቅጽ_ጋር(@ተጠቃሚ) (form_with(@teteqami)
) የሚለው ኮድ በዝርዝር 7.15 ላይ ከሚገኘው ቅጽ_ጋር(@ተጠቃሚ) (form_with(@teteqami)
) ከሚለው ኮድ ጋር ፍጹም
አንድ ዓይነት ነው። ታዲያ ሬይልስ ለአዲስ ተጠቃሚዎች አንድ የ‘ዓስቀምጥ (POST)
መጠይቅን እና ለተጠቃሚዎች እርማት አንድ የ‘ዓዘምን (PATCH)
መጠይቅን እንደሚጠቀም እንዴት ያውቃል? መልሱ የንቅ መዝገብ የ‘አዲስ_መዝገብነውን? (new_record?
) ቡልየን ዘዴን በመጠቀም አንድ ተጠቃሚ አዲስ ወይም ቀድሞውኑ በውሂብዳታው ውስጥ አለመኖሩን ማወቅ ይቻላል ነው:-
$ rails console
>> Teteqami.new.new_record?
=> true
>> Teteqami.first.new_record?
=> false
ቅጽ_ጋር(@ተጠቃሚ)‘ን (form_with(@teteqami)
) በመጠቀም አንድ ቅጽን በምትሰሩበት ጊዜ፣ የ‘@ተጠቃሚ.አዲስ_መዝገብነውን? (@teteqami.new_record?
) ዋጋ እውነት (true
) ከሆነ ሬይልስ ዓስቀምጥ‘ን (POST)
ይጠቀማል፣ ዋጋው ሃሰት (false
) ከሆነ ደግሞ ዓዘምን‘ን (PATCH)
ይጠቀማል ማለት ነው፡፡
እንደመጨረሻ ስራ፣ በጣቢያው ዳሳሽ ውስጥ የዝግጅቶች አገናኝ ዓ.አ.ሃ.አን እንሞላለን፡፡ ስዩሙን ማዘዋወርያ ከሰንጠረዥ 7.1 ማለት አርትዕ_ተጠቃሚ_መንገድ‘ን (edit_teteqami_path
) ዝርዝር 9.9 ውስጥ ከተበየነው ከምቹው የ‘ዓሁን_ተጠቃሚ (ahun_teteqami
) ረጅ ዘዴ ጋር አጣምሮ በመጠቀም ይህን አገናኝ መፍጠሩ ቀላል ነው:-
<%= link_to "ዝግጅቶች", edit_teteqami_path(ahun_teteqami) %>
ሙሉው የአፕልኬሽን ኮድ በዝርዝር 10.4 ውስጥ ይታያል።
app/views/layouts/_rasgie.html.erb
<header class="navbar navbar-fixed-top navbar-inverse">
<div class="container">
<%= link_to "ማሳያ አፕልኬሽን", root_path, id: "አርማ" %>
<nav>
<ul class="nav navbar-nav navbar-right">
<li><%= link_to "መነሻ", root_path %></li>
<li><%= link_to "እርዳታ", erdata_path %></li>
<% if gebtual? %>
<li><%= link_to "ተጠቃሚወች", '#' %></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
መለያ <b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><%= link_to "መገለጫ", ahun_teteqami %></li>
<li><%= link_to "ዝግጅቶች", edit_teteqami_path(ahun_teteqami) %></li>
<li class="divider"></li>
<li>
<%= link_to "ይውጡ", wta_path, method: :delete %>
</li>
</ul>
</li>
<% else %>
<li><%= link_to "ይግቡ", gba_path %></li>
<% end %>
</ul>
</nav>
</div>
</header>
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
target="_blank"
) የተባለውን የሃ.ጽ.መ.ቋ አባልን ከመጠቀም ጋር የተያያዘ አንድ አነስተኛ የጥበቃ ችግር አለ፤ ይህም ከሃ.ጽ.መ.ቋ ሰነድ ጋር የተዛመደውን ማለት “የ‘መስኮት ቁስ (window
object)” ተብሎ የሚጠራውን ቁስ ተቀባዩ ጣቢያ እንዲቆጣጠረው አሳልፎ ይሰጣል፡፡ ተቀባዩ ጣቢያ እንደ አንድ ተንኮል አዘል (phishing) ገጽ ያሉ አደገኛ ይዘቶችን ሊያስተዋውቅ ይችላል፡፡ ይህ እንደ ግራቫታር ካሉ ታዋቂ ጣቢያዎች ጋር በመገናኘት ሊከሰት የሚችል ጉዳይ አይደለም፣ ነገር ግን በዋናው አገናኝ ላይ የ‘ግንኙነት (rel (“relationship”)) ባሕሪውን ዋጋ መክፈቻየለም ("noopener"
) ብለን በመጠቀም አደጋውን ሙሉ በሙሉ ከወዲሁ ማስወገድ እንችላለን፡፡ ይህንን ባሕሪ በዝርዝር 10.2 ውስጥ የሚገኘው የአምሳያ እርማት አገናኝ ውስጥ አክሉ።
new.html.erb
) እና የ‘አርትዕ.ሃጽመቋ.ክሩ (edit.html.erb
) ትይታወች በዝርዝር 10.6 ውስጥ ያለውን ከፊል ይጠቀሙ ዘንድ፣ በሁለቱ ቅጾች ውስጥ ያሉትን የኮድ ድግግሞሽ አስወግዱ፡፡ በክፍል 3.4.3 ላይ፣ በገጽታው ውስጥ ድግግሞሽን ለማስወገድ የተጠቀምንበትን የ‘አቅርብ (provide
) ዘዴን አሁንም ተግባራዊ እንዳደረግነው ተገንዝባችሁ ይሆናል፡፡3
new
) እና ለ‘አርትዕ (edit
) ቅጽ የሚሆን አንድ ከፊል። app/views/teteqamis/_ቅጽ.html.erb
<%= form_with(model: @teteqami, local: true) do |ቅ| %>
<%= render 'gru/shtet_melektoch' %>
<%= ቅ.label :sim, 'ስም' %>
<%= ቅ.text_field :sim, class: 'form-control' %>
<%= ቅ.label :emelekt, 'ኤመልእክት' %>
<%= ቅ.email_field :emelekt, class: 'form-control' %>
<%= ቅ.label :password, 'መሕለፈቃል' %>
<%= ቅ.password_field :password, class: 'form-control' %>
<%= ቅ.label :password_confirmation, "አረጋግጥ" %>
<%= ቅ.password_field :password_confirmation, class: 'form-control' %>
<%= ቅ.submit yield(:የአዝራር_ጽሑፍ), class: "btn btn-primary" %>
<% end %>
app/views/teteqamis/new.html.erb
<% provide(:title, 'ይመዝገቡ') %>
<% provide(:የአዝራር_ጽሑፍ, 'ለኔ መለያ ፍጠር') %>
<h1 class="ራስጌ1">ይመዝገቡ</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= render 'ቅጽ' %>
</div>
</div>
app/views/teteqamis/edit.html.erb
<% provide(:title, "የተጠቃሚ እርማት") %>
<% provide(:የአዝራር_ጽሑፍ, 'ለውጦችን አስቀምጥ') %>
<h1 class="ራስጌ1">መገለጫዎን ያዘምኑ</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= render 'ቅጽ' %>
<div class="amsaya_artot">
<%= amsaya_le @teteqami %>
<a href="http://gravatar.com/emails" target="_blank" rel="noopener">ቀይር</a>
</div>
</div>
</div>
ያልተሳኩ ምዝገባዎችን (ክፍል 7.3) ያስተናገድንበትን ተመሳሳይ ሃሳብን በመከተል፣ በዚህ ክፍል ደግሞ ያልተሳኩ እርማቶችን እናስተናግድበታለን። አንድ የ‘አዘምን (update
) ተግባርን በመፍጠር እንጀምራለን፤ ይህም በዝርዝር 10.8 ላይ እንደሚታየው፣ በተረከበው የ‘ሰሚአሴቶች (params
) ተርታ ላይ የተመሰረተ ተጠቃሚን ለማዘመን የ‘አዘምን (update
) ዘዴን (ክፍል 6.1.5) ይጠቀማል። የቀረበው መረጃ ብቁ ካልሆነ፣ የማዘመን ሙከራው ሃሰት‘ን (false
) ይመልሳል፤ ስለሆነም የ‘ሌላከሆነ (else
) ቅርንጫፉ የማረሚያውን ገጽ ያቀርባል። እንደዚህ ዓይነት ጥለትን ከዚህ በፊት አይተናል፤ ይህ አወቃቀር ከመጀመሪያው የ‘ፍጠር (create
) ተግባር ስሪት ጋር በጣም ትይዩ ነው (ዝርዝር 7.18)።
update
) ተግባር። app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
def show
@teteqami = Teteqami.find(params[:id])
end
def new
@teteqami = Teteqami.new
end
def create
@teteqami = Teteqami.new(teteqami_negariaseitoch)
if @teteqami.save
gba @teteqami
flash[:success] = "እንኳን ወደ ማሳያ አፕልኬሽኑ በደህና መጡ!"
redirect_to @teteqami
else
render 'new'
end
end
def edit
@teteqami = Teteqami.find(params[:id])
end
def update
@teteqami = Teteqami.find(params[:id])
if @teteqami.update(teteqami_negariaseitoch)
# የተሳካ ዝመናን ማስተናገድ።
else
render 'edit'
end
end
private
def teteqami_negariaseitoch
params.require(:teteqami).permit(:sim, :emelekt, :password,
:password_confirmation)
end
end
እዚህ ላይ የ‘አዘምን (update
) ጥሪ ውስጥ የ‘ተጠቃሚ_ነገሪአሴቶች (teteqami_negariaseitoch
) አጠቃቀምን አስተውሉ፣ ይህ የክምር ምደባ ተጋላጪነትን ለመከላከል ጠንካራ ሰሚአሴቶችን ይጠቀማል (በክፍል 7.3.2 ላይ እንደተገለጸው)፡፡
አሁን ባሉት የተጠቃሚ ቅርጸት ማስረገጫዎች እና በዝርዝር 10.2 ላይ ባለው የስህተት መልእክቶች ከፊል ምክንያት፣ ብቁ ያልሆነ መረጃን ማስረከቡ ጠቃሚ የስህተት መልእክቶችን ያቀርባል (ምስል 10.3)፡፡
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
ክፍል 10.1.2 ‘ን በአንድ በሚሰራ የእርማት ቅጽ ተሰናብተነዋል፡፡ የመፈተን መመሪያዎችን ከሳጥን 3.3 በመከተል፣ አሁን ማንኛውንም ምልሰት ለመያዝ አንድ የውህደት ፈተናን እንጽፋለን፡፡ እንደተለመደው የመጀመሪያ ደረጃ ስራችንም አንድ የውህደት ፈተናን ማመንጨት ነው:-
$ rails generate integration_test teteqamis_edit
invoke test_unit
create test/integration/teteqamis_edit_test.rb
ከዚያም በዝርዝር 10.9 ላይ እንደሚታየው፣ ለአንድ ያልተሳካ እርማት አንድ ቀላል ፈተናን እንጽፋለን። በዝርዝር 10.9 ውስጥ ያለው ፈተና፣ የእርማት ገጽታው፣ የእርማት ገጹን ካገኘ በኋላ መቅረቡን እና ብቁ ያልሆነ መረጃ ሲረከብ የእርማት ገጹን ዳግም እንዳቀረበ በማጣራት ትክክለኛውን ባህሪ ይፈትናል። እዚህ ላይ አንድ የ‘ዓዘምን (PATCH)
መጠይቅን ለመስጠት የ‘አዘምን (patch
) ዘዴ መጠቀምን አስተውሉ፤ ይህም ልክ እንደ አግኝ (get
)፣ አስቀምጥ (post
) እና ሰርዝ (delete
) ዘዴወች አንድ አይነት ጥለትን እንደሚከተል ያሳያል።
test/integration/teteqamis_edit_test.rb
require 'test_helper'
class TeteqamisEditTest < ActionDispatch::IntegrationTest
def setup
@teteqami = teteqamis(:michael)
end
test "ያልተሳካ እርማት" do
get edit_teteqami_path(@teteqami)
assert_template 'teteqamis/edit'
patch teteqami_path(@teteqami), params: { teteqami: { sim: "",
emelekt: "werqayehu@yalbeqa",
password: "werqayehu",
password_confirmation: "haylie" } }
assert_template 'teteqamis/edit'
end
end
በዚህ ጊዜ የፈተና ስብስቡ አረንጓዴመሆን አለበት:-
$ rails test
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
አሁን የእርማት ቅጹ እንዲሰራ የምናደርግበት ጊዜ ነው፡፡ የምስል ሰቀላውን ስራ በግራቫታር የድር ጣቢያ ጫንቃ ላይ ስለጣልን፣ የመገለጫ ምስሎችን ማረሙ ቀድሞውንም ተግባራዊ ሁኗል፤ በምስል 10.2 ላይ እንደሚታየው፣ በምስል 10.4 ላይ የግራቫታር ጣቢያውን በአንድ አዲስ ትር ውስጥ የሚከፍተውን የ “ለውጥ” አገናኝን ጠቅ በማድረግ አምሳያውን ማረም እንችላለን (በአዲስ ትር የሚከፈተው በዝርዝር 10.2 ላይ ባለው የ‘ኢላማ="_ባዶ" (target="_blank"
) ትእዛዝ ምክንያት ነው)፡፡ እስኪ የተቀረው የተጠቃሚ እርማት እንዲሰራ ለማድረግ ስራችንን እንቀጥል፡፡
መፈተንን የበለጠ እየለመዳችሁት በምትመጡበት ጊዜ፣ የአፕኪኬሽኑን ኮድ ከመጻፍ ይልቅ በፊት፣ የውህደት ፈተናውን መጻፉ ጠቃሚ መሆኑን ልትገነዘቡ ትችሉ ይሆናል። በዚህ አውድ ውስጥ፣ አንድ እንደዚህ መሆን አለበት የተባለ ገጸባህሪን፣ መቼ ልክ እንደተሟላ ገጸባህሪ ተደርጎ ተቀባይነት እንደሚኖረው ስለሚወስኑ፤ እንደነዚህ ያሉት ፈተናወች አንዳንድ ጊዜ ቅብል ፈተናወች (Acceptance Tests) በመባል ይታወቃሉ፡፡ ይህ እንዴት እንደሚሰራ ለመመልከት፣ ፈ.መ.ብን በመጠቀም የተጠቃሚ እርማት ገጸባህሪን እናጠናቅቃለን።
በዝርዝር 10.9 ውስጥ ከሚታየው ፈተና ጋር የሚመሳሰል ፈተናን በመጻፍ የተጠቃሚዎች ዝመና ትክክለኛ ባህሪን እንፈትናለን፣ በዚህ ጊዜ ብቁ መረጃን ብቻ እናስረክባለን፡፡ ከዚያ አንድ ባዶ ያልሆነ የብልጪታ መልእክት መኖሩን እና የአንድ የተሳካ የመገለጫ ገጽ ማዟዟርን እናረጋግጣለን፣ እንዲሁም የተጠቃሚው መረጃ በውሂበጎታው ውስጥ በትክክል እንደተለወጠ እናረጋግጣለን። ውጤቱም በዝርዝር 10.11 ውስጥ ይታያል፡፡ በዝርዝር 10.11 ውስጥ ያሉት መሕለፈቃሎች እና ማረጋገጫዎች ባዶ መሆናቸውን ልብ በሉ፣ ይህም ሁልጊዜ ስማቸውን እና የኤመልእክት አድራሻዎቻቸውን በሚያዘምኑበት ጊዜ መሕለፈቃላቸውን ማዘመን ለማይፈልጉ ተጠቃሚዎች አመች ነው፡፡ በተጨማሪም ከውሂበጎታው የተጠቃሚውን ዋጋዎች በድጋሜ ከውሂበጎታው አምጥቶ ለመጫን እና በተሳካ ሁኔታ እንደተዛመኑ ለማረጋገጥ የ‘ተጠቃሚ.እንደገናጫን (@teteqami.reload
) (ለመጀመርያ ጊዜ በክፍል 6.1.5 ውስጥ የታየውን) መጠቀምን አስተውሉ። (እንደዚህ ዓይነት ዝርዝሮችን በመጀመርያ በቀላሉ ልትረሷቸው ትችላላችሁ፤ ለዚህም ነው በነዚህ ሁለት የፈተና አሰራሮች ላይ ማለት በቅብል ፈተናወች እና በፈ.መ.ብ ላይ ውጤታማ ለመሆን አንድ የተወሰነ ደረጃ ልምድ የሚያስፈልገው፡፡)
test/integration/teteqamis_edit_test.rb
require 'test_helper'
class TeteqamisEditTest < ActionDispatch::IntegrationTest
def setup
@teteqami = teteqamis(:michael)
end
.
.
.
test "ስኬታማ እርማት" do
get edit_teteqami_path(@teteqami)
assert_template 'teteqamis/edit'
sim = "Kebede Kassa"
emelekt = "kebede@kassa.com"
patch teteqami_path(@teteqami), params: { teteqami: { sim: sim,
emelekt: emelekt,
password: "",
password_confirmation: "" } }
assert_not flash.empty?
assert_redirected_to @teteqami
@teteqami.reload
assert_equal sim, @teteqami.sim
assert_equal emelekt, @teteqami.emelekt
end
end
በዝርዝር 10.12 እንደታየው፣ በዝርዝር 10.11 ውስጥ ያሉትን ፈተናወች ለማሳለፍ የሚያስፈልገው የ‘አዘምን (update
) ተግባር ከ‘ፍጠር (create
) ተግባር የመጨረሻ ቅፅ ጋር ተመሳሳይ ነው (ዝርዝር 8.32)።
update
) ተግባር። ቀይ app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
.
.
.
def update
@teteqami = Teteqami.find(params[:id])
if @teteqami.update(teteqami_negariaseitoch)
flash[:success] = "መገለጫው ተዘምኗል"
redirect_to @teteqami
else
render 'edit'
end
end
.
.
.
end
በዝርዝር 10.12 መግለጫ ጽሑፍ ላይ እንደተመለከተው፣ የፈተና ስብስቡ አሁንም ቀይነው፣ ይህም በመሕለፈቃል ርዝመት ማስረገጫ (ዝርዝር 6.43) ያለማለፍ ውጤት ነው፣ ይህም በዝርዝር 10.11 ላይ ባዶ ለሆነ የመሕለፈቃል እና የመሕለፈቃል ማረጋገጫ ስላለ ነው፡፡ ፈተኖቹን አረንጓዴለማድረግ መሕለፈቃሉ ባዶ ቢሆንም ተቀባይነት እንዲኖረው፣ በመሕለፈቃል ማስረገጫው ላይ አንድ ተስኖት ማድረግ አለብን፡፡ ይህንንም በዝርዝር 10.13 ላይ እንደተመለከተው፣ የ‘ምንም_ፈቀዳ: እውነት (allow_nil: true
) አማራጪን ከ‘አስረግጥ (validates
) ጋር በማዘጋጀት ተግባራዊ ማድረግ እንችላለን፡፡
app/models/teteqami.rb
class Teteqami < ApplicationRecord
attr_accessor :zkre_ysmula
before_save { self.emelekt = emelekt.downcase }
validates :sim, presence: true, length: { maximum: 50 }
BQU_YE_EMELEKT_MEDEBEGNA_HISABEHEREG = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :emelekt, presence: true, length: { maximum: 255 },
format: { with: BQU_YE_EMELEKT_MEDEBEGNA_HISABEHEREG },
uniqueness: true
has_secure_password
validates :password, presence: true, length: { minimum: 6 }, allow_nil: true
.
.
.
end
አጋጣሚ ዝርዝር 10.13 አዲስ ተጠቃሚዎችን በባዶ መሕለፈቃል እንዲመዘገቡ ሊፈቅድ ይችላል ብላችሁ ከሰጋችሁ፣ ጥብቅ_መሕልፈቃል_አለው (has_secure_password
) በተለይ ምንም (nil
) የሆኑ መሕለፈቃሎችን የሚይዝ አንድ የተለየ ማስረገጫን እንደሚያካትት ክፍል 6.3.3 ላይ እንዳየን አስታውሱ፡፡ (ምንም (nil
) የሆኑ መሕለፈቃሎች አሁን ዋናውን የመኖር ማስረገጫን በማለፍ ላይ ቢሆኑም፣ አሁንም ግን በ‘ጥብቅ_መሕልፈቃል_አለው (has_secure_password
) ይያዛሉ፣ ይህም በተጨማሪ በክፍል 7.3.3 የተጠቀሰውን የተባዛ የስህተት መልእክትንም ያስተካክላል።)
በዚህ ክፍል ውስጥ ካለው ኮድ ጋር፣ የተጠቃሚው የእርማት ገጽ እየሰራ መሆን አለበት (ምስል 10.5)፣ ይህንንም የፈተና ስብስቡን በድጋሜ በማስኬድ ማረጋገጥ ትችላላችሁ፣ እሱም አሁን አረንጓዴመሆን አለበት፡-
$ rails test
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
በዚህ ክፍል ውስጥ፣ የተጠቃሚ ተግባሮችን ከማገባደዳችን በፊት፣ ከአንድ ተጠቃሚ ይልቅ ሁሉንም ተጠቃሚዎች ለማሳየት የተቀየሰውን የ‘ማውጫ (index
) ተግባርን እናክላለን፡፡ በዚህ ሂደት ላይ፣ ውሂበጎታውን እንዴት አድርገን በናሙና ተጠቃሚዎች መዝራት እንደምንችል እና የማውጫ ገጹ ብዙ ተጠቃሚዎችን ለማሳየት እንዲችል፣ የተጠቃሚወች ውጽዓትን እንዴት አድርገን ገጸቁጥር (Paginate) እንደምናደርግ እንማራለን፡፡ ይህንን ውጤት የሚያሳየው ስእላዊ መግለጫ፣ የተጠቃሚወች የገጸቁጥር አገናኞችን እና አንድ የ“ተጠቃሚዎች” ዳሳሽ አገናኝን አካቶ በምስል 10.8 ላይ ይታያል። በክፍል 10.4 ውስጥ በተጠቃሚዎች ማውጫ ገጽ ላይ አንድ የአስተዳደር በይነገጽን እናክላለን፤ ስለሆነም ተጠቃሚዎችም እንዲሁ ሊጠፉ ይችላሉ።
የተጠቃሚዎች ማውጫ ስራን ለመጀመር፣ በመጀመሪያ አንድ የጥበቃ ቅርጸትን ተግባራዊ እናደርጋለን፡፡ ምንም እንኳን የእያንዳንዱ ተጠቃሚ የማሳያ (show
) ገጽ በሁሉም የጣቢያው ጎብኝዎች የሚታይ ቢሆንም፤ የተጠቃሚ ማውጫ (index
) ገጽ ግን፣ በጣቢያው ላይ ለተመዘገቡ/ለገቡ ተጠቃሚዎች ብቻ በመፍቀድ እና በጣቢያው ላይ ላልተመዘገቡ ሰወች ደግሞ፣ ምን ያህል የተጠቃሚዎች ዝርዝር ብዛትን ማየት እንደሚችሉ ገደብ በማድረግ በነባሪነት ሊያዩት የሚችሉትን የተጠቃሚዎች ዝርዝር እናቀርብላቸዋለን።7
የ‘ማውጫ (index
) ገጹን ካልተፈቀደ ድርሻ ለመጠበቅ፣ የ‘ማውጫ (index
) ተግባር በትክክል ማዟዟሩን ለማረጋገጥ በመጀመሪያ አንድ አጪር ፈተና እናክላለን (ዝርዝር 10.34)።
index
) ተግባር ማዟዟሩን መፈተን። ቀይ test/controllers/teteqamis_controller_test.rb
require 'test_helper'
class TeteqamisControllerTest < ActionDispatch::IntegrationTest
def setup
@teteqami = teteqamis(:michael)
@lela_teteqami = teteqamis(:ermias)
end
test "አዲስ ማግኘት አለበት" do
get temezgeb_path
assert_response :success
end
test "ባልተገባ ጊዜ ማውጫው ማዟዟር አለበት" do
get teteqamis_path
assert_redirected_to gba_url
end
.
.
.
end
ከዚያ አንድ የ‘ማውጫ (index
) ተግባርን ማከል እና እሱን በ‘ግብ_ተጠቃሚ (gb_teteqami
) ቅድመአጣሪ በተጠበቁ ተግባሮች ዝርዝር ውስጥ ማካተት ብቻ ይኖርብናል (ዝርዝር 10.35)፡፡
index
) ተግባር አንድ የገባ ተጠቃሚን ማስፈለግ። አረንጓዴ app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
before_action :gb_teteqami, only: [:index, :edit, :update]
before_action :tkklegna_teteqami, only: [:edit, :update]
def index
end
def show
@teteqami = Teteqami.find(params[:id])
end
.
.
.
end
ሁሉንም ተጠቃሚዎች በዝርዝር ለማሳየት፣ ሁሉንም የጣቢያውን ተጠቃሚዎች በአንድ ተለዋዋጪ በመያዝ እና በእያንዳንዱ ተጠቃሚ ላይ በመመላለስ የተገኘውን ዋጋ በማውጫው ትይታ ላይ ማስፈር ይኖርብናል፡፡ በዝርዝር 10.36 ላይ እንደሚታየው፣ በጨዋታ አፕልኬሽኑ ላይ እንደምታስታውሱት፣ ለእንደዚህ ዓይነቱ ተመሳሳይ ተግባር (ዝርዝር 2.9)፣ ሁሉንም ተጠቃሚዎች ከውሂበጎታው ጎትቶ ለማውጣት የ‘ሁሉም.ተጠቃሚ (Teteqami.all
) ዘዴን እንደተጠቀምን እና ከውሂበጎታው የተገኘውን ውጤት በማውጫ ትይታ ለማሳየት፣ የ‘ሁሉም.ተጠቃሚ‘ን (Teteqami.all
) ዋጋ ለመያዝ አንድ @ተጠቃሚ (@teteqami
) የተባለ ቅርፀ ተለዋዋጪ እንደተጠቀምን ሁሉ፣ አሁንም ያንኑ ዘዴ ልንጠቀም እንችላለን፡፡ (በአንድ ጊዜ ሁሉንም ተጠቃሚዎች ማሳየቱ ጥሩ ሃሳብ አይደለም ካላችሁ አልተሳሳታችሁም፣ ይህንን ችግር በቅርቡ በክፍል 10.3.3 ላይ እናስወግደዋለን።)
index
) ተግባር። app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
before_action :gb_teteqami, only: [:index, :edit, :update]
.
.
.
def index
@teteqamis = Teteqami.all
end
.
.
.
end
ትክክለኛውን የማውጫ ገጽ ለመስራት፣ በተጠቃሚዎች ላይ የሚመላለስ እና እያንዳንዱን ተጠቃሚ በአንድ የ‘ዓይነት-ዘርዝር (li
) መለያ ውስጥ የሚጠቀልል አንድ ትይታ እንፈጥራለን፡፡ ይህንን ስራ ተግባራዊ የምናደርገው የ‘እያንዳንዳቸው (each
) ዘዴን በመጠቀም፣ ሁሉንም ነገር በአንድ የ‘ቁጥር-አልባ ዘርዝር (ul
) መለያ ውስጥ በማካተት፣ የእያንዳንዱን ተጠቃሚ ስም እና አምሳያ ገጹ ላይ በማሳየት ነው (ዝርዝር 10.37)፡፡
app/views/teteqamis/index.html.erb
<% provide(:title, 'ሁሉም ተጠቃሚዎች') %>
<h1 class="ራስጌ1">ሁሉም ተጠቃሚዎች</h1>
<ul class="ተጠቃሚዎች">
<% @teteqamis.each do |teteqami| %>
<li>
<%= amsaya_le teteqami, meten: 50 %>
<%= link_to teteqami.sim, teteqami %>
</li>
<% end %>
</ul>
በዝርዝር 10.37 ላይ ያለው ኮድ ክፍል 7.1.4.1 ላይ የተገኘውን ውጤት እና አሁን በዝርዝር 10.38 ውስጥ ከነባሪ የአምሳያ መጠን ይልቅ አንድ የተለየ የአምሳያ መጠንን በመምረጥ፣ አንድ ምርጫን እንድናሳልፍ የሚያስችለንን የአምሳያ ረጅ ኮድን ይጠቀማል። ያ የተሰጠውን መልመጃ ካልሰራችሁ፣ ወደ ሌላ ከመቀጠላችሁ በፊት የተጠቃሚ ረጅ ፋይላችሁ በዝርዝር 10.38 ውስጥ ባለው የኮድ ይዞታ ማዘመናችሁን አረጋግጡ። (በዝርዝር 7.13 ላይ እንደሚታየው፣ የሩቢ ስሪት ቁጥር 2.0 ዓይነቱን የአጻጻፍ ቅጥ መጠቀም ከፈለጋችሁም እሰየው!! ምርጫችሁ የተጠበቀ ነው፡፡)
amsaya_le
) ረጅ ውስጥ አንድ ምርጫዊ ተርታን ማከል። app/helpers/teteqamis_helper.rb
module TeteqamisHelper
# ለተሰጠው ተጠቃሚ አምሳያን ይመልሳል።
def amsaya_le(teteqami, meten: 80)
amsaya_meleya = Digest::MD5::hexdigest(teteqami.emelekt.downcase)
amsaya_aahaa = "https://secure.gravatar.com/avatar/#{amsaya_meleya}?s=#{meten}"
image_tag(amsaya_aahaa, alt: teteqami.sim, class: "አምሳያ")
end
end
እስኪ ለቅጥ የሚሆን ትንሽ ቅ.ቋን (ወይም ዓ.ቆ.ሉ.ቅን) እናክል (ዝርዝር 10.39)።
app/assets/stylesheets/bju.scss
.
.
.
/* የተጠቃሚዎች ማውጫ */
.ተጠቃሚዎች {
list-style: none;
margin: 0;
li {
overflow: auto;
padding: 10px 0;
border-bottom: 1px solid $gray-lighter;
}
}
በመጨረሻም፣ የ‘ተጠቃሚዎች_መንገድ‘ን (teteqamis_path
) በመጠቀም በጣቢያው ዳሳሽ ራስጌ ውስጥ በተጠቃሚዎች አገናኝ ላይ ዓ.አ.ሃ.አውን እናክላለን፣ በዚህም በሰንጠረዥ 7.1 ውስጥ ጥቅም ላይ ያልዋለውን የመጨረሻውን ስዩም ማዘዋወርያ ተጠቀምን ማለት ነው፡፡ ውጤቱ በዝርዝር 10.40 ውስጥ ይታያል፡፡
app/views/layouts/_rasgie.html.erb
<header class="navbar navbar-fixed-top navbar-inverse">
<div class="container">
<%= link_to "ማሳያ አፕልኬሽን", root_path, id: "አርማ" %>
<nav>
<ul class="nav navbar-nav navbar-right">
<li><%= link_to "መነሻ", root_path %></li>
<li><%= link_to "እርዳታ", erdata_path %></li>
<% if gebtual? %>
<li><%= link_to "ተጠቃሚወች", teteqamis_path %></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
መለያ <b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><%= link_to "መገለጫ", ahun_teteqami %></li>
<li><%= link_to "ዝግጅቶች", edit_teteqami_path(ahun_teteqami) %></li>
<li class="divider"></li>
<li>
<%= link_to "ይውጡ", wta_path, method: :delete %>
</li>
</ul>
</li>
<% else %>
<li><%= link_to "ይግቡ", gba_path %></li>
<% end %>
</ul>
</nav>
</div>
</header>
በዚያ፣ የተጠቃሚዎች ማውጫ ሙሉ በሙሉ በመስራት ላይ እና ፈተናወቹም እንደሚከተለው አረንጓዴቢሆኑም:-
$ rails test
በሌላ በኩል ግን በምስል 10.9 ላይ እንደሚታየው፣ ብቸኛ መሆን ትንሽ… ያሳዝናል፡፡ እስኪ ይሄን አሳዛኝ ሁኔታ አብረን እንፍታ።
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
gba_ende
) ረጅን ተጠቀሙ እና በዝርዝር 5.32 ውስጥ የተዘረዘሩትን ሂደቶች በመከተል ፈተኖቹን መጻፍ ትችላላችሁ፡፡
በዚህ ክፍል ውስጥ ጓደኛ አልባ የሆነውን እንኮ ተጠቃሚ ትንሽ ጓደኞች እንጨምረዋለን (የምን ብቸኝነት ነው)፡፡ በእርግጥ በቂ የሆኑ ተጠቃሚዎችን በማውጫ ገጹ ላይ ለማስፈር ድርአሳሽ ላይ ያለውን የመመዝገቢያ ቅጽ በመጠቀም አንድ ባንድ አዲስ ተጠቃሚዎችን በእጅ መፍጠር ይቻላል፣ ነገር ግን ከዛ እጅግ የተሻለው መፍትሔ ተጠቃሚዎቹን ለእኛ እንዲፈጥርልን ሩቢን መጠቀም ነው፡፡
በመጀመሪያ፣ የአስመሳይ (Faker) እንቁን በ‘እንቁፋይል (Gemfile
) ውስጥ እናክላለን፣ ይህም የናሙና ተጠቃሚዎችን ከፊል-ተጨባጪነት ካላቸው ስሞች እና የኤመልእክት አድራሻዎች ጋር እንድንፈጥር ያስችለናል (ዝርዝር 10.42)።8 (ብዙውን ጊዜ አስመሳይ
እንቁን በአንድ ማበልጸጊያ አካባቢ ብቻ መጠቀሙ የተለመደ ስለሆነ እናንተም እንደዛ ልታደርጉ ትፈልጉ ይሆናል፣ ያም መልካም ነው፣ ነገር ግን አፕልኬሽናችንን በተመለከተ በምርት ጣቢያችን ላይም እንጠቀምበታለን (ክፍል 10.5)፡፡)
Gemfile
) ውስጥ ማከል።
source 'https://rubygems.org'
gem 'rails', '6.1.4.1'
gem 'bcrypt', '3.1.13'
gem 'faker', '2.11.0'
gem 'bootstrap-sass', '3.4.1'
.
.
.
ከዚያ እንደተለመደው አድርጎ መጫን ነው:-
$ bundle _2.2.17_ install
ቀጥሎም፣ ሬይልስ ለእንደዚህ ዓይነት ውሂብ ማስቀመጫ ባዘጋጀው የ‘ውጎ/ዘሮች.አርቢ (db/seeds.rb
) ፋይል ውስጥ፣ ውሂበጎታው ውስጥ የናሙና ተጠቃሚዎችን ለመዝራት አንድ የሩቢ ፕሮግራምን እናክላለን፡፡ ውጤቱ በዝርዝር 10.43 ውስጥ ይታያል፡፡ (በዝርዝር 10.43 ውስጥ ያለው ኮድ ትንሽ ረቀቅ ያለ ነው፤ ስለሆነም እያንዳንዱ ኮድ ምን እንደሚያደርግ በዝርዝር ለማወቅ ብዙ መጨነቅ አይኖርባችሁም።)
db/seeds.rb
# አንድ ዋና የናሙና ተጠቃሚን መፍጠር።
Teteqami.create!(sim: "Abnetawi Teteqami",
emelekt: "example@railstutorial.org",
password: "kebekasa",
password_confirmation: "kebekasa")
# መአት ተጠቃሚዎችን ማመንጨት።
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)
end
በዝርዝር 10.43 ውስጥ ያለው ኮድ ካሁን በፊት ውሂበጎታው ውስጥ የነበረውን ብቸኛ ተጠቃሚ በአዲስ ስም እና የኤመልእክት አድራሻ በመተካት፤ ከዚያም 99 አዲስ ተጠቃሚዎችን እስከ ስማቸው እና የኤመልእክት አድራሻቸው ጋር ይጨምራል (በጠቅላላው 100 ተጠቃሚዎችን በውሂበጎታው ውስጥ ይፈጥራል)። የ‘ፍጠር! (create!
) ዘዴ አሰራሩ ልክ እንደ ፍጠር (create
) ዘዴ ነው፤ ብቁ ላልሆነ ተጠቃሚ ሃሰት‘ን (false
) ከመመለስ ይልቅ፣ አንድ ልዩነትን (ክፍል 6.1.4) የሚያነሳ ካልሆነ በስተቀር፡፡ ይህ ባህሪ ዝምተኛ ስህተቶችን በማስወገድ ማረምን ቀላል እንዲሆን ያደርገዋል።
እንደ ዝርዝር 10.43 ባለ ኮድ፣ ውሂበጎታውን ዳግም ማስጀመር እና በመቀጠል ውጎ:ዝራ‘ን (db:seed
) በመጠቀም በዝርዝር 10.43 ውስጥ ያለውን ኮድ መጥራት እንችላለን:-9
$ rails db:migrate:reset
$ rails db:seed
ውሂበጎታው ውስጥ የተጠቃሚዎች ውሂብን የመዝራቱ ሂደት በጣም የቀለጠፈ ላይሆን ይችላል፣ እናም በአንዳንድ ስርዓቶች ላይ ውሂቡ ውሂበጎታው ውስጥ እስኪሰፍር ድረስ ጥቂት ደቂቃዎችን ሊወስድ ይችላል። ደግሞም አንዳንድ አንባቢዎች፣ የሬይልስ አገልጋይ በመስራት ላይ እያለ ውሂበጎታውን ዳግም ለማስጀመር የ‘ውጎ:አፍልስ:ዳግምአስጀምር (db:migrate:reset
) ትእዛዝን ማስኬድ እንዳልቻሉ ዘገባ አቅርበዋል፤ ስለዚህ ይህ ችግር ካጋጠማችሁ መጀመሪያ የሬይልስ አገልጋይን ማቆም ሊኖርባችሁ ይችላል (ሳጥን 1.2)፡፡
ሬይልስ ውጎ:ዳግምአስጀምር‘ን (rails db:reset
) ካስኬድን በኋላ፣ አፕልኬሽናችን 100 የናሙና ተጠቃሚዎች ሊኖሩት ይገባል፡፡ ምስል 10.10 እንደሚታየው፣ የመጀመሪያዎቹን ጥቂት ተጠቃሚዎች የኤመልእክት አድራሻቸውን ከአምሳያቸው ጋር በማዛመድ በነባሪ ከመጡት አምሳያወች የተለዩ እንዲሆኑ አድርጊያቸዋለሁ።
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
የመጀመሪያው ተጠቃሚያችን አሁን በብቸኝነት አይሰቃይም፣ ነገር ግን በተቃራኒው አሁን ብዙ ጓደኞች ስላሉት አንድ የሆነ ችግር ፈጥረውብናል፤ ችግሩም የዚህ ተጠቃሚ ጓደኞች በሙሉ በአንድ ገጽ ላይ ፈጠው መታየታቸው ነው፡፡ አሁን በዚህ ጣቢያ ውስጥ አንድ መቶ ተጠቃሚዎች አሉ፣ ይህም አንድ ማበልጸጊያ ላይ ላለ ጣቢያ በቂ የሆነ የተጠቃሚ ብዛት ቢሆንም፣ በአንድ የምርት ጣቢያ ላይ ግን በሽወች የሚቆጠሩ ተጠቃሚዎች ሊኖሩ ይችላሉ። ለዚህ ችግር መፍትሔው ተጠቃሚዎቹን ገጸቁጥር ማድረግ ነው፣ ስለሆነም በሆነ ጊዜ በአንድ ገጽ ላይ ለምሳሌ 30 ተጠቃሚዎች ብቻ እንዲታዩ ማድረግ እንችላለን።
በሬይልስ ውስጥ በርካታ የገጸቁጥር ዘዴወች አሉ፤ በጣም ቀላል እና በጣም ቀልጣፋ የሆነውን ዊል_ገጽቁጥርስጥ (will_paginate) የተባለውን ዘዴ እንጠቀማለን፡፡ እሱን ለመጠቀም ዊል_ገጽቁጥርስጥ (will_paginate)
የተባለውን እንቁን እና ቡትስትራፕ ገጸቁጥርን ቅጥ ለማድረግ እንዲጠቀምበት የሚያዋቅርለትን የ‘ቡትስትራፕ-ዊል_ገጸቁጥር (bootstrap-will_paginate)
እንቁን በጀም ፋይል ውስጥ ማካተት ይኖርብናል፡፡ የዘመነው የ‘እንቁፋይል (Gemfile
) በዝርዝር 10.4410 ውስጥ ይታያል፡፡
Gemfile
) ውስጥ የ‘ዊል_ገጽቁጥርስጥ (will_paginate)
እንቁን ማከል።
source 'https://rubygems.org'
gem 'rails', '6.1.4.1'
gem 'bcrypt', '3.1.13'
gem 'faker', '2.11.0'
gem 'will_paginate', '3.3.0'
gem 'bootstrap-will_paginate', '1.0.0'
.
.
.
ከዚያ ጠቅል-ጫንን (bundle install
) አስኪዱ:-
$ bundle _2.2.17_ install
እንዲሁም አዲሶቹ እንቁወች በትክክል መጫናቸውን ለማረጋገጥ፤ የድር አገልጋዩን እንደገና ማስጀመር አለባችሁ።
ገጸቁጥር ስራውን እንዲጀምር፣ ትንሽ ኮዶችን በማውጫው ትይታ ላይ በማከል ሬይልስን ተጠቃሚዎችን ገጸቁጥር እንዲያደርግላቸው እንነግረዋለን፣ እናም በ‘ማውጫ (index
) ተግባር ውስጥ ያለውን የ‘ሁሉም.ተጠቃሚ (Teteqami.all
) ዘዴን ስለ ገጸቁጥር በሚያውቅ አንድ ቁስ መተካት ይኖርብናል፡፡ ልዩውን የ‘ዊል_ገጽቁጥርስጥ (will_paginate
) ዘዴ ከቀዳሚ እና ከቀጣይ መለዮ አማራጪ ተርታ ጋር በትይታው ላይ (ዝርዝር 10.45) በማከል እንጀምራለን። ይህንን ኮድ ለምን ከተጠቃሚዎች ዝርዝር በታች እና በላይ እንዳደረግነው ከትንሽ ጊዜ በኋላ እናያለን፡፡
app/views/teteqamis/index.html.erb
<% provide(:title, 'ሁሉም ተጠቃሚዎች') %>
<h1 class="ራስጌ1">ሁሉም ተጠቃሚዎች</h1>
<%= will_paginate :previous_label => "ቀዳሚ", :next_label => "ቀጣይ" %>
<ul class="ተጠቃሚዎች">
<% @teteqamis.each do |teteqami| %>
<li>
<%= amsaya_le teteqami, meten: 50 %>
<%= link_to teteqami.sim, teteqami %>
</li>
<% end %>
</ul>
<%= will_paginate :previous_label => "ቀዳሚ", :next_label => "ቀጣይ" %>
ማሳሰቢያ:- እዚህ ላይ የገጸቁጥሩ ገጽ መቀየሪያ በአማርኛ ይሆንል ዘንድ፣ ለ previouslabel
አማራጪ ቀዳሚ
እና ለ nextlabel
አማራጪ ደግሞ ቀጣይ
የተባለ ሃረግን እንዳሳለፍን ልትገነዘቡ ይገባል።
የ‘ዊል_ገጽቁጥርስጥ (will_paginate
) ዘዴ ትንሽ አስማታዊ ነው፤ በ‘ተጠቃሚዎች (teteqamis
) ትይታ ውስጥ የ‘@ተጠቃሚዎች (@teteqamis
) ቁስን በራስሰር ይፈልግ እና ከዚያ ሌሎች ገጾችን ለመድረስ የገጸቁጥር አገናኞችን ያሳያል። ሆኖም በዝርዝር 10.45 ውስጥ ያለው ትይታ ገና አይሰራም፣ ምክንያቱም በአሁኑ ጊዜ የ‘@ተጠቃሚዎች (@teteqamis
) ተለዋዋጪ የ‘ሁሉም.ተጠቃሚ (Teteqami.all
) ውጤትን ስለሚይዝ (ዝርዝር 10.36) ሲሆን፣ ዊል_ገጽቁጥርስጥ (will_paginate
) ደግሞ ውጤቶቹን በትክክል ለማሳየት የ‘ገጽቁጥርስጥ (paginate
) ዘዴን እንድንጠቀም ስለሚያስፈልግ ነው:-
$ rails console
>> Teteqami.paginate(page: 1)
Teteqami Load (1.5ms) SELECT "teteqamis".* FROM "teteqamis" LIMIT 11 OFFSET 0
(1.7ms) SELECT COUNT(*) FROM "teteqamis"
=> #<ActiveRecord::Relation [#<Teteqami id: 1,...
>> Teteqami.paginate(page: 1).length
Teteqami Load (3.0ms) SELECT "teteqamis".* FROM "teteqamis" LIMIT ? OFFSET?
[["LIMIT", 30], ["OFFSET", 0]]
=> 30
የ‘ገጽቁጥርስጥ (paginate
) ዘዴ :ገጽ (:page
) የተባለ ቁልፍ እና ዋጋው ደግሞ ከተጠየቀው ገጽ ጋር እኩል የሆነ አንድ የተርታ ነጋሪአሴትን እንደሚወስድ አስተውሉ፡፡ ተጠቃሚ.ገጽቁጥርስጥ (Teteqami.paginate
) በ‘:ገጽ (:page
) ሰሚአሴት ዋጋ ላይ በመመርኮዝ ከውሂበጎታው ውስጥ በአንድ ጊዜ የተወሰኑ ተጠቃሚዎችን ጎትቶ ያወጣል (በነባሪነት 30 ተጠቃሚዎችን ጎትቶ ያወጣል)፡፡ ስለዚህ ለምሳሌ:- ገጽ 1 (የመጀመሪያው ገጽ) ከተጠቃሚ 1–30 ሲሆን ገጽ 2 (ሁለተኛው ገጽ) ደግሞ ከተጠቃሚ 31–60 እያለ ይቀጥላል ማለት ነው፡፡ የ‘ገጽ (page
) ዋጋ ምንም (nil
) ከሆነ የ‘ገጽቁጥርስጥ (paginate
) ዘዴ የመጀመሪያውን ገጽ ይመልሳል/ያቀርባል (ይህ ማለት ባጪሩ የሚዘረዘር ቀጣይ ገጽ ከሌለ የመጀመሪያውን ገጽ ያቀርባል ማለት ነው)፡፡ (ከዚህ በላይ ያለው የሰሌዳ ውጤት፣ ንቅ መዝገብ ራሱ ባደረገው ውሳኔ ምክንያት ከ 30 ይልቅ የ 11 ተጠቃሚዎች ውጤትን ያሳያል፣ ነገር ግን የ‘እርዝመት (length
) ዘዴን በመጠቀም ይህንን በንቅ መዝገብ የተደረገ ውሳኔን በመጣስ በአንድ ገጽ ላይ 30 ተጠቃሚዎችን ማየት እንችላለን።)
የ‘ገጽቁጥርስጥ (paginate
) ዘዴን ለመጠቀም በ‘ማውጫ (index
) ተግባር ውስጥ በ‘ሁሉም (all
) ምትክ የ‘ገጽቁጥርስጥ (paginate
) ዘዴን በመጠቀም፣ የማሳያ አፕልኬሽኑን ተጠቃሚዎች ገጸቁጥር ማድረግ እንችላለን (ዝርዝር 10.46)፡፡ እዚህ ጋር የ‘ገጽ (page
) ሰሚአሴት የመጣው ከ‘ሰሚአሴቶች[:ገጽ] (params[:page]
) ሲሆን፣ ይህም ከ‘ዊል_ገጽቁጥርስጥ (will_paginate
) በራስሰር የመነጨ ነው፡፡
index
) ተግባር ውስጥ ተጠቃሚወችን ገጸቁጥር ማድረግ። app/controllers/teteqamis_controller.rb
class TeteqamiController < ApplicationController
before_action :gb_teteqami, only: [:index, :edit, :update]
.
.
.
def index
@teteqamis = Teteqami.paginate(page: params[:page])
end
.
.
.
end
በምስል 10.11 ላይ እንደሚታየው፣ የተጠቃሚዎች ማውጫ ገጹ አሁን መስራት ይኖርበታል፡፡ (በአንዳንድ ስርዓቶች ላይ የሬይልስ አገልጋዩን አቁማችሁ እንደገና ማስጀመር ሊኖርባችሁ ይችል ይሆናል፡፡) በማውጫ ገጹ ውስጥ ዊል_ገጽቁጥርስጥ‘ን (will_paginate
) ከተጠቃሚው ዝርዝር በላይ እና በታች ስላደረግን፣ አሁን ገጸቁጥሮቹ እስከነ አገናኛቸው ከላይ እና ከታች ይታያሉ፡፡
በምስል 10.12 ላይ እንደሚታየው 2 ቁጥር ወይም “ቀጣይ” የሚለውን አገናኝ ላይ አሁን ጠቅ ብታደርጉ፣ የሁለተኛውን ገጽ ውጤት ታገኛላችሁ።
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
nil
) በማዘጋጀት፣ የመጀመሪያው ገጽ ተጠቃሚዎችን ጎትቶ እንደሚያወጣ አረጋግጡ፡፡
Teteqami.all
) የሩቢ ክፍል አባል ጋር ሲነጻጸርስ?
አሁን የተጠቃሚዎች ማውጫ ገጻችን እየሰራ ስለሆነ፣ አንድ ቀለል ያለ ፈተና እንጽፋለን፤ ክፍል 10.3.3 ላይ ላለው ገጸቁጥርም እንደዚሁ አነስተኛ ፈተናን እንጽፋለን። ሃሳቡ መጀመሪያ ወደ ድሩ መግባት፣ ከዚያ የማውጫ መንገዱን መጎብኘት፣ ከዚያ የተጠቃሚዎች የመጀመሪያ ገጽ እና ገጸቁጥር እንዳለ ማረጋገጥ ይሆናል፡፡ እነዚህ የመጨረሻ ሁለት ሂደቶች ተግባር ላይ ይውሉ ዘንድ፣ ገጸቁጥርን ለመጥራት፣ በፈተና ውሂበጎታችን ውስጥ ቢያንስ ቢያንስ ከ 30 በላይ የሚሆኑ ተጠቃሚዎች ሊኖሩን ይገባል፡፡
በዝርዝር 10.23 ላይ በእቃወች ፋይል ውስጥ አንድ ሁለተኛ ተጠቃሚን ፈጥረን ነበር፣ ነገር ግን 30 ወይም ከዚያም በላይ የሆኑ ተጠቃሚዎችን በእጅ መፍጠሩ ትንሽ ይከብዳል፡፡ እንደ እድል ሆኖ ግን፣ በእቃወች ፋይል ውስጥ ለእቃ ተጠቃሚ የ‘መሕለፈቃል_ፈጪ (password_digest
) ባሕሪ ላይ እንዳየነው፣ የእቃ ፋይሎች ክት ሩቢን ይደግፋሉ፣ ይህ ማለትም ልክ በዝርዝር 10.47 ውስጥ እንደሚታየው፣ 30 ተጨማሪ ተጠቃሚዎችን መፍጠር እንችላለን ማለት ነው፡፡ (ዝርዝር 10.47 ለወደፊቱ የሚያገለግሉ ሌሎች ሁለት የተሰየሙ ተጠቃሚዎችንም ፈጥሯል።)
test/fixtures/teteqamis.yml
michael:
sim: Micheal Abnet
emelekt: michael@misalei.com
password_digest: <%= Teteqami.fech('mehlefeqal') %>
ermias:
sim: Ermias Leake
emelekt: duchess@example.gov
password_digest: <%= Teteqami.fech('mehlefeqal') %>
gerie:
sim: Tomas Gerie
emelekt: hands@example.gov
password_digest: <%= Teteqami.fech('mehlefeqal') %>
abeba:
sim: Abeba Melake
emelekt: boss@example.gov
password_digest: <%= Teteqami.fech('mehlefeqal') %>
<% 30.times do |n| %>
teteqami_<%= n %>:
sim: <%= "Teteqami #{n}" %>
emelekt: <%= "teteqami-#{n}@example.com" %>
password_digest: <%= Teteqami.fech('mehlefeqal') %>
<% end %>
በዝርዝር 10.47 ውስጥ ከተበየኑት እቃወች ጋር፣ አሁን የተጠቃሚዎች ማውጫ ፈተናን ለመጻፍ ዝግጁ ነን፡፡ በመጀመሪያ የሚከተለውን ትእዛዝ በመጠቀም አስፈላጊውን የፈተና ፋይል እናመነጫለን:-
$ rails generate integration_test teteqamis_index
invoke test_unit
create test/integration/teteqamis_index_test.rb
ፈተናው የተጠቃሚዎች የመጀመሪያ ገጽ መገኘቱን እና በዛው ገጽ ላይ እንደተጠበቀው ገጸቁጥር (pagination
) የተባለ ክፍልን የያዘ አንድ የ‘ክፍሊት (div
) መለያ መኖሩን ማረጋገጠንም ያሳትፋል፡፡ ውጤቱ በዝርዝር 10.48 ውስጥ ይታያል፡፡
test/integration/teteqamis_index_test.rb
require 'test_helper'
class TeteqamisIndexTest < ActionDispatch::IntegrationTest
def setup
@teteqami = teteqamis(:michael)
end
test "ማውጫ ገጸቁጥርን ጨምሮ" do
gba_ende(@teteqami)
get teteqamis_path
assert_template 'teteqamis/index'
assert_select 'div.pagination'
Teteqami.paginate(page: 1).each do |teteqami|
assert_select 'a[href=?]', teteqami_path(teteqami), text: teteqami.sim
end
end
end
የፈተና ስብስቡ ውጤት አረንጓዴ መሆን አለበት:-
$ rails test
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
will_paginate
) ጥሪ ላይ ብቻ አስተያየት ብታደርጉ፣ አሁንም ፈተናው አረንጓዴእንደሚሆን አረጋግጡ። የሁለቱም የ‘ዊል_ገጽቁጥርስጥ (will_paginate
) አገናኞች መኖራቸውን እንዴት መፈተን ይቻላል? ጠቃሚ ፍንጪ:- ሰንጠረዥ 5.2 ላይ የሚገኘውን የ‘ቁጠር (count
) ዘዴን ተጠቀሙ።
ገጸቁጥር የተደረገለት የተጠቃሚዎች ማውጫ አሁን ተጠናቋል፣ ነገር ግን አንድ ሳላደርገው ማለፍ የማልፈልገው ማሻሻል አለ፤ ሬይልስ በጣም አስገራሚ የሆኑ፣ የተጠቀጠቁ ትይታዎችን መስሪያ አገልግሎት ላይ የሚውሉ መሳሪያዎች አሉት፣ እናም በዚህ ክፍል እነዚህን መሳሪያዎች እንዲጠቀም የማውጫ ገጹን እናጣራዋለን፡፡ ኮዳችን በጥሩ ሁኔታ የተፈተነ ስለሆነ፣ የጣቢያውን ተግባራት መስበር እንደማንችል እርግጠኞች በመሆን ኮዱን ማጣራት እንችላለን፡፡
ኮዱን ለማጣራት የመጀመሪያው ሂደት፣ በዝርዝር 10.45 ላይ የሚገኘውን የ‘ዓይነት-ዘርዝር (li
) መለያን በአንድ የ‘አቅርብ (render
) ጥሪ መተካት ይሆናል (ዝርዝር 10.50)፡፡
app/views/teteqamis/index.html.erb
<% provide(:title, 'ሁሉም ተጠቃሚዎች') %>
<h1 class="ራስጌ1">ሁሉም ተጠቃሚዎች</h1>
<%= will_paginate :previous_label => "ቀዳሚ", :next_label => "ቀጣይ" %>
<ul class="ተጠቃሚዎች">
<% @teteqamis.each do |teteqami| %>
<%= render teteqami %>
<% end %>
</ul>
<%= will_paginate :previous_label => "ቀዳሚ", :next_label => "ቀጣይ" %>
እዚህ ጋር የ‘አቅርብ (render
) ዘዴን የምንጠራው፣ አንድ የሃረግ ስምን የያዘ ከፊል ላይ ሳይሆን፤ ይልቁንስ በ‘ተጠቃሚ (Teteqami
) ክፍል በአንድ የ‘ተጠቃሚ (teteqami
) ተለዋዋጪ11 ላይ ነው፤ በዚህ አውድ ውስጥ ሬይልስ አንድ _ተጠቃሚ.ሃጽመቋ.ክሩ (_teteqami.html.erb
) የተባለ ፋይልን በአፕልኬሽኑ ውስጥ በራስሰር ይመለከታል፣ ስለዚህ ይህንን ፋይል መፍጠር ይኖርብናል (ዝርዝር 10.51)።
app/views/teteqamis/_teteqami.html.erb
<li>
<%= amsaya_le teteqami, meten: 50 %>
<%= link_to teteqami.sim, teteqami %>
</li>
ይህ በርግጠኝነት ትልቅ ለውጥ ቢሆንም፤ የ‘አቅርብ (render
) ዘዴን በቀጥታ በ‘@ተጠቃሚዎች (@teteqamis
) ተለዋዋጪ ላይ በመጥራት፣ ይህንን ከዚህ በበለጠ ልናሻሽለው እንችላለን (ዝርዝር 10.52)።
app/views/teteqamis/index.html.erb
<% provide(:title, 'ሁሉም ተጠቃሚዎች') %>
<h1 class="ራስጌ1">ሁሉም ተጠቃሚዎች</h1>
<%= will_paginate :previous_label => "ቀዳሚ", :next_label => "ቀጣይ" %>
<ul class="ተጠቃሚዎች">
<%= render @teteqamis %>
</ul>
<%= will_paginate :previous_label => "ቀዳሚ", :next_label => "ቀጣይ" %>
እዚህ ጋር ሬይልስ በተሰጠው የ‘@ተጠቃሚዎች (@teteqamis
) ተለዋዋጪ ማስረጃ ላይ በመመረኮዝ፣ ተጠቃሚ (Teteqami
) የተባለው ተለዋዋጪ አንድ የ‘ተጠቃሚ (Teteqami
) ቁስ ዝርዝሮችን የያዘ ተለዋዋጪ መሆኑን ያውቃል፤ በተጨማሪም፣ ይህ ቅርፀ ተለዋዋጪ (@ተጠቃሚዎች (@teteqamis
)) በአንድ የተጠቃሚዎች ክምችት ላይ ሲጠራ፣ በአባላቶቹ ላይ በራስሰር በመመላለስ የእያንዳንዱን አባል ውጤት በ_ተጠቃሚ.ሃጽመቋ.ክሩ (_teteqami.html.erb
) ከፊል ያቀርባል። (የክፍሉ ስም ላይ በመመርኮዝ የከፊሉን ስምም ያውቃል፡፡) የተገኘው ውጤትም በዝርዝር 10.52 ውስጥ ያለው የሚያስደንቅ ጥቅጥቅ ያለ ኮድ ነው።
ሁልጊዜ ኮድን ከማጣራት በኋላ፣ ሁሉ ነገር በትክክል እንደሚሰራ ለማረጋገጥ መፈተን እንደሚገባ ሁሉ፣ የአፕልኬሽኑን ኮድ ከመለወጥ በኋላም የፈተና ስብስቡ አሁንም አረንጓዴ መሆኑን ማረጋገጥ አለባችሁ:-
$ rails test
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
render
) መስመር ላይ አስተያየት አድርጉ እና የተገኙት ፈተናዎች ቀይመሆናቸውን አረጋግጡ፡፡
አሁን የተጠቃሚዎች ማውጫ ገጽ ተጠናቋል፣ ስለዚህ ከመደበኛ የው.ሁ.ማ ተግባር ስብስብ ካለ አጥፋ (destroy
) በስተቀር ሁሉንም የው.ሁ.ማ ተግባሮች ጨርሰናል ማለት ነው። በዚህ ክፍል ውስጥ በምስል 10.13 ስእላዊ መግለጫ ላይ እንደሚታየው፣ ተጠቃሚዎችን ለመሰርዝ አገናኞችን እናክል እና የመሰርዝ ሂደቱን ተግባር ላይ ለማዋል አስፈላጊውን የ‘አጥፋ (destroy
) ተግባርን እንበይናለን፡፡ ይህንን ተግባር ላይ ለማዋል ፍቃዱ ያላቸው የድሩ አስተዳዳሪወች ብቻ ተጠቃሚዎችን መሰርዝ ይችሉ ዘንድ፣ መጀመሪያ አንድ የአስተዳደር ተጠቃሚዎች ክፍልን እንፈጥራለን፡፡ በፈቀዳ አውድ ውስጥ፣ እንደዚህ ያለ ልዩ የመብት ስብስብ ሚና (Role) በመባል ይታወቃል፡፡
መብት የተሰጣቸው አስተዳዳሪወችን ከሌሎች ተራ ተጠቃሚዎች ለመለየት፣ በተጠቃሚ ቅርጸቱ ውስጥ አንድ የቡልየን ዋጋ የተሰጠው አስተዳዳሪ (astedadari
) የተባለ ባሕሪ ይኖረናል፤ ይህም ተጠቃሚው አስተዳዳሪ ነው ወይስ አይደለም ለማወቅ የሚያስችል አንድ አስተዳዳሪነውን? (astedadari?
) የተባለ የቡልየን ዘዴን በራስሰር እንድንጠቀም አንድ እድልን ይሰጠናል። ለዚህ ስራ የሚያበቃን የውሂብ ቅድ በምስል 10.14 ውስጥ ይታያል፡፡
እንደተለመደው፣ በማዘዥያ መስመሩ ላይ አንድ የ‘አስተዳዳሪ (astedadari
) ባሕሪን ከ boolean
የውሂብ ዓይነት ጋር አያይዘን አንድ ፍልሰት እናመነጫለን:-
$ rails generate migration add_astedadari_to_teteqamis astedadari:boolean
በዝርዝር 10.54 ላይ እንደሚታየው፣ ይህ ፍልሰት አስተዳዳሪ (astedadari
) የተባለ ረድፍን በ‘ተጠቃሚዎች (teteqamis
) ሰንጠረዥ ውስጥ ያክላል፡፡ በዝርዝር 10.54 ውስጥ አምድ_አክል (add_column
) ላይ ነባሪ: ሃሰት (default: false
) የተባለውን ነጋሪአሴት እንዳከልን አስተውሉ፣ ይህ ማለት ማንኛውም ተጠቃሚ በነባሪነት አስተዳዳሪ አይሆንም ማለት ነው፡፡ (ያለ ነባሪ: ሃሰት (default: false
) ነጋሪአሴት የ‘አስተዳዳሪ (astedadari
) ዋጋ በነባሪነት ሁልጊዜ ምንም (nil
) ይሆናል፣ ያ ማለት አሁንም ሃሰት (false
) ማለት ነው፣ ምክንያቱም በቡልየን አውድ ውስጥ ምንም (nil
) ማለት ሃሰት (false
) ስለሆነ ነው፣ ስለዚህ ይህ ነባሪ: ሃሰት (default: false
) የተባለውን እርምጃ ከወዲሁ መውሰዱ በጥብቅ አስፈላጊ አይደለም ማለት ነው፡፡ ይሁን እንጅ ኮዱን እንደዛ አድርጎ መጻፉ ለሬይልስ እና ለዚህ ኮድ አንባቢያን ሃሳባችንን በግልጽ ያስተላልፋል።)
astedadari
) ባሕሪን ለተጠቃሚዎች ለማከል የሚደረግ ፍልሰት፡፡ db/migrate/[ማህተመጊዜ]_add_astedadari_to_teteqamis.rb
class AddAstedadariToTeteqamis < ActiveRecord::Migration[6.0]
def change
add_column :teteqamis, :astedadari, :boolean, default: false
end
end
በመቀጠል እንደተለመደው አድርገን እናፈልሰዋለን:-
$ rails db:migrate
እንደተጠበቀው፣ ሬይልስ የቡልየን ውሂብ የያዘውን የ‘አስተዳዳሪ (astedadari
) ባሕሪ ከወዲሁ የቡልየን ዘዴን እንደሚጠቀም ስላወቀ፣ አንድ የጥያቄ ምልክት ያለው የ‘አስተዳዳሪነውን? (astedadari?
) ዘዴን በራስሰር አክሎልናል:-
$ rails console --sandbox
>> ተጠቃሚ = Teteqami.first
>> ተጠቃሚ.astedadari?
=> false
>> ተጠቃሚ.toggle!(:astedadari)
=> true
>> ተጠቃሚ.astedadari?
=> true
እዚህ ጋር የ‘አስተዳዳሪ (astedadari
) ባሕሪ ዋጋን፣ ከ‘ሃሰት (false
) ወደ እውነት (true
) ለመቀየር የ‘ቀይር! (toggle!
) ዘዴን ተጠቅመናል፡፡
የመጨረሻ ሂደት ይሆነን ዘንድ፣ እስኪ የመጀመሪያውን ተጠቃሚ በነባሪነት አስተዳዳሪ ለማድረግ የውሂብ ዘራችንን እናዘምነው (ዝርዝር 10.55)።
db/seeds.rb
# አንድ ዋና የናሙና ተጠቃሚን መፍጠር።
Teteqami.create!(sim: "Abnetawi Teteqami",
emelekt: "msalie@railstutorial.org",
password: "foobar",
password_confirmation: "foobar",
astedadari: true)
# መአት ተጠቃሚዎችን ማመንጨት።
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)
end
ከዛም ውሂበጎታውን ወደ ነበረበት መልሱ እና እንዳዲስ ዝሩት:-
$ rails db:migrate:reset
$ rails db:seed
ዝርዝር 10.55 ተጠቃሚውን አንድ አስተዳዳሪ ለማድረግ በተርታ ማስጀመርያው ውስጥ አስተዳዳሪ: እውነት‘ን (astedadari: true
) እንዳካተተ አስተውላችሁ ይሆናል፡፡ አንድ የተርታ ማስጀመርያ ባሕሪን ለማንኛውም የድር አሳሽ መጠይቅ ምላሽ እንዲሰጥ አጋልጠን የምንሰጠው ከሆነ፤ ይህ ችግር ቁሶቻችን በሙሉ ለአደጋ እንዲጋለጡ መድረኩን እንደምንከፍት አጉልቶ ያሳያል፤ ለምሳሌ:- አንድ ተንኮለኛ ተጠቃሚ የሚከተለውን አንድ የ‘ዓዘምን (PATCH)
መጠይቅ ሊልክ ይችላል:-12
patch /teteqamis/17?astedadari=1
ይህ የዓዘምን (PATCH) መጠይቅ አስራ ሰባተኛውን (17) ተጠቃሚ በቀጥታ የአስተዳዳሪነት መብት እንዲኖረው ያደርገዋል፣ ይህ ክስተት ደግሞ የድሩን ደህንነት የሚያናጋ ከባድ አደጋ ሊፈጥር ይችላል፡፡
በዚህ አደጋ ምክንያት፣ በድር በኩል ለማረም ደህንነታቸው የተጠበቀ ባህሪያትን ብቻ ማዘመኑ አስፈላጊ ይሆናል፡፡ ስለሆነም፣ በክፍል 7.3.2 ላይ እንደተመለከተው፣ ጠንካራ ሰሚአሴቶችን በመጠቀም ጠይቅ (require
) እና ፍቀድ (permit
) የተባሉ ዘዴወችን በ‘ሰሚአሴቶች (params
) ተርታ ላይ በመጥራት ከሚደርሰው አደጋ መቆጠብ ይቻላል:-
def teteqami_negariaseitoch
params.require(:teteqami).permit(:sim, :emelekt, :password,
:password_confirmation)
end
በተለይ አስተዳዳሪ (astedadari
) በተፈቀዱት ባሕሪዎች ዝርዝር ውስጥ አለመኖሩን ልብ በሉ፡፡ ይህም የዘፈቀደ ተጠቃሚዎች ራሳቸውን ሹሞው በአፕልኬሽናችን ላይ አስተዳደራዊ መዳረሻን እንዳይሰጡ ይከላከላል። በእሱ አስፈላጊነት ምክንያት፣ አርትዖት ለማይገባው ማንኛውም ባሕሪ ፈተናን መፃፉ አንድ ጥሩ ሀሳብ ነው፣ እናም ለ‘አስተዳዳሪ (astedadari
) በሕሪው እንደዚህ ያለ አንድ ፈተናን መጻፉ ለናንተ እንደ አንድ መልመጃ ይሆን ዘንድ ተትቷል (ክፍል 10.4.1.2)።
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
ይህን_ሙሉ
የሚለውን ቦታ በትክክለኛው የፈተና ኮድ በመሙላት፣ የ‘አስተዳዳሪ (astedadari
) ባሕሪን በድር በኩል ማረም እንደማይቻል አረጋግጡ፡፡ ፈተናው የሚፈለገውን ነገር በትክክል መፈተኑን ለማረጋግጥ፣ በተፈቀደው የ‘ተጠቃሚ_ነገሪአሴቶች (teteqami_negariaseitoch
) ሰሚአሴት ዝርዝር ውስጥ አስተዳዳሪ‘ን (astedadari
) አክሉ እና ፈተናው መጀመሪያ ቀይእንደሚሆን አረጋግጡ። መጨረሻ ላይ ላለው ይህን_ሙሉ
የተዘመነውን የተጠቃሚ መረጃ ከውሂበጎታው አምጥታችሁ በድጋሚ መጫናችሁን አረጋግጡ (ክፍል 6.1.5)፡፡
astedadari
) ባሕሪው የተከለከለ መሆኑን መፈተን፡፡ test/controllers/teteqamis_controller_test.rb
require 'test_helper'
class TeteqamisControllerTest < ActionDispatch::IntegrationTest
def setup
@teteqami = teteqamis(:michael)
@lela_teteqami = teteqamis(:ermias)
end
.
.
.
test "ባልተገባ ጊዜ ዝመናው ማዟዟር አለበት" do
patch teteqami_path(@teteqami), params: { teteqami: { sim: @teteqami.sim,
emelekt: @teteqami.emelekt } }
assert_not flash.empty?
assert_redirected_to gba_url
end
test "የአስተዳዳሪ ባሕሪው በድር በኩል እንዲታረም መፍቀድ የለበትም" do
gba_ende(@lela_teteqami)
assert_not @lela_teteqami.astedadari?
patch teteqami_path(@lela_teteqami), params: {
teteqami: { password: "password",
password_confirmation: "password",
astedadari: ይህን_ሙሉ } }
assert_not @lela_teteqami.ይህን_ሙሉ.astedadari?
end
.
.
.
end
የማጥፋት
ተግባርየተጠቃሚዎች ሃብትን ለማጠናቀቅ የሚያስፈልገው የመጨረሻ ደረጃ ሂደት፣ የመሰርዝ አገናኖችን እና አንድ የ‘አጥፋ (destroy
) ተግባርን ማከል ብቻ ነው። የአስተዳዳር ተጠቃሚዎች መዳረሻን በመገደብ፣ በተጠቃሚዎች ማውጫ ገጽ ላይ ለእያንዳንዱ ተጠቃሚ አንድ የመሰረዣ አገናኝን በማከል ስራችንን እንጀምራለን፡፡ ከውጤቱ የሚገኙት የ‘ "ሰርዝ"
አገናኞች የሚታዩት የአሁንተጠቃሚው አስተዳዳሪ ከሆነ ብቻ ነው (ዝርዝር 10.57)።
app/views/teteqamis/_teteqami.html.erb
<li>
<%= amsaya_le teteqami, meten: 50 %>
<%= link_to teteqami.sim, teteqami %>
<% if ahun_teteqami.astedadari? && !ahun_teteqami?(teteqami) %>
| <%= link_to "ሰርዝ", teteqami, method: :delete,
data: { confirm: "እርግጠኛ ነዎት?" } %>
<% end %>
</li>
የ‘ዘዴ: :ሰርዝ (method: :delete
) ነጋሪአሴቱ፣ አገናኙ አስፈላጊውን የ‘ሠርዝ (DELETE)
መጠይቅ እንዲያቀርብ፣ እንደሚያዘጋጀው ልብ ልትሉ ይገባል። አስተዳዳሪወች ብቻ ያዩዋቸው ዘንድ እያንዳንዱን አገናኝ በአንድ የ‘ከሆነ (if
) ዓረፍተሐሳብ ውስጥም አስገብተናቸዋል። ለአስተዳዳሪ ተጠቃሚያችን የተገኘው ውጤት በምስል 10.15 ውስጥ ይታያል፡፡
የድር አሳሾች በተፈጥሯቸው የ‘ሠርዝ (DELETE)
መጠይቅን መላክ አይችሉም፤ ስለሆነም ሬይልስ ጃቫስክሪፕትን በመጠቀም ይሸውዳቸዋል፡፡ ይህ ማለት አሳሹ ላይ ጃቫስክሪፕቱ እንዳይሰራ ከተደረገ፣ የ “ሰርዝ” አገናኞቹ አይሰሩም ማለት ነው፡፡ ጃቫስክሪፕት የሌላቸው አሳሾችን ግዴታ መደገፍ ካለባችሁ፣ አንድ ቅጽ ላይ አንድ የ‘ዓስቀምጥ (POST)
መጠይቅን በመጠቀም የ‘ሠርዝ (DELETE)
መጠይቅን በሃይላኛው መሸወድ ትችላላችሁ፣ ይህ ዘዴ አሳሹ ጃቫስክሪፕት ባይኖረውም ይሰራል።13
የመሰረዣ አገናኞች እንዲሰሩ ለማድረግ፣ በዝርዝር 10.58 ላይ እንደሚታየው፣ አንድ የ‘አጥፋ (destroy
) ተግባርን (ሰንጠረዥ 7.1) ማከል ይኖርብናል፣ ይህም ተዛማጁን ተጠቃሚ ይፈልግ እና በንቅ መዝገብ የ‘አጥፋ (destroy
) ዘዴ ያጠፋል፣ በመጨረሻም ወደ ተጠቃሚዎች ማውጫ ያዟዙራል። ተጠቃሚዎች ሌሎች ተጠቃሚዎችን ለመሰረዝ መጀመሪያ መግባት ስላለባቸው፣ ዝርዝር 10.58 የ‘:አጥፋ (:destroy
) ተግባርን በ‘ግብ_ተጠቃሚ (gb_teteqami
) ቅድመአጣሪ ውስጥ አክሏል፡፡
destroy
) ተግባርን ማከል። app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
before_action :gb_teteqami, only: [:index, :edit, :update, :destroy]
before_action :tkklegna_teteqami, only: [:edit, :update]
.
.
.
def destroy
Teteqami.find(params[:id]).destroy
flash[:success] = "ተጠቃሚው ተሰርዟል"
redirect_to teteqamis_url
end
private
.
.
.
end
አፕልኬሽኑ አሁን ባለበት ደረጃ ላይ እንደተገነባው፣ አስተዳዳሪወች ብቻ የተጠቃሚ መሰረዣ አገናኞችን ማየት ስለሚችሉ፣ እነሱም ተጠቃሚወችን በድር በኩል መሰረዝ ይችላሉ፣ ነገር ግን አሁንም አንድ አስከፊ የጥበቃ ችግር አለ፤ ለምሳሌ አንድ የተካነ አጥቂ በጣቢያው ላይ የሚገኝ ማንኛውንም ተጠቃሚ ለመሰርዝ፣ ከአንድ የማዘዥያ መስመር አንድ የ‘ሠርዝ (DELETE)
መጠይቅን በቀላሉ በቀጥታ መስደድ ይችላል። ጣቢያውን በትክክል ለመጠበቅ በ‘አጥፋ (destroy
) ተግባሩ ላይ፣ የመዳረሻ ቁጥጥር ያስፈልገናል፤ ስለሆነም አስተዳዳሪዎች ብቻ ተጠቃሚዎችን መሰረዝ ይችላሉ ማለት ነው።
ልክ በክፍል 10.2.1 እና በክፍል 10.2.2 ላይ እንዳደረግነው ሁሉ፣ አሁንም አንድ ቅድመአጣሪን በመጠቀም፣ የመዳረሻ መቆጣጠሪያን እናስገድዳለን፣ በዚህ ጊዜ የ‘አጥፋ (destroy
) ተግባርን በአስተዳዳሪዎች መደረስን መገደብ ይሆናል፡፡ የተጋኘው የ‘አስተዳዳሪ_ተጠቃሚ (astedadari_teteqami
) ቅድመአጣሪ ውጤት በዝርዝር 10.59 ውስጥ ይታያል፡፡
destroy
) ተግባርን ለአስተዳዳሪዎች የሚገድብ አንድ ቅድመአጣሪ። app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
before_action :gb_teteqami, only: [:index, :edit, :update, :destroy]
before_action :tkklegna_teteqami, only: [:edit, :update]
before_action :astedadari_teteqami, only: :destroy
.
.
.
private
.
.
.
# አስተዳዳሪ ተጠቃሚን ያረጋግጣል።
def astedadari_teteqami
redirect_to(root_url) unless ahun_teteqami.astedadari?
end
end
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
ተጠቃሚዎችን እንደማጥፋት አደገኛ ለሆነ ነገር፣ ለተጠበቀው ባህሪ ደግሞ በጣም ጥሩ የሆነ ፈተና መኖሩ አስፈላጊ ነገር ነው፡፡ በዝርዝር 10.60 ውስጥ እንደሚታየው፣ ከእቃ ተጠቃሚዎቻችን ውስጥ አንዱ አስተዳዳሪ እንዲሆን በማዘጋጀት እንጀምራለን፡፡
test/fixtures/teteqamis.yml
michael:
sim: Michael Abnet
emelekt: michael@misalei.com
password_digest: <%= Teteqami.fech('mehlefeqal') %>
astedadari: true
ermias:
sim: Ermias Leake
emelekt: duchess@example.gov
password_digest: <%= Teteqami.fech('mehlefeqal') %>
gerie:
sim: Tomas Gerie
emelekt: hands@example.gov
password_digest: <%= Teteqami.fech('mehlefeqal') %>
abeba:
sim: Abeba Melake
emelekt: boss@example.gov
password_digest: <%= Teteqami.fech('mehlefeqal') %>
<% 30.times do |n| %>
teteqami_<%= n %>:
sim: <%= "Teteqami #{n}" %>
emelekt: <%= "teteqami-#{n}@example.com" %>
password_digest: <%= Teteqami.fech('mehlefeqal') %>
<% end %>
በክፍል 10.2.1 ላይ የተደረጉ አሰራሮችን በመከተል፣ ተግባር-ነክ የሆኑ የመዳረሻ ቁጥጥር ፈተናወችን በተጠቃሚዎች መቆጣጠሪያ ፈተና ፋይል ውስጥ እናስቀምጣለን፡፡ በዝርዝር 8.38 ላይ እንዳለው ማለት ከመውጫ ፈተናው ጋር በተመሳሰለ መልኩ፣ የ‘አጥፋ (destroy
) ተግባሩ በቀጥታ አንድ የ‘ሠርዝ (DELETE)
መጠይቅን እንዲሰድ የ‘ሰርዝ (delete
) ዘዴን እንጠቀማለን፡፡ በመቀጠል ደግሞ ሁለት ሁኔታዎችን ማረጋገጥ ይኖርብናል፤ እነሱም የመጀመሪያው፣ ያልገቡ ተጠቃሚዎችን ወደ መግቢያ ገጽ ማዟዟር ሲሆን፤ ሁለተኛው ደግሞ የገቡ፣ ነገር ግን አስተዳዳሪወች ያልሆኑ ተጠቃሚዎችን ወደ መነሻ ገጹ ማዟዟር ናቸው፡፡ እነዚህ ቅደም ተከተሎች በዝርዝር 10.61 ውስጥ ይታያሉ፡፡
test/controllers/teteqamis_controller_test.rb
require 'test_helper'
class TeteqamisControllerTest < ActionDispatch::IntegrationTest
def setup
@teteqami = teteqamis(:michael)
@lela_teteqami = teteqamis(:ermias)
end
.
.
.
test "ባልተገባ ጊዜ ማጥፋቱ ማዟዟር አለበት" do
assert_no_difference 'Teteqami.count' do
delete teteqami_path(@teteqami)
end
assert_redirected_to gba_url
end
test "እንደ አላስተዳዳሪ በተገባ ጊዜ ማጥፋቱ ማዟዟር አለበት" do
gba_ende(@lela_teteqami)
assert_no_difference 'Teteqami.count' do
delete teteqami_path(@teteqami)
end
assert_redirected_to root_url
end
end
(በዝርዝር 7.23 ውስጥ ካሁን በፊት እንደታየው) ዝርዝር 10.61 የ‘ልዩነት_አለመኖርን_አረጋግጥ (assert_no_difference
) ዘዴን በመጠቀም የተጠቃሚው ቁጥር ላይ ምንም ዓይነት ጪማሬ አለመኖሩን እንደሚያረጋግጥ ልብ ልትሉ ይገባል።
በዝርዝር 10.61 ላይ ያለው ፈተና፣ ተጠቃሚው አስተዳዳሪ መሆኑን እና አለመሆኑን እንዲያረጋግጥ እና እንዲሁም አንድ አስተዳዳሪ አንድ ተጠቃሚን በተሳካ ሁኔታ ለማጥፋት አንድ የስረዛ አገናኝን መጠቀም እንደሚችል ማረጋገጥ እንደፈለግንም ያሳያል። የመሰረዣ አገናኞቹ በተጠቃሚዎች ማውጫ ላይ ስለታዩ፣ እነዚህን ፈተናወች በዝርዝር 10.48 ውስጥ በሚገኘው የተጠቃሚዎች ማውጫ ፈተና ላይ እናክላቸዋለን። እዚህ ላይ ብቸኛው አስቸጋሪ ክፍል አንድ አስተዳዳሪ አንድ ተጠቃሚን ለመሰረዝ የ “ሰርዝ” አገናኝ ላይ ጠቅ ሲያደርግ፣ ተጠቃሚው እንደተሰረዘ ማረጋገጡ ነው፤ ነገር ግን እሱን እንደሚከተለው ማረጋገጥ እንችላለን፡-
assert_difference 'Teteqami.count', -1 do
delete teteqami_path(@lela_teteqami)
end
ይህ አንድ ተጠቃሚን በፈጠርንበት ወቅት፣ የተፈጠሩትን የተጠቃሚዎች ብዛት ለማረጋገጥ በዝርዝር 7.31 ላይ የተጠቀምንበትን የ‘ልዩነት_አረጋግጥ (assert_difference
) ዘዴን ይጠቀማል፣ በዚህ ጊዜ ደግሞ አንድ የሰርዝ (delete
) መጠይቅ በተዛማጁ ተጠቃሚ መንገድ ላይ በሚሰጥበት ወቅት የ‘ተጠቃሚ.ቁጠር (Teteqami.count
) ዘዴ የተጠቃሚዎች ቁጥርን በአንድ (\( -1 \)) መቀነሱን በማረጋገጥ ተጠቃሚው መሰረዙን ያረጋግጣል፡፡
ሁሉንም ነገር በአንድ ላይ ማሰባሰቡ፣ በዝርዝር 10.62 ውስጥ የሚገኘውን የገጸቁጥር እና የመሰረዝ ፈተናን ይሰጣል፣ ይህም ሁለቱንም ማለት አስተዳዳሪዎች እና አስተዳዳሪወች ላልሆኑት ተጠቃሚዎች የሚሆኑትን ፈተናወችንም ያካትታል፡፡
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)
get teteqamis_path
assert_template 'teteqamis/index'
assert_select 'div.pagination'
yeteteqamiwech_yemejemeriya_gets = Teteqami.paginate(page: 1)
yeteteqamiwech_yemejemeriya_gets.each do |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
test "አስተዳዳሪ ያልሆነ ማውጫ" do
gba_ende(@astedadari_yalhone)
get teteqamis_path
assert_select 'a', text: 'ሰርዝ', count: 0
end
end
ዝርዝር 10.62 ትክክለኛውን የመሰረዣ አገናኞች ከማረጋገጡ በተጨማሪ፣ ተጠቃሚው አስተዳዳሪ ሆኖ ከተገኘ ፈተናውን እንደሚዘል ልብ ልትሉ ይገባል። (ዝርዝር 10.57 የመሰረዣ አገናኝ እንዳልነበረው አስተውላችሁ ይሆናል)።
በዚህ ጊዜ የስረዛ ኮዱ በጥሩ ሁኔታ ተፈትኗል፤ ስለሆነም የፈተና ስብስቡ አረንጓዴመሆነ አለበት፡-
$ rails test
የሬይልስ ስልጠናን ለገዙ ሰወች በሙሉ የሁሉም የመልመጃ መልሶች እዚህ ላይ ይገኛሉ።
የሌሎች ሰዎች መልሶችን ለማየት እና የራሳችሁን ደግሞ ለመመዝገብ፣ በሬይልስ ስልጠና ወይም ሁሉንም በበቂ ተማር መድረሻ ጥቅል ላይ ተመዝገቡ፡፡
ክፍል 5.4 መጀመሪያ ላይ የተጠቃሚዎች መቆጣጠሪያ ጋር ከተዋወቅን ጀምሮ እስከ አሁን ድረስ ረጅም መንገድ መጥተናል። እነዚህ አሁን ያሉን በመቶ የሚቆጠሩት ተጠቃሚዎች በጣቢያው ላይ መመዝገብ እንኳን አልቻሉም ነበር፣ አሁን ግን ተጠቃሚዎች መመዝገብ፣ መግባት፣ መውጣት፣ መገለጫቸውን ማየት፣ ዝግጅቶቻቸውን ማረም እና የሁሉንም ተጠቃሚዎች ማውጫ ማየት ይችላሉ፤ እና እንዳውም አንዳንዶቹ ሌሎች ተጠቃሚዎችን ሊያጠፉ ይችላሉ፡፡
የማሳያ አፕልኬሽኑ አሁን ባለበት ደረጃ ላይ፣ ተጠቃሚዎች ማረጋገጫ እና ፈቀዳ ሊኖራቸው እንደሚገባ መስፈርት ለሚጠይቅ ለማንኛውም ጣቢያ አንድ ጠንካራ መሰረትን ጥሏል፡፡ በምዕራፍ 11 እና ምዕራፍ 12 ላይ ሁለት ተጨማሪ ማሻሻያዎችን እናክላለን እነሱም:- አዲስ ለተመዘገቡ ተጠቃሚዎች አንድ የመለያ ማግበር አገናኝ (በሂደቱ ብቃት ያለው የኤመልእክት አድራሻ ማሆኑን በማረጋገጥ) እና መሕለፈቃላቸውን የረሱ ተጠቃሚዎችን ለመርዳት አንድ የመሕለፈቃል ዳግም ማስጀመሪያ እንዲያገኙ ማድረግ ናቸው፡፡
ከመቀጠላችሁ በፊት፣ ሁሉንም ለውጦች ወደ ዋና ቅርንጫፉ ማዋሃዳችሁን አረጋግጡ:-
$ git add -A
$ git commit -m "የተጠቃሚ እርማት፣ ዝመና፣ ማውጫ እና ማጥፋት ተግባሮችን ማጠናቀቅ"
$ git checkout main
$ git merge ተጠቃሚዎችን-ማዘመን
$ git push
እንዲሁም አፕልኬሽኑን ማሰማራት እና የምርት ውሂበጎታውንም እንኳን ሳይቀር በናሙና ተጠቃሚዎች መሙላት ትችላላችሁ (ይህንን ለማድረግ ፒጅ:ዳግምአስጀምር (pg:reset
) የተባለውን የሃረኩን ስራ በመጠቀም የምርት ውሂበጎታውን ዳግም ማስጀመር ትችላላችሁ):-
$ rails test
$ git push heroku
$ heroku pg:reset DATABASE
$ heroku run rails db:migrate
$ heroku run rails db:seed
በእርግጥ አንድ እውነተኛ ጣቢያን በናሙና ውሂብ መዝራቱ ምናልባት አስፈላጊ ላይሆን ይችላል፣ እኔ ግን ለምሳሌ ይሆን ዘንድ እዚህ ላይ አካትቸዋለሁ (ምስል 10.16)፡፡ እንደአጋጣሚ አስተውላችሁ ከሆነ፣ በምስል 10.16 ውስጥ ያሉ የናሙና ተጠቃሚዎች ቅደም ተከተል ከምስል 10.11 ውስጥ ካሉ የናሙና ተጠቃሚዎች ቅደም ተከተል ጋር አይመሳሰልም፤ ይህ የሆነበት ምክንያት በውሂበጎታው ላይ ስለተጠቃሚወች ቅደም ተከተል አቀማመጥ/አቀራረብ ላይ የተደነገገ አንድ ነባሪ ደንብ ስለለለን እና የአሁኑ ትእዛዝ በውሂበጎታው አሰራር ላይ የተወሰነ ስለሆነ ነው፡፡ ይህ በተጠቃሚዎች ላይ ብዙም አያስፈልግም ለአጪርጽሑፎች ግን በጣም ያስፈልጋል፤ ስለሆነም ይህንን ችግር በክፍል 13.1.4 ላይ የምናስተካክለው ይሆናል፡፡
የዓዘምን (PATCH)
መጠይቅን ወደ አዘምን (update
) ተግባር እንደሚሰድ፣
rails db:seed
) በመጠቀም በናሙና ውሂቦች ውሂበጎታውን ለመዝራት መደበኛውን የ‘ውጎ/ዘሮች.አርቢ (db/seeds.rb
) ፋይልን እንደሚጠቀም፣
render @teteqamis
) ማስኬድ በስብስቡ ውስጥ በእያንዳንዱ ተጠቃሚ ላይ የ_ተጠቃሚ.ሃጽመቋ.ክሩ (_teteqami.html.erb
) ከፊልን በራስሰር እንደሚጠራ፣
astedadari
) የተባለው የቡልየን ባሕሪ በተጠቃሚ ቁሶች ላይ አንድ የ‘አስተዳዳሪነውን? (astedadari?
) የተባለ የቡልየን ዘዴን በራስሰር እንደሚፈጥር፣
የ‘ሠርዝ (DELETE)
መጠይቆችን በተጠቃሚዎች መቆጣጠሪያ የ‘አጥፋ (destroy
) ተግባር ላይ የሚሰጡ የ “ሰርዝ” አገናኞችን ጠቅ በማድረግ፣ ተጠቃሚዎችን በድር በኩል መሰረዝ እንደሚችሉ እና
new
) እና በ‘አርትዕ (edit
) ከፊሎች ውስጥ የኮድ ድግግሞሽን ከነበረው በበለጠ እንዲሻሻል ሃሳብ ላበረከቱት ጆሴ ካርሎስ ሞንቴሮ ጎሜዝን በጣም አመሰግናለሁ፡፡before_filter
) ተብሎ ይጠራ ነበር፣ ነገር ግን መጣራቱ የተለያዩ የመቆጣጠሪያ ተግባሮች ከመከናወናቸው በፊት የቅድመአጣሪው ስራ እንደሚከናወን በጉልህ ለማሳየት ሲባል፤ የሬይልስ ዋና ቡድን እንደገና ከድርጊት_በፊት (before_action
) ተብሎ እንዲሰየም ወስኇል።teteqami&. == ahun_teteqami
ኮድ እንድንጠቀም ያሳሰቡኝም እሳቸው ናቸው፡፡rails db:migrate:reset
) እና ሬይልስ ውጎ:ዳግምአስጀምር (rails db:seed)) በ‘ሬይልስ ውጎ:ዳግምአስጀምር (rails db:reset
) ትእዛዝ ሊጣመሩ ይችሉ ነበረ፣ ነገር ግን ከዚህ ጽሑፍ በኋላ ማለት በቅርቡ የወጡ የሬይልስ ስሪቶች ላይ ይህ ትእዛዝ እንደማይሰራ ይታወቃል፡፡@teteqamis.each do |ቢሊ|
ብለን ከጻፍን በኋላ render ቢሊ
በማለት የተጠቃሚዎችን ዝርዝር ማግኘት እንችላለን፣ ተጠቃሚ (teteqami
) የተባለው ተለዋዋጪ በቢሊ ብቻ ሳይሆን በተፈለገው ዓይነት ተለዋዋጪ ቢተካም ምንም ዓይነት ለውጥ አያመጣም። እዚህ ላይ አብዩ ነገር የ‘ተጠቃሚ (Teteqami
) ክፍል ቁስ ብቻ ነው፡፡