ምዕራፍ 10 ተጠቃሚዎችን ማዘመን፣ ማሳየት እና መሰረዝ

በዚህ ምዕራፍ ውስጥ የ‘አርትዕ (edit)፣ የ‘አዘምን (update)፣ የ‘ማውጫ (index) እና የ‘አጥፋ (destroy) ተግባሮችን በማከል ለተጠቃሚዎች ሃብቶች የው.ሁ.ማ ተግባሮችን (ሰንጠረዥ 7.1) እናጠናቅቃለን፡፡ ለተጠቃሚዎች መገለጫቸውን የሚያዘምኑበትን ችሎታ በመስጠት እንጀምራለን፤ ይህ ደግሞ አንድ የፈቀዳ ቅርጸትን ለማስፈጸም አንድ ተፈጥሯዊ እድልን ይሰጠናል (ይህም በምዕራፍ 8 ላይ ባለው የማረጋገጫ ኮድ ተግባራዊ ሊሆን ችሏል)፣ ከዚያ የሁሉንም ተጠቃሚዎች ዝርዝር እናዘጋጃለን (ይህ ማረጋገጫንም ያስፈልጋል)፣ ይህም የውሂብ ናሙናን እና ገጸቁጥርን ለማስተዋወቅ አንድ እድልን ይከፍታል። በመጨረሻም፣ ተጠቃሚዎችን ከውሂበጎታው የማጥፋት ችሎታን እናክላለን፤ ማንኛውም ተጠቃሚ እንደዚህ አይነት አደገኛ ኃይል እንዲኖረው መፍቀድ ስለማንችል፣ ሌሎች ተጠቃሚዎችን ለመሰረዝ ልዩ መብት የተፈቀደላቸው የአስተዳደር ተጠቃሚዎችን ለማስተናገድ አንድ ክፍልን እንፈጥራለን፡፡

10.1 ተጠቃሚዎችን ማዘመን

የተጠቃሚ መረጃን የማረሙ ንድፍ፣ አዲስ ተጠቃሚወችን ከመፍጠር ጋር በጣም ትይዩ ነው (ምዕራፍ 7)፡፡ ለአዲስ ተጠቃሚዎች አንድ ትይታ ከሚያቀርብ አንድ የ‘አዲስ (new) ተግባር ይልቅ፣ አንድ የተጠቃሚዎች አርትዕ ትይታን የሚያቀርብ አንድ የ‘አርትዕ (edit) ተግባር አለን፤ በተመሳሳይ ፍጠር‘ን (create) ለአንድ የ‘ዓስቀምጥ (POST) መጠይቅ ምላሽ ከመስጠት ይልቅ፣ ለአንድ የ‘ዓዘም‘ን (PATCH) መጠይቅ ምላሽ የምንሰጥበት አንድ የ‘አዘምን (update) ተግባር አለን (ሳጥን 3.2)፡፡ እዚህ ላይ ትልቁ ልዩነት፣ ማንም ሰው መመዝገብ ቢችልም፤ መረጃውን ማዘመን የሚችለው ግን የአሁንተጠቃሚ ብቻ መሆኑ ነው። የምዕራፍ 8 የማረጋገጫ ፋብሪካውም የአሁንተጠቃሚ እንደሆነ ለማረጋገጥ፣ አንድ ቅድመአጣሪን (Before Filter) እንድንጠቀም ያስችለናል፡፡

ስራችንን ለመጀመር፣ በአንድ ተጠቃሚዎችን-ማዘመን በተባለ ርዕስ ቅርንጫፍ ላይ በመስራት እንጀምር:-

$ git checkout -b ተጠቃሚዎችን-ማዘመን

10.1.1 የእርማት ቅጽ

ስእላዊ መግለጫው1ምስል 10.1 ላይ በሚታየው የእርማት ቅጽ እንጀምራለን፡፡ በምስል 10.1 ላይ ያለውን ስእላዊ መግለጫ ወደ አንድ የሚሰራ ገጽ ለመቀየር፣ የተጠቃሚዎች መቆጣጠሪያ የ‘አርትዕ (edit) ተግባርን እና የተጠቃሚ እርማት ትይታን መሙላት ይኖርብናል። ተገቢውን ተጠቃሚ ከውሂበጎታው ጎትቶ ማውጣት በሚፈልገው በ‘አርትዕ (edit) ተግባር እንጀምራለን። ሰንጠረዥ 7.1 ላይ በተመለከተው መሰረት፣ ለአንድ ተጠቃሚ የእርማት ገጽ ትክክለኛው ዓ.አ.ሃ.አ /ተጠቃሚዎች/1/አርትዕ (/teteqamis/1/edit) መሆኑን ልብ ልትሉ ይገባል (እዚህ ላይ የተጠቃሚው መታወቂያ 1 ነው ካልን ማለት ነው)፡፡ የተጠቃሚው መታወቂያ በ‘ሰሚአሴቶች[:መታወቂያ] (params[:id]) ተለዋዋጪ ውስጥ የሚገኝ መሆኑን አስተውሉ፣ ይህ ማለት በዝርዝር 10.1 ውስጥ በሚገኘው ኮድ ተጠቃሚውን መፈለግ እንችላለን ማለት ነው፡፡

images/figures/edit_user_mockup_bootstrap
ምስል 10.1: አንድ የተጠቃሚ እርማት ገጽ ስእላዊ መግለጫ።
ዝርዝር 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)፡፡

ዝርዝር 10.2: የተጠቃሚው የእርማት ትይታ። 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)።

images/figures/edit_page
ምስል 10.2: የመጀመሪያው የተጠቃሚ እርማት ገጽ አስቀድሞ ከተሞላ ስም እና ኤመልእክት ጋር።

ዝርዝር 10.3 ውስጥ የምስል 10.2 ‘ን የሃ.ጽ.መ.ቋ ምንጪ በመመልከት፣ የተጠበቀውን አንድ የቅጽ መለያ እናያለን (ዝርዝሮቹ ትንሽ ሊለያዩ ይችላሉ)፡፡

ዝርዝር 10.3: ዝርዝር 10.2 ውስጥ ለተገለጸው እና በምስል 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 ውስጥ ይታያል።

መልመጃዎች

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

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

  1. ከዚህ በላይ እንደተብራራው፣ ዓ.አ.ሃ.አን ለመክፈት ኢላማ="_ባዶ" (target="_blank") የተባለውን የሃ.ጽ.መ.ቋ አባልን ከመጠቀም ጋር የተያያዘ አንድ አነስተኛ የጥበቃ ችግር አለ፤ ይህም ከሃ.ጽ.መ.ቋ ሰነድ ጋር የተዛመደውን ማለት “የ‘መስኮት ቁስ (window object)” ተብሎ የሚጠራውን ቁስ ተቀባዩ ጣቢያ እንዲቆጣጠረው አሳልፎ ይሰጣል፡፡ ተቀባዩ ጣቢያ እንደ አንድ ተንኮል አዘል (phishing) ገጽ ያሉ አደገኛ ይዘቶችን ሊያስተዋውቅ ይችላል፡፡ ይህ እንደ ግራቫታር ካሉ ታዋቂ ጣቢያዎች ጋር በመገናኘት ሊከሰት የሚችል ጉዳይ አይደለም፣ ነገር ግን በዋናው አገናኝ ላይ የ‘ግንኙነት (rel (“relationship”)) ባሕሪውን ዋጋ መክፈቻየለም ("noopener") ብለን በመጠቀም አደጋውን ሙሉ በሙሉ ከወዲሁ ማስወገድ እንችላለን፡፡ ይህንን ባሕሪ በዝርዝር 10.2 ውስጥ የሚገኘው የአምሳያ እርማት አገናኝ ውስጥ አክሉ።
  2. ዝርዝር 10.6 እና በዝርዝር 10.7 ላይ እንደሚታየው፣ የ‘አዲስ.ሃጽመቋ.ክሩ (new.html.erb) እና የ‘አርትዕ.ሃጽመቋ.ክሩ (edit.html.erb) ትይታወች በዝርዝር 10.6 ውስጥ ያለውን ከፊል ይጠቀሙ ዘንድ፣ በሁለቱ ቅጾች ውስጥ ያሉትን የኮድ ድግግሞሽ አስወግዱ፡፡ በክፍል 3.4.3 ላይ፣ በገጽታው ውስጥ ድግግሞሽን ለማስወገድ የተጠቀምንበትን የ‘አቅርብ (provide) ዘዴን አሁንም ተግባራዊ እንዳደረግነው ተገንዝባችሁ ይሆናል፡፡3
ዝርዝር 10.5: ለ‘አዲስ (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 %>
ዝርዝር 10.6: የምዝገባ ትይታው ከከፊል ጋር። 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>
ዝርዝር 10.7: የእርማት ትይታው ከከፊል ጋር። 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>

10.1.2 ያልተሳኩ እርማቶች

ያልተሳኩ ምዝገባዎችን (ክፍል 7.3) ያስተናገድንበትን ተመሳሳይ ሃሳብን በመከተል፣ በዚህ ክፍል ደግሞ ያልተሳኩ እርማቶችን እናስተናግድበታለን። አንድ የ‘አዘምን (update) ተግባርን በመፍጠር እንጀምራለን፤ ይህም በዝርዝር 10.8 ላይ እንደሚታየው፣ በተረከበው የ‘ሰሚአሴቶች (params) ተርታ ላይ የተመሰረተ ተጠቃሚን ለማዘመን የ‘አዘምን (update) ዘዴን (ክፍል 6.1.5) ይጠቀማል። የቀረበው መረጃ ብቁ ካልሆነ፣ የማዘመን ሙከራው ሃሰት‘ን (false) ይመልሳል፤ ስለሆነም የ‘ሌላከሆነ (else) ቅርንጫፉ የማረሚያውን ገጽ ያቀርባል። እንደዚህ ዓይነት ጥለትን ከዚህ በፊት አይተናል፤ ይህ አወቃቀር ከመጀመሪያው የ‘ፍጠር (create) ተግባር ስሪት ጋር በጣም ትይዩ ነው (ዝርዝር 7.18)።

ዝርዝር 10.8: የመጀመርያው የተጠቃሚ የ‘አዘምን (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)፡፡

images/figures/edit_with_invalid_information
ምስል 10.3: የዝማኔ ቅጹን በማስረክርብ ጊዜ የተገኙ የስህተት መልእክቶች።

መልመጃዎች

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

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

  1. የተለያዩ ብቁ ያልሆኑ የተጠቃሚ ስም፣ ኤመልእክት እና መሕለፈቃልን በማስረከብ የእርማት ቅጹ ብቁ ያልሆኑ ርካቤወችን እንደማይቀበል አረጋግጡ፡፡

10.1.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) ዘዴወች አንድ አይነት ጥለትን እንደሚከተል ያሳያል።

ዝርዝር 10.9: ለአንድ ያልተሳካ እርማት አንድ ፈተና። አረንጓዴ 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

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

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

መልመጃዎች

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

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

  1. ዝርዝር 10.9 ላይ ስንት የስህተት መልእክቶች እንዳሉ የሚያረጋግጥ አንድ ፈተና አክሉ፡፡ ጠቃሚ ምክር:- ቅጹ በአንድ ክፍሊት (div ) አስጠንቅቅ (alert) ውስጥ CHECK “ቅጹ 3 shtetoch ስህተት/ቶች ይይዛል።” የሚል የስህተት መልእክት መኖሩን ለማረጋገጥ የሚያስፈልገውን የ‘መለያ_አረጋግጥ (assert_select) የማረጋገጫ ዘዴን ተጠቀሙ (ሰንጠረዥ 5.2)።

10.1.4 ያተሳኩ እርማቶች (ከፈ.መ.ብ ጋር)

አሁን የእርማት ቅጹ እንዲሰራ የምናደርግበት ጊዜ ነው፡፡ የምስል ሰቀላውን ስራ በግራቫታር የድር ጣቢያ ጫንቃ ላይ ስለጣልን፣ የመገለጫ ምስሎችን ማረሙ ቀድሞውንም ተግባራዊ ሁኗል፤ በምስል 10.2 ላይ እንደሚታየው፣ በምስል 10.4 ላይ የግራቫታር ጣቢያውን በአንድ አዲስ ትር ውስጥ የሚከፍተውን የ “ለውጥ” አገናኝን ጠቅ በማድረግ አምሳያውን ማረም እንችላለን (በአዲስ ትር የሚከፈተው በዝርዝር 10.2 ላይ ባለው የ‘ኢላማ="_ባዶ" (target="_blank") ትእዛዝ ምክንያት ነው)፡፡ እስኪ የተቀረው የተጠቃሚ እርማት እንዲሰራ ለማድረግ ስራችንን እንቀጥል፡፡

images/figures/gravatar_image_edit
ምስል 10.4: የግራቫታር የምስል-ማረሚያ በይነገጽ።

መፈተንን የበለጠ እየለመዳችሁት በምትመጡበት ጊዜ፣ የአፕኪኬሽኑን ኮድ ከመጻፍ ይልቅ በፊት፣ የውህደት ፈተናውን መጻፉ ጠቃሚ መሆኑን ልትገነዘቡ ትችሉ ይሆናል። በዚህ አውድ ውስጥ፣ አንድ እንደዚህ መሆን አለበት የተባለ ገጸባህሪን፣ መቼ ልክ እንደተሟላ ገጸባህሪ ተደርጎ ተቀባይነት እንደሚኖረው ስለሚወስኑ፤ እንደነዚህ ያሉት ፈተናወች አንዳንድ ጊዜ ቅብል ፈተናወች (Acceptance Tests) በመባል ይታወቃሉ፡፡ ይህ እንዴት እንደሚሰራ ለመመልከት፣ ፈ.መ.ብን በመጠቀም የተጠቃሚ እርማት ገጸባህሪን እናጠናቅቃለን።

ዝርዝር 10.9 ውስጥ ከሚታየው ፈተና ጋር የሚመሳሰል ፈተናን በመጻፍ የተጠቃሚዎች ዝመና ትክክለኛ ባህሪን እንፈትናለን፣ በዚህ ጊዜ ብቁ መረጃን ብቻ እናስረክባለን፡፡ ከዚያ አንድ ባዶ ያልሆነ የብልጪታ መልእክት መኖሩን እና የአንድ የተሳካ የመገለጫ ገጽ ማዟዟርን እናረጋግጣለን፣ እንዲሁም የተጠቃሚው መረጃ በውሂበጎታው ውስጥ በትክክል እንደተለወጠ እናረጋግጣለን። ውጤቱም በዝርዝር 10.11 ውስጥ ይታያል፡፡ በዝርዝር 10.11 ውስጥ ያሉት መሕለፈቃሎች እና ማረጋገጫዎች ባዶ መሆናቸውን ልብ በሉ፣ ይህም ሁልጊዜ ስማቸውን እና የኤመልእክት አድራሻዎቻቸውን በሚያዘምኑበት ጊዜ መሕለፈቃላቸውን ማዘመን ለማይፈልጉ ተጠቃሚዎች አመች ነው፡፡ በተጨማሪም ከውሂበጎታው የተጠቃሚውን ዋጋዎች በድጋሜ ከውሂበጎታው አምጥቶ ለመጫን እና በተሳካ ሁኔታ እንደተዛመኑ ለማረጋገጥ የ‘ተጠቃሚ.እንደገናጫን (@teteqami.reload) (ለመጀመርያ ጊዜ በክፍል 6.1.5 ውስጥ የታየውን) መጠቀምን አስተውሉ። (እንደዚህ ዓይነት ዝርዝሮችን በመጀመርያ በቀላሉ ልትረሷቸው ትችላላችሁ፤ ለዚህም ነው በነዚህ ሁለት የፈተና አሰራሮች ላይ ማለት በቅብል ፈተናወች እና በፈ.መ.ብ ላይ ውጤታማ ለመሆን አንድ የተወሰነ ደረጃ ልምድ የሚያስፈልገው፡፡)

ዝርዝር 10.11: አንድ የተሳካ የእርማት ፈተና። ቀይ 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)።

ዝርዝር 10.12: የተጠቃሚ የ‘አዘምን (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) ጋር በማዘጋጀት ተግባራዊ ማድረግ እንችላለን፡፡

ዝርዝር 10.13: በዝመና ወቅት ባዶ መሕለፈቃልን መፍቀድ። አረንጓዴ 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)፣ ይህንንም የፈተና ስብስቡን በድጋሜ በማስኬድ ማረጋገጥ ትችላላችሁ፣ እሱም አሁን አረንጓዴመሆን አለበት፡-

ዝርዝር 10.14: አረንጓዴ
$ rails test
images/figures/edit_form_working
ምስል 10.5: አንድ የተሳካ የእርማት ውጤት።

መልመጃዎች

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

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

  1. በማበልጸጊያ አፕልኬሽናችሁ ላይ አሁን ጥቂት ለውጦችን በማድረግ፣ እርማቶችን ማድረግ እንደሚችሉ እንደገና አረጋግጡ።
  2. አንድ የኤመልእክት አድራሻን ከአንድ ግራቫታር ጋር ካልተዛመደ የኤመልእክት አድራሻ ብትቀይሩት ምን ይከሰታል?

10.2 ፈቀዳ

በድር አፕልኬሽኖች አውድ ውስጥ፣ ማረጋገጥ (Authentication) የድራችንን ተጠቃሚዎች ለመለየት ሲያስችለን፣ ፈቀዳ (authorization) ደግሞ ተጠቃሚዎቻችን በጣቢያችን ላይ ምን ማድረግ እንደሚችሉ እንድንቆጣጠር ያደርገናል፡፡ በምዕራፍ 8 ውስጥ የማረጋገጫ ፋብሪካውን የመገንባቱ አንዱ ጥሩ ውጤት፣ አሁን እኛ ፈቀዳውንም ተግባራዊ ለማድረግ የሚያስችል አንድ አቋም እንዲኖረን ማድረጉ ነው፡፡

ምንም እንኳን የእርማት እና የማዘመን ተግባሮቹ በክፍል 10.1 ላይ በተሟላ ሁኔታ የተጠናቀቁ ቢሆኑም፣ አንድ አስቂኝ በሆነ የጥበቃ ጉድለት ግን ይሰቃያሉ፤ በማንም ሰው (ያልገባ ተጠቃሚም ቢሆን) ማንኛውንም ተግባር እንዲደረስ እና መረጃውንም በማንኛውም ተጠቃሚ እንዲዛመን ይፈቅዳሉ፡፡ በዚህ ክፍል ውስጥ ተጠቃሚዎች እንዲገቡ የሚያስፈልግ/የሚያስገድድ እና እንዲሁም ከራሳቸው ውጪ የማንኛውንም መረጃ እንዳያዘምኑ የሚከለክል አንድ የጥበቃ ቅርጸትን ተግባራዊ እናደርጋለን።

ክፍል 10.2.1 ውስጥ ያልገቡ ተጠቃሚዎች በመደበኛነት ሊደርሱበት የሚችሉትን አንድ የተጠበቀ ገጽ ለመድረስ የሚሞክሩ ተጠቃሚዎች ጉዳዮችን እናስተናግዳለን፡፡ አፕልኬሽኑን በሚጠቀሙበት መደበኛ ሂደት ውስጥ ይህ ችግር በቀላሉ ሊከሰት ስለሚችል፣ እንደዚህ ያሉ ተጠቃሚዎች በምስል 10.6 ላይ እንዳለው፣ ስእላዊ መግለጫ ከአንድ አጋዥ መልእክት ጋር ወደ መግቢያ ገጹ ይተላለፋሉ። በሌላ በኩል፣ ፈጽሞ ያልተፈቀደለትን ገጽ ለመድረስ የሚሞክር ተጠቃሚ (ለምሳሌ አንድ የገባ ተጠቃሚ የሌላ ተጠቃሚ የእርማት ገጽን ለመድረስ ቢሞክር) ወደ ስረ ዓ.አ.ሃ.አ‘ው (ክፍል 10.2.2) ይዟዟራል፡፡

images/figures/login_page_protected_mockup
ምስል 10.6: አንድ የተጠበቀ ገጽን የመጎብኘት ውጤትን የሚያሳይ አንድ ስእላዊ መግለጫ።

10.2.1 ተጠቃሚዎች እንዲገቡ ማስፈለግ

ምስል 10.6 ላይ የተመለከተውን የማስተላለፍ ባህሪን ለመተግበር፣ በተጠቃሚዎች መቆጣጠሪያ ውስጥ አንድ ቅድመአጣሪን እንጠቀማለን፡፡ ቅድመአጣሪ ከተሰጡት ተግባሮች በፊት አንድ እንዲጠራ የተወሰነ ዘዴን ለማዘጋጀት የ‘ከድርጊት_በፊት (before_action) ትእዛዝን ይጠቀማል፡፡4 ተጠቃሚዎች እንዲገቡ ለማስፈለግ/ለማስገደድ በዝርዝር 10.15 ውስጥ እንደታየው፣ አንድ ግብ_ተጠቃሚ (gb_teteqami) የተባለ ዘዴን እንበይን እና ከድርጊት_በፊት :ግብ_ተጠቃሚ‘ን (before_action :gb_teteqami) በመጠቀም እንጠራዋለን።

ዝርዝር 10.15: አንድ ግብ_ተጠቃሚ (gb_teteqami) የተባለ ቅድመአጣሪን ማከል። ቀይ app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
  before_action :gb_teteqami, only: [:edit, :update]
  .
  .
  .
  private

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

    # ቅድመአጣሪወች

    # አንድ የገባ ተጠቃሚን ያረጋግጣል።
    def gb_teteqami
      unless gebtual?
        flash[:danger] = "እባክዎትን ይግቡ"
        redirect_to gba_url
      end
    end
end

ቅድመአጣሪ በአንድ መቆጣጠሪያ ውስጥ ላለ ማንኛውም ተግባር ላይ በነባሪነት ወሰን ያደርጋል፣ ስለዚህ የ‘ብቻ: (only:) ተርታ አማራጪ ላይ ተገቢውን የ‘:አርትዕ :edit እና የ‘:አዘምን (:update) ተግባሮችን በማሳለፍ ማጣሪያው በነዚህ ተግባሮች ላይ ብቻ እንዲሰራ ገደብ እንጥላለን።

ምስል 10.7 ላይ እንደሚታየው፣ የተጠቃሚ የእርማት ገጽ /ተጠቃሚወች/1/አርትዕ‘ን (/teteqamis/1/edit) ለመድረስ በመሞከር፣ በዝርዝር 10.15 ውስጥ የሚገኘው የቅድመአጣሪ ያስገኘው ውጤትን ማየት እንችላለን፡፡

images/figures/protected_log_in
ምስል 10.7: የመግቢያ ቅጹ አንድ የተጠበቀ ገጽን ለመድረስ ከተደረገ ሙከራ በኋላ።

ዝርዝር 10.15 መግለጫ ጽሑፍ ላይ እንደተመለከተው፣ የፈተና ስብስባችን በአሁኑ ጊዜ ቀይነው:-

ዝርዝር 10.16: ቀይ
$ rails test

ይህ የሆነበት ምክንያት፣ የእርማት እና የማዘመን ተግባሮች አሁን አንድ የገባ ተጠቃሚን ስለሚፈልጉ እና በሚዛመዱት ፈተናወች ውስጥ ማንም የገባ ተጠቃሚ ስለለ ነው፡፡

የእርማት ወይም የማዘመን ተግባሮችን ከመምታታችን በፊት ተጠቃሚን በማግባት የፈተና ስብስባችንን እናስተካክለዋለን፡፡ በዝርዝር 10.17 ላይ እንደሚታየው፣ በክፍል 9.3 ላይ የበለጸገውን የ‘ግባ_እንደ (gba_ende) ረጅን በመጠቀም ይህን ማስተካከሉ እጅግ በጣም ቀላል ነው (ዝርዝር 9.24)፡፡

ዝርዝር 10.17: አንድ የፈተና ተጠቃሚን ማስገባት። አረንጓዴ test/integration/teteqamis_edit_test.rb
require 'test_helper'

class TeteqamisEditTest < ActionDispatch::IntegrationTest

  def setup
    @teteqami = teteqamis(:michael)
  end

  test "ያልተሳካ እርማት" do
    gba_ende(@teteqami)
    get edit_teteqami_path(@teteqami)
    .
    .
    .
  end

  test "ስኬታማ እርማት" do
    gba_ende(@teteqami)
    get edit_teteqami_path(@teteqami)
    .
    .
    .
  end
end

(የፈተና መግቢያውን በዝርዝር 10.17 አዘጋጅ (setup) ዘዴ ውስጥ በማስቀመጥ አንዳንድ ድግግሞሽን ማስወገድ በቻልን ነበር፣ ነገር ግን በክፍል 10.2.3 ውስጥ ከመግባታችን በፊት የእርማት ገጹን ለመጎብኘት አንዱን ፈተና መለወጥ ይኖርብናል፣ ይህን አሁን ያላደረግንበት ምክንያት፣ በፈተናው ዝግጅት ወቅት የመግባት ሂደቱ ከተከሰተ እንደዛ ማድረግ የማይቻል ስለሆነ ነው።)

በዚህ ጊዜ ፈተናው አረንጓዴመሆን አለበት:-

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

ምንም እንኳን የፈተና ስብስባችን አሁን ያለፈ ቢሆንም፣ ከቅድመአጣሪው ጋር ግን ገና አልጨረስንም፣ ምክንያቱም ኮዱ ላይ አንድ አስተያየትን በማድረግ እንደምታረጋግጡት የጥበቃ ቅዳችንን ብናስወግደውም እንኳ የፈተና ስብስቡ አሁንም አረንጓዴ ይሆናል (ዝርዝር 10.19)፡፡ ይህ የእኛ የፈተና ስብስብ እንዲይዘው ከምንፈልገው ምልሰት ሁሉ ይህ እጅግ የከፋው ነው፤ ይህ ግዙፍ የጥበቃ ቀዳዳ ምናልባትም ከችግሮቹ ሁሉ ቀዳሚነቱን የያዘ አንድ ችግር ሊሆን ይችላል፤ ስለሆነም በዝርዝር 10.19 ውስጥ ያለው ኮድ በእርግጠኝነት ቀይመሆን አለበት፡፡ ያንን ለማዘጋጀት እስኪ አንዳንድ ፈተናዎችን እንጻፍ፡፡

ዝርዝር 10.19: የጥበቃ ቅዳችንን ለመፈተን ቅድመአጣሪው ላይ አንድ አስተያየት ማድረግ፡፡ አረንጓዴ app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
  # before_action :gb_teteqami, only: [:edit, :update]
  .
  .
  .
end

ቅድመአጣሪው በየአንዳንዱ ተግባር መሰረት ስለሚሰራ፣ ከተጠቃሚዎች መቆጣጠሪያ ጋር የሚዛመዱትን ፈተናወች በተጠቃሚዎች መቆጣጠሪያ ፈተና ውስጥ እናስገባቸዋለን። ዕቅዱ የ‘አርትዕ (edit) እና የ‘አዘምን (update) ተግባርን በትክክለኛ መጠይቅ በመምታት የብልጪታ መልእክቱ መዘጋጀቱን እና ተጠቃሚው ወደ መግቢያ አድራሻው መዟዟሩን ማረጋገጥ ነው። በሰንጠረዥ 7.1 መሰረት ተገቢ የሆኑት መጠይቆች በቅደም ተከተል ዓግኝ (GET) እና ዓዘምን (PATCH) እንደሆኑ እናያለን፣ ይህ ማለትም የ‘አግኝ (get) እና የ‘አዘምን (patch) ዘዴን በፈተናወቹ ውስጥ ጥቅም ላይ መዋል አለባቸው ማለት ነው፡፡ ውጤቶቹ (አንድ የ‘@ተጠቃሚ (@teteqami) ተለዋዋጪን ለመበየን አንድ የ‘አዘጋጅ (setup) ዘዴንም በማካተት) በዝርዝር 10.20 ውስጥ ይታያሉ፡፡

ዝርዝር 10.20: አርትዕ (edit) እና አዘምን (update) እንደተጠበቁ መፈተን። ቀይ test/controllers/teteqamis_controller_test.rb
require 'test_helper'

class TeteqamisControllerTest < ActionDispatch::IntegrationTest

  def setup
    @teteqami = teteqamis(:michael)
  end
  .
  .
  .
  test "ባልተገባ ጊዜ እርማቱ ማዟዟር አለበት" do
    get edit_teteqami_path(@teteqami)
    assert_not flash.empty?
    assert_redirected_to gba_url
  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
end

ዝርዝር 10.20 ላይ የተመለከተው ሁለተኛው ፈተና፣ አንድ የ‘ዓዘምን (PATCH) መጠይቅን ለ‘ተጠቃሚ_መንገድ(@ተጠቃሚ) (teteqami_path(@teteqami)) ለመላክ የ‘አዘምን (patch) ዘዴ መጠቀምን እንደሚያሳትፍ ያሳያል፡፡ በሰንጠረዥ 7.1 መሰረት እንዲህ ያለው አንድ መጠይቅ፣ እንደአስፈላጊነቱ በተጠቃሚዎች መቆጣጠሪያ ውስጥ ወደሚገኘው የ‘አዘምን (update) ተግባር ይዘዋወራል፡፡

የፈተና ስብስቡ አሁን እንደተፈለገው ቀይመሆን አለበት። የፈተና ስብስቡ አረንጓዴእንዲሆን፣ አስተያየቱን ከቅድመአጣሪው ላይ አስወግዱት (ዝርዝር 10.21)፡፡

ዝርዝር 10.21: አስተያየቱን ከቅድመአጣሪው ማስወገድ። አረንጓዴ app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
  before_action :gb_teteqami, only: [:edit, :update]
  .
  .
  .
end

ከእዚያ ጋር የፈተና ስብስባችን አረንጓዴመሆን አለበት:-

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

አሁን ማንኛውም የእርማት ዘዴዎች፣ ላልተፈቀደላቸው ተጠቃሚዎች በድንገት የመጋለጡ ጉዳይ፣ በእኛ የፈተና ስብስብ አማካኝነት ወዲያውኑ ይያዛል፡፡

መልመጃዎች

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

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

  1. ከላይ እንደተጠቀሰው ቅድመአጣሪው በእያንዳንዱ የመቆጣጠሪያ ተግባር ላይ በነባሪነት ተግባራዊ ይሆናል፣ ይህ አሁን ባለንበት ሁኔታ ስህተት ነው፡፡ (ለምሳሌ፣ አንድን ሰው ድራችን ላይ ለመመዝገብ ሲፈልግ፣ መጀመሪያ እንዲገባ መጠየቁ እራስን መሳት ነው፡፡) በዝርዝር 10.15 ውስጥ የሚገኘው የ‘ብቻ: (only:) ተርታ ላይ አስተያየት በማድረግ ይህንን ስህተት የፈተና ስብስቡ እንደሚይዘው አረጋግጡ፡፡

10.2.2 ትክክለኛውን ተጠቃሚ ማስፈለግ

በርግጥ ተጠቃሚዎች እንዲገቡ መፈለጉ ብቻ በቂ አይደለም፤ ተጠቃሚዎች የራሳቸውን መረጃ እንዲያስተካክሉ ብቻ ሊፈቀድላቸውም ይገባል። በክፍል 10.2.1 ላይ አስፈላጊ የጥበቃ ጉድለትን መያዝ ያልቻለ አንድ የፈተና ስብስብ ሊኖር እንደሚችል አይተናል፤ ስለሆነም የእኛ ኮድ የጥብቃ ቅዱ በትክክል መተግበሩን ለማረጋገጥ ፈተና-መሬ ብልጸጋን በመጠቀም ስራችንን እንቀጥላለን። ይህንን ለማድረግ፣ በዝርዝር 10.20 ውስጥ የተዘረዘሩትን ለማሟላት በተጠቃሚዎች መቆጣጠሪያ ፈተና ውስጥ አንዳንድ ፈተናወችን እናክላለን።

ተጠቃሚዎች የሌሎች ተጠቃሚዎች መረጃን ማረም እንደማይችሉ ለማረጋገጥ፣ ልክ እንደ አንድ ሁለተኛ ተጠቃሚ ሆነን መግባት መቻል ይኖርብናል። በዝርዝር 10.23 ላይ እንደሚታየው፣ ይህ ማለት በእቃወች ፋይል ውስጥ እንደ ሁለተኛ ተጠቃሚ ሁኖ የሚያገለግል አንድ ተጨማሪ ተጠቃሚን ማከል ማለት ነው፡፡

ዝርዝር 10.23: አንድ ሁለተኛ ተጠቃሚን በእቃወች ፋይል ውስጥ ማከል። test/fixtures/teteqamis.yml
michael:
  sim: Michael Abnet
  emelekt: michael@misalei.com
  password_digest: <%= Teteqami.fech('mehlefeqal') %>

ermias:
  sim: Ermias Leake
  emelekt: duchess@example.gov
  password_digest: <%= Teteqami.fech('mehlefeqal') %>

ዝርዝር 9.24 ውስጥ የተበየነውን የ‘ግባ_እንደ (gba_ende) ዘዴን በመጠቀም ልክ እንደ ዝርዝር 10.24 ያሉ የ‘አርትዕ‘ን (edit) እና የ‘አዘምን (update) ተግባራትን መፈተን እንችላለን፡፡ የአንድ ሌላ ተጠቃሚ መረጃን ለማረም የሚሞክር አንድ ተጠቃሚ ቀድሞውኑ የገባ ስለሆነ፣ ተጠቃሚውን ወደ መግቢያ መንገዱ ከማዟዟር ይልቅ ወደ ስረ መንገዱ እንደምናዟዙረው እዚህ ላይ አስተውሉ፡፡

ዝርዝር 10.24: የሌላ ተጠቃሚ መረጃን ለማረም የሚሞክር የተሳሰተ ተጠቃሚን መፈተን። ቀይ 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
    gba_ende(@lela_teteqami)
    get edit_teteqami_path(@teteqami)
    assert flash.empty?
    assert_redirected_to root_url
  end

  test "እንደ የተሳሳተ ተጠቃሚ ሲገባ ዝመናው ማዟዟር አለበት" do
    gba_ende(@lela_teteqami)
    patch teteqami_path(@teteqami), params: { teteqami: { sim: @teteqami.sim,
                                              emelekt: @teteqami.emelekt } }
    assert flash.empty?
    assert_redirected_to root_url
  end
end

የሌላ ተጠቃሚ መገለጫን ለማረም የሚሞክሩ ተጠቃሚዎችን ለማዟዟር፣ እሱን ከሚጠራው አንድ የቅድመአጣሪ ዘዴ ጋር አንድ ትክክለኛ_ተጠቃሚ (tkklegna_teteqami) የተባለ ሁለተኛ ዘዴን እናክላለን (ዝርዝር 10.25)። የ‘ትክክለኛ_ተጠቃሚ (tkklegna_teteqami) ቅድመአጣሪው አንድ የ‘@ተጠቃሚ (@teteqami) ተለዋዋጪን እንደሚበይን አስተውሉ፣ ስለሆነም ዝርዝር 10.25 በ‘አርትዕ (edit) እና በ‘አዘምን (update) ተግባር ውስጥ የ‘@ተጠቃሚ (@teteqami) ምደባወችን ማስወገድ እንደምንችል ያሳያል፡፡

ዝርዝር 10.25: የእርትዖት/የዝመና ገጾችን ለመጠበቅ አንድ ቅድመአጣሪ ማከል። አረንጓዴ app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
  before_action :gb_teteqami, only: [:edit, :update]
  before_action :tkklegna_teteqami,   only: [:edit, :update]
  .
  .
  .
  def edit
  end

  def update
    if @teteqami.update(teteqami_negariaseitoch)
      flash[:success] = "መገለጫው ተዘምኗል"
      redirect_to @teteqami
    else
      render 'edit'
    end
  end
  .
  .
  .
  private

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

    # ቅድመአጣሪወች

    # አንድ የገባ ተጠቃሚን ያረጋግጣል።
    def gb_teteqami
      unless gebtual?
        flash[:danger] = "እባክዎትን ይግቡ"
        redirect_to gba_url
      end
    end

    # ትክክለኛውን ተጠቃሚ ያረጋግጣል።
    def tkklegna_teteqami
      @teteqami = Teteqami.find(params[:id])
      redirect_to(root_url) unless @teteqami == ahun_teteqami
    end
end

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

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

በመጨረሻም፣ ኮዱን ለማጣራት፣ በሬይልስ ውስጥ የተለመደውን አንድ ደንብ በመከተል ከ‘ትክክለኛ_ተጠቃሚ (tkklegna_teteqami) ቅድመአጣሪው ጋር ጥቅም ላይ የሚውል አንድ ዓሁን_ተጠቃሚነውን? (ahun_teteqami?) የተባለ የቡልየን ዘዴን እንበይናለን። ይህንን የመሰለ ኮድ:-

unless @teteqami == ahun_teteqami

የበለጠ ግልጽ በሆነ ኮድ ለመተካት ይህንን ዘዴ እንጠቀማለን:-

unless ahun_teteqami?(@teteqami)

ውጤቱ በዝርዝር 10.27 ውስጥ ይታያል፡፡ teteqami && teteqami == ahun_teteqami የሚለውን ኮድ በመጻፍ እንዲሁ ተጠቃሚ (teteqami) ምንም (nil) በሚሆንበት ጊዜ (ጠርዝ መዛዡን (ችግር‘ም)) እንደምንይዝ አስተውሉ፡፡5 እንዲሁም ዝርዝር 10.27ክፍል 9.3.2.1 ላይ ክፍለጊዜውን ለማስተካከል ለተሰጠው መልመጃ የሚሆነውን መልስ እንዳካተተ አስተውሉ፤ ስለሆነም ያንን መልመጃ ካላጠናቀቃችሁ፣ የተጠቃሚ ቅርጸታችሁን ዝርዝር 9.36 ላይ በተካተተው ኮድ ማዘመናችሁን አረጋግጡ፡፡

ዝርዝር 10.27: የ‘ዓሁን_ተጠቃሚነውን? (ahun_teteqami?) ዘዴ። app/helpers/sessions_helper.rb
module SessionsHelper

  # የቀረበ ተጠቃሚን ማግባት።
  def gba(teteqami)
    session[:teteqami_id] = teteqami.id
    # ከክፍለጊዜ ዳግመጫወታ ጥቃቶች መጠበቅ፡፡
    # ለተጨማሪ መረጃ https://bit.ly/33UvK0w ላይ ተመልከቱ።
    session[:yismule_kflegzie] = teteqami.yismule_kflegzie
  end

  # በቀጣይ ክፍለጊዜ ውስጥ አንድ ተጠቃሚን ይዘክራል።
  def zekr(teteqami)
    teteqami.zekr
    cookies.permanent.encrypted[:teteqami_id] = teteqami.id
    cookies.permanent[:zkre_ysmula] = teteqami.zkre_ysmula
  end

  # ከዝክረ ይስሙላ ብስኩቱ ጋር የተዛመደ ተጠቃሚን ይመልሳል።
  def ahun_teteqami
    if (teteqami_id = session[:teteqami_id])
      teteqami = Teteqami.find_by(id: teteqami_id)
      if teteqami && session[:yismule_kflegzie] == teteqami.yismule_kflegzie
        @ahun_teteqami = teteqami
      end
    elsif (teteqami_id = cookies.encrypted[:teteqami_id])
      teteqami = Teteqami.find_by(id: teteqami_id)
      if teteqami && teteqami.teregagtualn?(cookies[:zkre_ysmula])
        gba teteqami
        @ahun_teteqami = teteqami
      end
    end
  end

  # የቀረበው ተጠቃሚ የአሁንተጠቃሚ ከሆነ እውነት ይመለሳል።
  def ahun_teteqami?(teteqami)
    teteqami && teteqami == ahun_teteqami
  end
  .
  .
  .
end

ቀጥተኛውን ንጽጽር በቡልየን ዘዴ መተካቱ፣ በዝርዝር 10.28 ውስጥ የተመለከተውን ኮድ ይሰጣል፡፡

ዝርዝር 10.28: የመጨረሻው የ‘ትክክለኛ_ተጠቃሚ (tkklegna_teteqami) ቅድመአጣሪ። አረንጓዴ app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
  before_action :gb_teteqami, only: [:edit, :update]
  before_action :tkklegna_teteqami,  only: [:edit, :update]
  .
  .
  .
  def edit
  end

  def update
    if @teteqami.update(teteqami_negariaseitoch)
      flash[:success] = "መገለጫው ተዘምኗል"
      redirect_to @teteqami
    else
      render 'edit'
    end
  end
  .
  .
  .
  private

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

    # ቅድመአጣሪወች

    # አንድ የገባ ተጠቃሚን ያረጋግጣል።
    def gb_teteqami
      unless gebtual?
        flash[:danger] = "እባክዎትን ይግቡ"
        redirect_to gba_url
      end
    end

    # ትክክለኛውን ተጠቃሚ ያረጋግጣል።
    def tkklegna_teteqami
      @teteqami = Teteqami.find(params[:id])
      redirect_to(root_url) unless ahun_teteqami?(@teteqami)
    end
end

መልመጃዎች

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

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

  1. ሁለቱንም የ‘አርትዕ (edit) እና የ‘አዘምን (update) ተግባሮችን መጠበቁ ለምን አስፈለገ?
  2. በአንድ አሳሽ ውስጥ የትኛውን ተግባር በቀላሉ መፈተን ይቻላል?

10.2.3 ወዳጃዊ ትልልፍ

የጣቢያችን ፈቀዳ አሁን ባለበት መልኩ ተጠናቋል፣ ነገር ግን አንድ ትንሽ የተበላሸ ነገር አለው፤ ለምሳሌ አንድ ተጠቃሚ፣ አንድ የተጠበቀ ገጽን ለመድረስ ወይም ወደየትኛውም ቦታ ለመሄድ ቢሞክር፣ በአሁኑ ጊዜ ወደ ራሱ መገለጫ እንዲዟዟር ይደረጋል። በሌላ አነጋገር፣ በድሩ ውስጥ ያልገባ ተጠቃሚ፣ የአርትዖት ገጹን ለመጎብኘት ቢሞክር፣ ተጠቃሚው ከገባ በኋላ ተጠቃሚውን ወደ /ተጠቃሚወች/1 (/teteqamis/1) ከማዟዟር ይልቅ ወደ ፈለገበት /ተጠቃሚወች/1/አርትዕ (/teteqamis/1/edit) እንዲዟዟር ይደረጋል ማለት ነው፡፡ ተጠቃሚውን ወዳሰበው መዳረሻ ማዟዟሩ የበለጠ አክብሮት ያለው ወዳጃዊ ትልልፍ ይሆናል፡፡

ከላይ የተዘረዘረውን ተግበር ላይ ለማዋል፣ የአፕልኬሽኑ ኮድ በአንጻሩ የተወሳሰበ ቢሆንም፤ በዝርዝር 10.17 ውስጥ የመግባትን እና የአርትዖት ገጽ ቅደም ተከተልን በማገላበጥ እና፣ የአርትዖት ገጹን በመጎብኘት ብቻ ለወዳጃዊ ትልልፉ አንድ እጅግ በጣም ቀላል ፈተናን መጻፍ እንችላለን። በዝርዝር 10.29 ላይ እንደሚታየው፣ የተገኘው የፈተና ውጤት፣ የአርትዖት ገጽን ለመጎብኘት ይሞክራል፣ ከዚያ ይገባል፣ ከዚያም ተጠቃሚውን ወደ ነባሪው የተጠቃሚ መገለጫ ገጽ ከማዟዟር ይልቅ፣ ተጠቃሚው ወደ አርትዖት ገጽ መዟዟሩን ያረጋግጣል፡፡ (ዝርዝር 10.29 የአርትዖት ዝግጁገጽታውን ማቅረቡ ካሁን ወዲያ የሚጠበቅ ባህሪ ስላልሆነ፣ ያንን ፈተናም አስወግዷል፡፡)

ዝርዝር 10.29: ለወዳጃዊ ትልልፍ የሚሆን አንድ ፈተና ቀይ 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)
    gba_ende(@teteqami)
    assert_redirected_to edit_teteqami_url(@teteqami)
    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

አሁን አንድ የወደቀ ፈተና ስላለን፣ ወዳጃዊ ትልልፉን ለመተግበር ዝግጁ ነን፡፡ ተጠቃሚዎችን ወደታሰበው መድረሻ ለማስተላለፍ፣ የተጠየቀውን የገጽ አድራሻ የሆነቦታ ላይ ማከማቸት አለብን፣ ይህንንም በክፍለጊዜ ረጅ ውስጥ አንድ አድራሻ_አስቀምጤ (adrasha_askemtie) በተባለ ዘዴ ውስጥ እናሽገዋለን (ዝርዝር 10.30)፡፡

ዝርዝር 10.30: የትልልፉ ዓ.አ.ሃ.አውን ማከማቻ ኮድ፡፡ ቀይ app/helpers/sessions_helper.rb
module SessionsHelper
  .
  .
  .
  # ለመደረስ የሚሞከር ዓ.አ.ሃ.አን ማስቀመጫ።
  def adrasha_askemtie
    session[:adrasha_astelalfie] = request.original_url if request.get?
  end
end

እዚህ ላይ ተጠቃሚወች ሊተላለፉበት የሚፈልጉትን ዓ.አ.ሃ.አ ለማስቀመጥ የሚያስችለን የአሰራር ዘዴ በክፍል 8.2.1 ላይ ተጠቃሚን ለማስገባት የተጠቀምንበት የ‘ክፍለጊዜ (session) አገልግሎት ጋር አንድ አይነት ነው፡፡ ዝርዝር 10.30 በተጨማሪ የተጠየቀውን የገጽ ዓ.አ.ሃ.አ ለማግኘት የ‘ጠይቅ (request) ቁስን (በ‘ጠይቅ.የመጀመሪያው_ዓአሃአ (request.original_url) በኩል) ይጠቀማል፡፡ በዝርዝር 10.30 ውስጥ ያለው የ‘አድራሻ_አስቀምጤ (adrasha_askemtie) ዘዴ ተጠቃሚው መጎብኘት የፈለገውን ዓ.አ.ሃ.አ በ‘ክፍለጊዜ (session) ተለዋዋጪ ውስጥ ባለው :አድራሻ_አስተላልፌ (:adrasha_astelalfie) ቁልፍ ላይ ያስቀምጠዋል፣ ነገር ግን ይህ ተቀባይነት የሚኖረው ለ‘ዓግኝ (GET) መጠይቅ ብቻ ይሆናል፡፡

ይህ አንድ ተጠቃሚ ሳይገባ አንድ ቅጽን ቢያስረክብ፣ ተጠቃሚው ወደፈለገበት ለመውሰድ የሚያገለግለውን የትልልፍ ዓ.አ.ሃ.አ በ‘አድራሻ_አስቀምጤ (adrasha_askemtie) ላይ እንዳያስቀምጥ ይከላከላል፡፡ (ይህ አንድ የጠርዝ ጉዳይ (ያልተለመደ ችግር) ነው፤ ነገር ግን ለምሳሌ ተጠቃሚው አንድ ቅጽን ከማስረከቡ በፊት በአሳሹ ላይ ያሉትን ብስኩቶች ቢደመስሳቸው እና ቅጹን ቢያስረክብ ይህ ችግር ሊከሰት ይችላል፡፡) በእንደዚህ ዓይነት ሁኔታ ላይ የሚገኘው የመዟዟር ውጤት የአንድ የ‘ዓስቀምጥ (POST)፣ የ‘ዓዘምን (PATCH)፣ ወይም የአንድ የ‘ሠርዝ (DELETE) ወደ ሚጠብቅ አንድ ዓ.አ.ሃ.አ አንድ የ‘ዓግኝ (GET) መጠይቅን እንዲሰጥ ይጠይቃል፤ ስለሆነም አንድ ስህተት እንዲፈጠር ያደርጋል። ጠይቅ.አግኝ? ከሆነ‘ን (if request.get?) ማከሉ ይህ ስህተት እንዳይከሰት ይከላከላል፡፡6

አድራሻ_አስቀምጤ‘ን (adrasha_askemtie) ለመጠቀም፣ በዝርዝር 10.31 ላይ እንደሚታየው፣ እሱኑ በ‘ግብ_ተጠቃሚ (gb_teteqami) ቅድመአጣሪ ውስጥ ማከል ይኖርብናል።

ዝርዝር 10.31: አድራሻ_አስቀምጤ‘ን (adrasha_askemtie) ከተጠቃሚ ግብ ቅድመአጣሪ ውስጥ ማከል። ቀይ app/controllers/teteqamis_controller.rb
class TeteqamisController < ApplicationController
  before_action :gb_teteqami, only: [:edit, :update]
  before_action :tkklegna_teteqami,  only: [:edit, :update]
  .
  .
  .
  def edit
  end
  .
  .
  .
  private

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

    # ቅድመአጣሪወች

    # አንድ የገባ ተጠቃሚን ያረጋግጣል።
    def gb_teteqami
      unless gebtual?
        adrasha_askemtie
        flash[:danger] = "እባክዎትን ይግቡ"
        redirect_to gba_url
      end
    end

    # ትክክለኛውን ተጠቃሚ ያረጋግጣል።
    def tkklegna_teteqami
      @teteqami = Teteqami.find(params[:id])
      redirect_to(root_url) unless ahun_teteqami?(@teteqami)
    end
end

ትልልፉን ለመተግበር፣ ትልልፉ ከኖረ ወደ ሚያስተላልፈው ዓ.አ.ሃ.አ ካልኖረ ደግሞ ወደ አንድ ነባሪ ዓ.አ.ሃ.አ እናስተላልፈዋለን፣ ይህንንም ከተሳካ ግባት በኋላ ወደ ተፈለገው ዓ.አ.ሃ.አ እንዲያስተላልፍ፣ በክፍለጊዜወች መቆጣጠሪያ የ‘ፍጠር (create) ተግባር ውስጥ እናክለዋለን፡፡ የ‘ክፍለጊዜ_እንደገናአስጀምር (reset_session) (የክፍለጊዜ ጥገና ጥቃቶችን ለመከላከል በዝርዝር 8.15 ውስጥ ታክሏል) ጥሪን ከማድረጋችን በፊት፣ በመጀመሪያ በክፍለጊዜው ውስጥ ያለውን የአድራሻ አስተላልፌ ዓ.አ.ሃ.አውን (ካለ) ጎትተን ማውጣት አለብን:-

adrasha_astelalfie = session[:adrasha_astelalfie]
reset_session
gba teteqami

ካለ ወደዚያው ዓ.አ.ሃ.አ፣ ምንም (nil) ከሆነ ደግሞ ወደ ተጠቃሚው መገለጫ ማዟዟር እንችላለን:-

redirect_to adrasha_astelalfie || teteqami

ውጤቱ በዝርዝር 10.32 ውስጥ ይታያል፡፡ (አስተውሉ:- በክፍል 9.3.1.1 ውስጥ የተሰጠውን መልመጃ ካጠናቀቃችሁ፣ በዝርዝር 10.32 ውስጥ ያለውን ተጠቃሚ (teteqami) በ@ተጠቃሚ (@teteqami) መተካት አለባችሁ፡፡)

ዝርዝር 10.32: የክፍለጊዜዎች የ‘ፍጠር (create) ተግባር ከወዳጃዊ ትልልፍ ጋር። አረንጓዴ app/controllers/sessions_controller.rb
class SessionsController < ApplicationController
  .
  .
  .
  def create
    teteqami = Teteqami.find_by(emelekt: params[:session][:emelekt].downcase)
    if teteqami && teteqami.authenticate(params[:session][:password])
      adrasha_astelalfie = session[:adrasha_astelalfie]
      reset_session
      params[:session][:ዘክረኝ] == '1' ? zekr(teteqami) : ersa(teteqami)
      gba teteqami
      redirect_to adrasha_astelalfie || teteqami
    else
      flash.now[:danger] = 'ልክ ያልሆነ የኤመልእክት/የይለፍ ቃል ጥምረት'
      render 'new'
    end
  end
  .
  .
  .
end

ዝርዝር 10.32 ውስጥ ለ‘ክፍለጊዜ_እንደገናአስጀምር (reset_session) የሚደረገው ጥሪ፣ የትልልፍ ዓ.አ.ሃ.አውን ከክፍለጊዜው በራስሰር እንደሚያስወግድ ልብ በሉ፣ ይህ አስፈላጊ ነገር ነው፣ ያለበለዚያ ግን ተጠቃሚው አሳሹን ዘግቶ እስካልወጣ ድረስ ተከታታይ የመግባት ሙከራዎችን ወደ ተጠበቀው/ጥብቁ ገጽ ያስተላልፋል። (ይህንን የመፈተኑ ጉዳይ፣ እንደ አንድ መልመጃ ይሆናችሁ ዘንድ ለናንተ ተትቷል (ክፍል 10.2.3.1)።)

በዚህም፣ በዝርዝር 10.29 ውስጥ ያለው የወዳጃዊ ትልልፍ የውህደት ፈተና ማለፍ ይኖርበታል፣ እናም መሰረታዊው የተጠቃሚ ማረጋገጫ እና የገጽ ጥበቃ ትግበራው እዚህ ላይ ይጠናቀቃል። እንደተለመደው ከመቀጠላችን በፊት የፈተና ስብስቡ አረንጓዴ መሆኑን ማረጋገጡ አንድ ጥሩ ልምድ ነው፡-

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

መልመጃዎች

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

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

  1. ወዳጃዊ ትልልፉ የቀረበለትን ዓ.አ.ሃ.አ ለመጀመሪያ ጊዜ ብቻ እንደሚያስተላልፍ የሚያረጋግጥ አንድ ፈተና ጻፉ፡፡ ይህ ማለት ተደጋጋሚ ለሆኑ የመግባት ሙከራዎች፣ ወደ ነባሪው ዓ.አ.ሃ.አ ማስተላለፍ ይኖርበታል ማለት ነው (ለምሳሌ ወደተጠቃሚው መገለጫ ገጽ)፡፡ ጠቃሚ ምክር:- በዝርዝር 10.29 ላይ፣ የ‘ክፍለጊዜ[:አድራሻ_አስተላልፌ] (session[:adrasha_astelalfie]) ዋጋ ምን መሆን እንዳለበት የሚፈትሽ አንድ ፈተናን አክሉ፡፡
  2. በክፍለጊዜወች መቆጣጠሪያ የ‘አዲስ (new) ተግባር ላይ፣ አንድ የ‘አራሚ (debugger) ዘዴን አስቀምጡ፤ ከድሩ ከወጣችሁ በኋላ /ተጠቃሚወች/1/አርትዕ‘ን (/teteqamis/1/edit) ጎብኙ (ክፍል 7.1.3)። የ‘ክፍለጊዜ[:አድራሻ_አስተላልፌ] session[:adrasha_astelalfie] ዋጋ ትክክል መሆኑን በአራሚው ውስጥ አረጋግጡ። ጠይቅ.አግኝነውን? (request.get?) ዘዴን በመጠቀም ለ‘አዲስ (new) ተግባር የሚቀርበው የመጠይቅ ዋጋ ምን እንደሆነ እወቁ። (አንዳንድ ጊዜ ዲባገርን በመናኸሪያው ውስጥ ስትጠቀሙ፣ ሊረጋ ወይም እንግዳ የሆነ ባህሪ ሊያሳይ ይችላል፤ ይህንን ችግር ለመፍታት ማድረግ የሚኖርባችሁ አንድ ነገር ቢኖር፣ እንደተለመደው ቴክኒካዊ ብልህነታችሁን መጠቀም ይሆናል፡፡ (ሰንጠረዥ 1.2)።)

10.3 ሁሉንም ተጠቃሚዎች ማሳየት

በዚህ ክፍል ውስጥ፣ የተጠቃሚ ተግባሮችን ከማገባደዳችን በፊት፣ ከአንድ ተጠቃሚ ይልቅ ሁሉንም ተጠቃሚዎች ለማሳየት የተቀየሰውን የ‘ማውጫ (index) ተግባርን እናክላለን፡፡ በዚህ ሂደት ላይ፣ ውሂበጎታውን እንዴት አድርገን በናሙና ተጠቃሚዎች መዝራት እንደምንችል እና የማውጫ ገጹ ብዙ ተጠቃሚዎችን ለማሳየት እንዲችል፣ የተጠቃሚወች ውጽዓትን እንዴት አድርገን ገጸቁጥር (Paginate) እንደምናደርግ እንማራለን፡፡ ይህንን ውጤት የሚያሳየው ስእላዊ መግለጫ፣ የተጠቃሚወች የገጸቁጥር አገናኞችን እና አንድ የ“ተጠቃሚዎች” ዳሳሽ አገናኝን አካቶ በምስል 10.8 ላይ ይታያል። በክፍል 10.4 ውስጥ በተጠቃሚዎች ማውጫ ገጽ ላይ አንድ የአስተዳደር በይነገጽን እናክላለን፤ ስለሆነም ተጠቃሚዎችም እንዲሁ ሊጠፉ ይችላሉ።

images/figures/user_index_mockup_bootstrap
ምስል 10.8: አንድ የተጠቃሚዎች የማውጫ ገጽ ስእላዊ መግለጫ።

10.3.1 የተጠቃሚዎች ማውጫ

የተጠቃሚዎች ማውጫ ስራን ለመጀመር፣ በመጀመሪያ አንድ የጥበቃ ቅርጸትን ተግባራዊ እናደርጋለን፡፡ ምንም እንኳን የእያንዳንዱ ተጠቃሚ የማሳያ (show) ገጽ በሁሉም የጣቢያው ጎብኝዎች የሚታይ ቢሆንም፤ የተጠቃሚ ማውጫ (index) ገጽ ግን፣ በጣቢያው ላይ ለተመዘገቡ/ለገቡ ተጠቃሚዎች ብቻ በመፍቀድ እና በጣቢያው ላይ ላልተመዘገቡ ሰወች ደግሞ፣ ምን ያህል የተጠቃሚዎች ዝርዝር ብዛትን ማየት እንደሚችሉ ገደብ በማድረግ በነባሪነት ሊያዩት የሚችሉትን የተጠቃሚዎች ዝርዝር እናቀርብላቸዋለን።7

የ‘ማውጫ (index) ገጹን ካልተፈቀደ ድርሻ ለመጠበቅ፣ የ‘ማውጫ (index) ተግባር በትክክል ማዟዟሩን ለማረጋገጥ በመጀመሪያ አንድ አጪር ፈተና እናክላለን (ዝርዝር 10.34)።

ዝርዝር 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)፡፡

ዝርዝር 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 ላይ እናስወግደዋለን።)

ዝርዝር 10.36: የተጠቃሚ የ‘ማውጫ (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)፡፡

ዝርዝር 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 ዓይነቱን የአጻጻፍ ቅጥ መጠቀም ከፈለጋችሁም እሰየው!! ምርጫችሁ የተጠበቀ ነው፡፡)

ዝርዝር 10.38: በ‘አምሳያ_ለ (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)።

ዝርዝር 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 ውስጥ ይታያል፡፡

በዚያ፣ የተጠቃሚዎች ማውጫ ሙሉ በሙሉ በመስራት ላይ እና ፈተናወቹም እንደሚከተለው አረንጓዴቢሆኑም:-

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

በሌላ በኩል ግን በምስል 10.9 ላይ እንደሚታየው፣ ብቸኛ መሆን ትንሽ… ያሳዝናል፡፡ እስኪ ይሄን አሳዛኝ ሁኔታ አብረን እንፍታ።

images/figures/user_index_only_one
ምስል 10.9: የተጠቃሚዎች ማውጫ ገጽ አንድ ብቸኝነት ካጠቃው ተጠቃሚ ጋር (አያሳዝንም?)።

መልመጃዎች

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

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

  1. አሁን በጣቢያው ገጽታ ውስጥ የሚገኙ አገናኞችን በሙሉ በሚገባ ሞልተን ጨርሰናል፡፡ ለሁሉም የጣቢያው ገጽታ አገናኞች እንዲሁም ለገቡ እና ላልገቡ ተጠቃሚዎች የሚገባቸውን ባህሪ መያዛቸውን የሚያረጋግጥ አንድ የውህደት ፈተና ጻፉ፡፡ ጠቃሚ ፍንጪ:- የ‘ግባ_እንደ (gba_ende) ረጅን ተጠቀሙ እና በዝርዝር 5.32 ውስጥ የተዘረዘሩትን ሂደቶች በመከተል ፈተኖቹን መጻፍ ትችላላችሁ፡፡

10.3.2 የናሙና ተጠቃሚዎች

በዚህ ክፍል ውስጥ ጓደኛ አልባ የሆነውን እንኮ ተጠቃሚ ትንሽ ጓደኞች እንጨምረዋለን (የምን ብቸኝነት ነው)፡፡ በእርግጥ በቂ የሆኑ ተጠቃሚዎችን በማውጫ ገጹ ላይ ለማስፈር ድርአሳሽ ላይ ያለውን የመመዝገቢያ ቅጽ በመጠቀም አንድ ባንድ አዲስ ተጠቃሚዎችን በእጅ መፍጠር ይቻላል፣ ነገር ግን ከዛ እጅግ የተሻለው መፍትሔ ተጠቃሚዎቹን ለእኛ እንዲፈጥርልን ሩቢን መጠቀም ነው፡፡

በመጀመሪያ፣ የአስመሳይ (Faker) እንቁን በ‘እንቁፋይል (Gemfile) ውስጥ እናክላለን፣ ይህም የናሙና ተጠቃሚዎችን ከፊል-ተጨባጪነት ካላቸው ስሞች እና የኤመልእክት አድራሻዎች ጋር እንድንፈጥር ያስችለናል (ዝርዝር 10.42)።8 (ብዙውን ጊዜ አስመሳይ እንቁን በአንድ ማበልጸጊያ አካባቢ ብቻ መጠቀሙ የተለመደ ስለሆነ እናንተም እንደዛ ልታደርጉ ትፈልጉ ይሆናል፣ ያም መልካም ነው፣ ነገር ግን አፕልኬሽናችንን በተመለከተ በምርት ጣቢያችን ላይም እንጠቀምበታለን (ክፍል 10.5)፡፡)

ዝርዝር 10.42: አስመሳይ እንቁን በ‘እንቁፋይል (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 ውስጥ ያለው ኮድ ትንሽ ረቀቅ ያለ ነው፤ ስለሆነም እያንዳንዱ ኮድ ምን እንደሚያደርግ በዝርዝር ለማወቅ ብዙ መጨነቅ አይኖርባችሁም።)

ዝርዝር 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 እንደሚታየው፣ የመጀመሪያዎቹን ጥቂት ተጠቃሚዎች የኤመልእክት አድራሻቸውን ከአምሳያቸው ጋር በማዛመድ በነባሪ ከመጡት አምሳያወች የተለዩ እንዲሆኑ አድርጊያቸዋለሁ።

images/figures/user_index_all
ምስል 10.10: የተጠቃሚዎች ማውጫ ገጽ ከ 100 የናሙና ተጠቃሚዎች ጋር።

መልመጃዎች

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

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

  1. የሌላ ተጠቃሚ የአርትዖት ገጽን ለመጎብኘት የመሞከሩ ውጤት በክፍል 10.2.2 ላይ እንዲሆን ወደተፈለገው አንድ አድራሻ የሚያዟዙር መሆኑን አረጋግጡ።

10.3.3 ገጸቁጥር

የመጀመሪያው ተጠቃሚያችን አሁን በብቸኝነት አይሰቃይም፣ ነገር ግን በተቃራኒው አሁን ብዙ ጓደኞች ስላሉት አንድ የሆነ ችግር ፈጥረውብናል፤ ችግሩም የዚህ ተጠቃሚ ጓደኞች በሙሉ በአንድ ገጽ ላይ ፈጠው መታየታቸው ነው፡፡ አሁን በዚህ ጣቢያ ውስጥ አንድ መቶ ተጠቃሚዎች አሉ፣ ይህም አንድ ማበልጸጊያ ላይ ላለ ጣቢያ በቂ የሆነ የተጠቃሚ ብዛት ቢሆንም፣ በአንድ የምርት ጣቢያ ላይ ግን በሽወች የሚቆጠሩ ተጠቃሚዎች ሊኖሩ ይችላሉ። ለዚህ ችግር መፍትሔው ተጠቃሚዎቹን ገጸቁጥር ማድረግ ነው፣ ስለሆነም በሆነ ጊዜ በአንድ ገጽ ላይ ለምሳሌ 30 ተጠቃሚዎች ብቻ እንዲታዩ ማድረግ እንችላለን።

በሬይልስ ውስጥ በርካታ የገጸቁጥር ዘዴወች አሉ፤ በጣም ቀላል እና በጣም ቀልጣፋ የሆነውን ዊል_ገጽቁጥርስጥ (will_paginate) የተባለውን ዘዴ እንጠቀማለን፡፡ እሱን ለመጠቀም ዊል_ገጽቁጥርስጥ (will_paginate) የተባለውን እንቁን እና ቡትስትራፕ ገጸቁጥርን ቅጥ ለማድረግ እንዲጠቀምበት የሚያዋቅርለትን የ‘ቡትስትራፕ-ዊል_ገጸቁጥር (bootstrap-will_paginate) እንቁን በጀም ፋይል ውስጥ ማካተት ይኖርብናል፡፡ የዘመነው የ‘እንቁፋይል (Gemfile) በዝርዝር 10.4410 ውስጥ ይታያል፡፡

ዝርዝር 10.44: በ‘እንቁፋይል (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) በማከል እንጀምራለን። ይህንን ኮድ ለምን ከተጠቃሚዎች ዝርዝር በታች እና በላይ እንዳደረግነው ከትንሽ ጊዜ በኋላ እናያለን፡፡

ዝርዝር 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) በራስሰር የመነጨ ነው፡፡

ዝርዝር 10.46: በ‘ማውጫ (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) ከተጠቃሚው ዝርዝር በላይ እና በታች ስላደረግን፣ አሁን ገጸቁጥሮቹ እስከነ አገናኛቸው ከላይ እና ከታች ይታያሉ፡፡

images/figures/user_index_pagination
ምስል 10.11: የተጠቃሚዎች የማውጫ ገጹ ከገጸቁጥር ጋር፡፡

ምስል 10.12 ላይ እንደሚታየው 2 ቁጥር ወይም “ቀጣይ” የሚለውን አገናኝ ላይ አሁን ጠቅ ብታደርጉ፣ የሁለተኛውን ገጽ ውጤት ታገኛላችሁ።

images/figures/user_index_page_two
ምስል 10.12: የሁለተኛው (2) ገጽ የተጠቃሚዎች ማውጫ እይታ።

መልመጃዎች

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

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

  1. ሰሌዳው ላይ ለገጹ ዋጋ ምንም‘ን (nil) በማዘጋጀት፣ የመጀመሪያው ገጽ ተጠቃሚዎችን ጎትቶ እንደሚያወጣ አረጋግጡ፡፡
  2. የገጸቁጥር (Pagination) ቁስ የየትኛው የሩቢ ክፍል አባል ነው? ከ‘ሁሉም.ተጠቃሚ (Teteqami.all) የሩቢ ክፍል አባል ጋር ሲነጻጸርስ?

10.3.4 የተጠቃሚዎች ማውጫ ፈተና

አሁን የተጠቃሚዎች ማውጫ ገጻችን እየሰራ ስለሆነ፣ አንድ ቀለል ያለ ፈተና እንጽፋለን፤ ክፍል 10.3.3 ላይ ላለው ገጸቁጥርም እንደዚሁ አነስተኛ ፈተናን እንጽፋለን። ሃሳቡ መጀመሪያ ወደ ድሩ መግባት፣ ከዚያ የማውጫ መንገዱን መጎብኘት፣ ከዚያ የተጠቃሚዎች የመጀመሪያ ገጽ እና ገጸቁጥር እንዳለ ማረጋገጥ ይሆናል፡፡ እነዚህ የመጨረሻ ሁለት ሂደቶች ተግባር ላይ ይውሉ ዘንድ፣ ገጸቁጥርን ለመጥራት፣ በፈተና ውሂበጎታችን ውስጥ ቢያንስ ቢያንስ ከ 30 በላይ የሚሆኑ ተጠቃሚዎች ሊኖሩን ይገባል፡፡

ዝርዝር 10.23 ላይ በእቃወች ፋይል ውስጥ አንድ ሁለተኛ ተጠቃሚን ፈጥረን ነበር፣ ነገር ግን 30 ወይም ከዚያም በላይ የሆኑ ተጠቃሚዎችን በእጅ መፍጠሩ ትንሽ ይከብዳል፡፡ እንደ እድል ሆኖ ግን፣ በእቃወች ፋይል ውስጥ ለእቃ ተጠቃሚ የ‘መሕለፈቃል_ፈጪ (password_digest) ባሕሪ ላይ እንዳየነው፣ የእቃ ፋይሎች ክት ሩቢን ይደግፋሉ፣ ይህ ማለትም ልክ በዝርዝር 10.47 ውስጥ እንደሚታየው፣ 30 ተጨማሪ ተጠቃሚዎችን መፍጠር እንችላለን ማለት ነው፡፡ (ዝርዝር 10.47 ለወደፊቱ የሚያገለግሉ ሌሎች ሁለት የተሰየሙ ተጠቃሚዎችንም ፈጥሯል።)

ዝርዝር 10.47: 30 ተጨማሪ ተጠቃሚዎችን በእቃወች ፋይል ውስጥ ማከል። 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 ውስጥ ይታያል፡፡

ዝርዝር 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

የፈተና ስብስቡ ውጤት አረንጓዴ መሆን አለበት:-

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

መልመጃዎች

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

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

  1. ዝርዝር 10.45 ውስጥ ያሉ የገጸቁጥር አገናኞች ላይ አስተያየት በማድረግ፣ በዝርዝር 10.48 ላይ ያለው ፈተና ቀይእንደሚሆን አረጋግጡ፡፡
  2. አንዱ የ‘ዊል_ገጽቁጥርስጥ (will_paginate) ጥሪ ላይ ብቻ አስተያየት ብታደርጉ፣ አሁንም ፈተናው አረንጓዴእንደሚሆን አረጋግጡ። የሁለቱም የ‘ዊል_ገጽቁጥርስጥ (will_paginate) አገናኞች መኖራቸውን እንዴት መፈተን ይቻላል? ጠቃሚ ፍንጪ:- ሰንጠረዥ 5.2 ላይ የሚገኘውን የ‘ቁጠር (count) ዘዴን ተጠቀሙ።

10.3.5 በከፊል ኮድን ማጣራት

ገጸቁጥር የተደረገለት የተጠቃሚዎች ማውጫ አሁን ተጠናቋል፣ ነገር ግን አንድ ሳላደርገው ማለፍ የማልፈልገው ማሻሻል አለ፤ ሬይልስ በጣም አስገራሚ የሆኑ፣ የተጠቀጠቁ ትይታዎችን መስሪያ አገልግሎት ላይ የሚውሉ መሳሪያዎች አሉት፣ እናም በዚህ ክፍል እነዚህን መሳሪያዎች እንዲጠቀም የማውጫ ገጹን እናጣራዋለን፡፡ ኮዳችን በጥሩ ሁኔታ የተፈተነ ስለሆነ፣ የጣቢያውን ተግባራት መስበር እንደማንችል እርግጠኞች በመሆን ኮዱን ማጣራት እንችላለን፡፡

ኮዱን ለማጣራት የመጀመሪያው ሂደት፣ በዝርዝር 10.45 ላይ የሚገኘውን የ‘ዓይነት-ዘርዝር (li) መለያን በአንድ የ‘አቅርብ (render) ጥሪ መተካት ይሆናል (ዝርዝር 10.50)፡፡

ዝርዝር 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)።

ዝርዝር 10.51: አንድ ነጠላ ተጠቃሚን የሚያቀርብ አንድ ከፊል። አረንጓዴ app/views/teteqamis/_teteqami.html.erb
<li>
  <%= amsaya_le teteqami, meten: 50 %>
  <%= link_to teteqami.sim, teteqami %>
</li>

ይህ በርግጠኝነት ትልቅ ለውጥ ቢሆንም፤ የ‘አቅርብ (render) ዘዴን በቀጥታ በ‘@ተጠቃሚዎች (@teteqamis) ተለዋዋጪ ላይ በመጥራት፣ ይህንን ከዚህ በበለጠ ልናሻሽለው እንችላለን (ዝርዝር 10.52)።

ዝርዝር 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 ውስጥ ያለው የሚያስደንቅ ጥቅጥቅ ያለ ኮድ ነው።

ሁልጊዜ ኮድን ከማጣራት በኋላ፣ ሁሉ ነገር በትክክል እንደሚሰራ ለማረጋገጥ መፈተን እንደሚገባ ሁሉ፣ የአፕልኬሽኑን ኮድ ከመለወጥ በኋላም የፈተና ስብስቡ አሁንም አረንጓዴ መሆኑን ማረጋገጥ አለባችሁ:-

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

መልመጃዎች

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

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

  1. ዝርዝር 10.52 ውስጥ የ‘አቅርብ (render) መስመር ላይ አስተያየት አድርጉ እና የተገኙት ፈተናዎች ቀይመሆናቸውን አረጋግጡ፡፡

10.4 ተጠቃሚዎችን መሰረዝ

አሁን የተጠቃሚዎች ማውጫ ገጽ ተጠናቋል፣ ስለዚህ ከመደበኛ የው.ሁ.ማ ተግባር ስብስብ ካለ አጥፋ (destroy) በስተቀር ሁሉንም የው.ሁ.ማ ተግባሮች ጨርሰናል ማለት ነው። በዚህ ክፍል ውስጥ በምስል 10.13 ስእላዊ መግለጫ ላይ እንደሚታየው፣ ተጠቃሚዎችን ለመሰርዝ አገናኞችን እናክል እና የመሰርዝ ሂደቱን ተግባር ላይ ለማዋል አስፈላጊውን የ‘አጥፋ (destroy) ተግባርን እንበይናለን፡፡ ይህንን ተግባር ላይ ለማዋል ፍቃዱ ያላቸው የድሩ አስተዳዳሪወች ብቻ ተጠቃሚዎችን መሰርዝ ይችሉ ዘንድ፣ መጀመሪያ አንድ የአስተዳደር ተጠቃሚዎች ክፍልን እንፈጥራለን፡፡ በፈቀዳ አውድ ውስጥ፣ እንደዚህ ያለ ልዩ የመብት ስብስብ ሚና (Role) በመባል ይታወቃል፡፡

10.4.1 የአስተዳደር ተጠቃሚዎች

መብት የተሰጣቸው አስተዳዳሪወችን ከሌሎች ተራ ተጠቃሚዎች ለመለየት፣ በተጠቃሚ ቅርጸቱ ውስጥ አንድ የቡልየን ዋጋ የተሰጠው አስተዳዳሪ (astedadari) የተባለ ባሕሪ ይኖረናል፤ ይህም ተጠቃሚው አስተዳዳሪ ነው ወይስ አይደለም ለማወቅ የሚያስችል አንድ አስተዳዳሪነውን? (astedadari?) የተባለ የቡልየን ዘዴን በራስሰር እንድንጠቀም አንድ እድልን ይሰጠናል። ለዚህ ስራ የሚያበቃን የውሂብ ቅድ በምስል 10.14 ውስጥ ይታያል፡፡

user_model_admin_3rd_edition
ምስል 10.14: የተጠቃሚ ቅዱ ከተጨመረ የ‘አስተዳዳሪ (astedadari) ቡልየን ባሕሪ ጋር።

እንደተለመደው፣ በማዘዥያ መስመሩ ላይ አንድ የ‘አስተዳዳሪ (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) የተባለውን እርምጃ ከወዲሁ መውሰዱ በጥብቅ አስፈላጊ አይደለም ማለት ነው፡፡ ይሁን እንጅ ኮዱን እንደዛ አድርጎ መጻፉ ለሬይልስ እና ለዚህ ኮድ አንባቢያን ሃሳባችንን በግልጽ ያስተላልፋል።)

ዝርዝር 10.54: አንድ የቡሊያን አስተዳዳሪ (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)።

ዝርዝር 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)።

መልመጃዎች

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

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

  1. ዝርዝር 10.56 ውስጥ ያለውን ይህን_ሙሉ የሚለውን ቦታ በትክክለኛው የፈተና ኮድ በመሙላት፣ የ‘አስተዳዳሪ (astedadari) ባሕሪን በድር በኩል ማረም እንደማይቻል አረጋግጡ፡፡ ፈተናው የሚፈለገውን ነገር በትክክል መፈተኑን ለማረጋግጥ፣ በተፈቀደው የ‘ተጠቃሚ_ነገሪአሴቶች (teteqami_negariaseitoch) ሰሚአሴት ዝርዝር ውስጥ አስተዳዳሪ‘ን (astedadari) አክሉ እና ፈተናው መጀመሪያ ቀይእንደሚሆን አረጋግጡ። መጨረሻ ላይ ላለው ይህን_ሙሉ የተዘመነውን የተጠቃሚ መረጃ ከውሂበጎታው አምጥታችሁ በድጋሚ መጫናችሁን አረጋግጡ (ክፍል 6.1.5)፡፡
ዝርዝር 10.56: የ‘አስተዳዳሪ (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

10.4.2 የማጥፋት ተግባር

የተጠቃሚዎች ሃብትን ለማጠናቀቅ የሚያስፈልገው የመጨረሻ ደረጃ ሂደት፣ የመሰርዝ አገናኖችን እና አንድ የ‘አጥፋ (destroy) ተግባርን ማከል ብቻ ነው። የአስተዳዳር ተጠቃሚዎች መዳረሻን በመገደብ፣ በተጠቃሚዎች ማውጫ ገጽ ላይ ለእያንዳንዱ ተጠቃሚ አንድ የመሰረዣ አገናኝን በማከል ስራችንን እንጀምራለን፡፡ ከውጤቱ የሚገኙት የ‘ "ሰርዝ" አገናኞች የሚታዩት የአሁንተጠቃሚው አስተዳዳሪ ከሆነ ብቻ ነው (ዝርዝር 10.57)።

የ‘ዘዴ: :ሰርዝ (method: :delete) ነጋሪአሴቱ፣ አገናኙ አስፈላጊውን የ‘ሠርዝ (DELETE) መጠይቅ እንዲያቀርብ፣ እንደሚያዘጋጀው ልብ ልትሉ ይገባል። አስተዳዳሪወች ብቻ ያዩዋቸው ዘንድ እያንዳንዱን አገናኝ በአንድ የ‘ከሆነ (if) ዓረፍተሐሳብ ውስጥም አስገብተናቸዋል። ለአስተዳዳሪ ተጠቃሚያችን የተገኘው ውጤት በምስል 10.15 ውስጥ ይታያል፡፡

የድር አሳሾች በተፈጥሯቸው የ‘ሠርዝ (DELETE) መጠይቅን መላክ አይችሉም፤ ስለሆነም ሬይልስ ጃቫስክሪፕትን በመጠቀም ይሸውዳቸዋል፡፡ ይህ ማለት አሳሹ ላይ ጃቫስክሪፕቱ እንዳይሰራ ከተደረገ፣ የ “ሰርዝ” አገናኞቹ አይሰሩም ማለት ነው፡፡ ጃቫስክሪፕት የሌላቸው አሳሾችን ግዴታ መደገፍ ካለባችሁ፣ አንድ ቅጽ ላይ አንድ የ‘ዓስቀምጥ (POST) መጠይቅን በመጠቀም የ‘ሠርዝ (DELETE) መጠይቅን በሃይላኛው መሸወድ ትችላላችሁ፣ ይህ ዘዴ አሳሹ ጃቫስክሪፕት ባይኖረውም ይሰራል።13

የመሰረዣ አገናኞች እንዲሰሩ ለማድረግ፣ በዝርዝር 10.58 ላይ እንደሚታየው፣ አንድ የ‘አጥፋ (destroy) ተግባርን (ሰንጠረዥ 7.1) ማከል ይኖርብናል፣ ይህም ተዛማጁን ተጠቃሚ ይፈልግ እና በንቅ መዝገብ የ‘አጥፋ (destroy) ዘዴ ያጠፋል፣ በመጨረሻም ወደ ተጠቃሚዎች ማውጫ ያዟዙራል። ተጠቃሚዎች ሌሎች ተጠቃሚዎችን ለመሰረዝ መጀመሪያ መግባት ስላለባቸው፣ ዝርዝር 10.58 የ‘:አጥፋ (:destroy) ተግባርን በ‘ግብ_ተጠቃሚ (gb_teteqami) ቅድመአጣሪ ውስጥ አክሏል፡፡

ዝርዝር 10.58: አንድ የሚሰራ የ‘አጥፋ (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 ውስጥ ይታያል፡፡

ዝርዝር 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

መልመጃዎች

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

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

  1. አስተዳዳሪ ተጠቃሚ እንደመሆናችሁ መጠን፣ አንድ የድር በይነገጽን በመጠቀም ጥቂት የናሙና ተጠቃሚዎችን አጥፉ። በአገልጋዩ ዘገባ ውስጥ ያሉት ተዛማጅ ግቤቶች ምንድናቸው?

10.4.3 የተጠቃሚ ማጥፋት ፈተናዎች

ተጠቃሚዎችን እንደማጥፋት አደገኛ ለሆነ ነገር፣ ለተጠበቀው ባህሪ ደግሞ በጣም ጥሩ የሆነ ፈተና መኖሩ አስፈላጊ ነገር ነው፡፡ በዝርዝር 10.60 ውስጥ እንደሚታየው፣ ከእቃ ተጠቃሚዎቻችን ውስጥ አንዱ አስተዳዳሪ እንዲሆን በማዘጋጀት እንጀምራለን፡፡

ዝርዝር 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 ውስጥ ይታያሉ፡፡

ዝርዝር 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 ውስጥ የሚገኘውን የገጸቁጥር እና የመሰረዝ ፈተናን ይሰጣል፣ ይህም ሁለቱንም ማለት አስተዳዳሪዎች እና አስተዳዳሪወች ላልሆኑት ተጠቃሚዎች የሚሆኑትን ፈተናወችንም ያካትታል፡፡

ዝርዝር 10.62 ትክክለኛውን የመሰረዣ አገናኞች ከማረጋገጡ በተጨማሪ፣ ተጠቃሚው አስተዳዳሪ ሆኖ ከተገኘ ፈተናውን እንደሚዘል ልብ ልትሉ ይገባል። (ዝርዝር 10.57 የመሰረዣ አገናኝ እንዳልነበረው አስተውላችሁ ይሆናል)።

በዚህ ጊዜ የስረዛ ኮዱ በጥሩ ሁኔታ ተፈትኗል፤ ስለሆነም የፈተና ስብስቡ አረንጓዴመሆነ አለበት፡-

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

መልመጃዎች

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

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

  1. ዝርዝር 10.59 ውስጥ የአስተዳዳሪ ተጠቃሚ ቅድመአጣሪው ላይ አስተያየት በማድረግ ፈተናወቹ ቀይእንደሚሆኑ አረጋግጡ።

10.5 ማጠቃለያ

ክፍል 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 ላይ የምናስተካክለው ይሆናል፡፡

images/figures/heroku_sample_users
ምስል 10.16: በምርት ላይ ያሉ የናሙና ተጠቃሚዎች።

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

  • ተጠቃሚዎች አንድ የአርትዖት ቅጽን በመጠቀም ማዘመን እንደሚችሉ፣ እሱም አንድ የዓዘምን (PATCH) መጠይቅን ወደ አዘምን (update) ተግባር እንደሚሰድ፣
  • ጠንካራ ሰሚአሴቶችን በመጠቀም በድር በኩል ደህንነቱ የተጠበቀ ማዘመን እንደሚተገበር፣
  • ቅድመአጣሪ ከተለየ መቆጣጠሪያ ተግባር በፊት፣ ዘዴዎችን ለማስኬድ አንድ መደበኛ መንገድን እንደሚሰጥ፣
  • ቅድመአጣሪወችን በመጠቀም አንድ ፈቀዳን እንደምንተገብር፣
  • የፈቀዳ ፈተናወች የተወሰኑ የሃ.ጽ.ማ.ስ መጠይቆችን በቀጥታ ወደ መቆጣጠሪያ ተግባሮች እና ወደ ከፍተኛ-ደረጃ የውህደት ፈተናወችን ለማስረከብ ሁለቱንም የአነስተኛ-ደረጃ ትእዛዞችን እንደሚጠቀሙ፣
  • ወዳጃዊ ትልልፍ ተጠቃሚዎች ከገቡ በኋላ መሄድ ወደፈለጉበት አቅጣጫ እንደሚያዟዙራቸው፣
  • የተጠቃሚዎች ማውጫ ገጹ ሁሉንም ተጠቃሚዎች፣ በአንድ ጊዜ አንድ ገጽ ላይ በማድረግ እንደሚያሳይ፣
  • ሬይልስ ውጎ፡ዝራ‘ን (rails db:seed) በመጠቀም በናሙና ውሂቦች ውሂበጎታውን ለመዝራት መደበኛውን የ‘ውጎ/ዘሮች.አርቢ (db/seeds.rb) ፋይልን እንደሚጠቀም፣
  • አቅርብ @ተጠቃሚዎች‘ን (render @teteqamis) ማስኬድ በስብስቡ ውስጥ በእያንዳንዱ ተጠቃሚ ላይ የ_ተጠቃሚ.ሃጽመቋ.ክሩ (_teteqami.html.erb) ከፊልን በራስሰር እንደሚጠራ፣
  • በተጠቃሚ ቅርጸቱ ውስጥ አስተዳዳሪ (astedadari) የተባለው የቡልየን ባሕሪ በተጠቃሚ ቁሶች ላይ አንድ የ‘አስተዳዳሪነውን? (astedadari?) የተባለ የቡልየን ዘዴን በራስሰር እንደሚፈጥር፣
  • አስተዳዳሪዎች የ‘ሠርዝ (DELETE) መጠይቆችን በተጠቃሚዎች መቆጣጠሪያ የ‘አጥፋ (destroy) ተግባር ላይ የሚሰጡ የ “ሰርዝ” አገናኞችን ጠቅ በማድረግ፣ ተጠቃሚዎችን በድር በኩል መሰረዝ እንደሚችሉ እና
  • በእቃወች ፋይል ውስጥ ክት ሩቢን በመጠቀም ብዙ ቁጥር ያላቸው የፈተና ተጠቃሚዎችን መፍጠር እንደምንችል ተምረና።
1. ምስሉ በ 2014-08-25 ከ https://www.flickr.com/photos/sashawolff/4598355045/ የተወሰደ ነው፡፡ በሳሻ ውልፍ የ 2010 የቅጂ መብት © እና የጋራ የፈጠራ አጠቃላይ ዋለዮ 2.0 ፈቃድ መሰረት ስእሉ ላይ ለውጥ አልተደረገም።
2. ይህ እንዴት እንደሚሰራ ሊያሳስባችሁ አይገባም፡፡ እያንዳንዱ ነገር እንዴት እንደሚሰራ በዝርዝር ማወቁ የሬይልስ መዋቅርን ለሚገነቡ አበልጻጊወችን ብቻ ይመለከታል፤ እና እነዚህን በዝርዝር ማወቁ ለሬይልስ አፕልኬሽን አበልጻጊ አስፈላጊ አይደለም።
3. በ‘አዲስ (new) እና በ‘አርትዕ (edit) ከፊሎች ውስጥ የኮድ ድግግሞሽን ከነበረው በበለጠ እንዲሻሻል ሃሳብ ላበረከቱት ጆሴ ካርሎስ ሞንቴሮ ጎሜዝን በጣም አመሰግናለሁ፡፡
4. ለቅድመአጣሪ የተሰጠው ትእዛዝ ከማጣሪያ_በፊት (before_filter) ተብሎ ይጠራ ነበር፣ ነገር ግን መጣራቱ የተለያዩ የመቆጣጠሪያ ተግባሮች ከመከናወናቸው በፊት የቅድመአጣሪው ስራ እንደሚከናወን በጉልህ ለማሳየት ሲባል፤ የሬይልስ ዋና ቡድን እንደገና ከድርጊት_በፊት (before_action) ተብሎ እንዲሰየም ወስኇል።
5. ክቡር አንባቢ አንድሬው ሙርን ስለዚህ ጥቆማቸው ከልብ ላመሰግናቸው እወዳለሁ። ክቡር አንድሬው በክፍል 8.2.4.1 ላይ ይህንን teteqami&. == ahun_teteqami ኮድ እንድንጠቀም ያሳሰቡኝም እሳቸው ናቸው፡፡
6. ይህንን ስውር ችግር ስለጠቆሙ እና መፍትሄውንም ስለሰጡኝ ክቡር አንባቢ ዮኤል አድለር ከልብ አመሰግናለሁ፡፡
7. ትዊተርም የሚጠቀመው ከዚህ ጋር አንድ ዓይነት የሆነ የፈቀዳ ቅድን ነው።
8. እንደ ሁልጊዜው፣ እዚህ ላይ የተዘረዘሩትን የእንቁ ስሪት ቁጥሮችን ከመጠቀም ይልቅ፣ በ gemfiles-6th-ed.railstutorial.org ላይ የተዘረዘሩትን የእንቁ ስሪት ቁጥሮችን መጠቀም ይኖርባችኋል።
9. በተጨባጪ ሁኔታ እነዚህ ሁለት የሬክ ተግባራት (ማለት ሬይልስ ውጎ:አፍልስ:ዳግምአስጀምር (rails db:migrate:reset) እና ሬይልስ ውጎ:ዳግምአስጀምር (rails db:seed)) በ‘ሬይልስ ውጎ:ዳግምአስጀምር (rails db:reset) ትእዛዝ ሊጣመሩ ይችሉ ነበረ፣ ነገር ግን ከዚህ ጽሑፍ በኋላ ማለት በቅርቡ የወጡ የሬይልስ ስሪቶች ላይ ይህ ትእዛዝ እንደማይሰራ ይታወቃል፡፡
10. እንደ ሁልጊዜው፣ እዚህ ላይ የተዘረዘሩትን የእንቁ ስሪት ቁጥሮችን ከመጠቀም ይልቅ፣ በ gemfiles-6th-ed.railstutorial.org ላይ የተዘረዘሩትን የእንቁ ስሪት ቁጥሮችን መጠቀም ይኖርባችኋል።
11. እዚህ ላይ @teteqamis.each do |ቢሊ| ብለን ከጻፍን በኋላ render ቢሊ በማለት የተጠቃሚዎችን ዝርዝር ማግኘት እንችላለን፣ ተጠቃሚ (teteqami) የተባለው ተለዋዋጪ በቢሊ ብቻ ሳይሆን በተፈለገው ዓይነት ተለዋዋጪ ቢተካም ምንም ዓይነት ለውጥ አያመጣም። እዚህ ላይ አብዩ ነገር የ‘ተጠቃሚ (Teteqami) ክፍል ቁስ ብቻ ነው፡፡
12. እንደ ከርል (curl) የለ የማዘዥያ መስመር መገልገያ ሶፍትዌር፣ እንደዚህ ዓይነት የ‘ዓዘምን (PATCH) መጠይቅን መስደድ ይችላል።
13. ለዝርዝሩ በሬይልስካስት ውስጥ “ያለ ጃቫስክሪፕት መሰርዝ” የሚለውን ትምህርታዊ ቪድዮ ተመልከቱ።