AMcoder - javascript, python, java, html, php, sql

Ինչպե՞ս կարող եմ նրբագեղորեն կարգավորել զրոյական դեպքերը հավաքածուներում իմ ամբողջ հավելվածում:

Ես միշտ ստանում եմ այսպիսի սխալի հաղորդագրություն.

undefined method 'firm_size' for nil:NilClass

Երբ կրկնվում է հավաքածուի վրա և հայտնվում է մի զրոյական դեպք:

Ես սովորաբար պետք է մտնեմ իմ տեսակետը և ավելացնեմ if հայտարարություն այս հատուկ հատկանիշի շուրջ՝ զրոյական դեպքերը լուծելու համար:

Թվում է, թե սա շատ ոչ չոր մոտեցում է:

Կա՞ ավելի էլեգանտ միջոց Rails-ում այս տեսակի դեպքերը վարելու համար: Ոչ միայն nil օբյեկտները հավաքածուում, այլ օբյեկտներ, որոնք կարող են ունենալ nil հատկանիշ, որն իրականում տեղի է ունենում այստեղ:

Շնորհակալություն։

Խմբագրել 1

Սխալի այս կոնկրետ օրինակի վերաբերյալ լրացուցիչ համատեքստի համար.

Սա իմ Scores#index հայացքով է -

<% @clients.each do |client| %>
  <tr>
    <td><%= "First Client" %></td>
  </tr>
  <tr>
    <td>Firm Size</td>
    <td><%= best_in_place client.score, :firm_size, :type => :input, :nil => "Add Score for Firm Size" %></td>

Սա իմ scores_controller.rb համապատասխան մասերն են.

class ScoresController < ApplicationController
    before_filter :load_clients

  def index
    @weight = current_user.weight
    @scores = current_user.scores

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @scores }
    end
  end

    private 

    def load_clients
        @clients = current_user.clients     
    end         

end

Սա սերվերի մատյան է.

Started GET "/scores" for 127.0.0.1 at 2012-10-10 18:38:05 -0500
Processing by ScoresController#index as HTML
  User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
  Weight Load (0.2ms)  SELECT "weights".* FROM "weights" WHERE "weights"."user_id" = 1 LIMIT 1
  Client Load (0.3ms)  SELECT "clients".* FROM "clients" WHERE "clients"."user_id" = 1
  Score Load (10.9ms)  SELECT "scores".* FROM "scores" WHERE "scores"."client_id" = 1 LIMIT 1
  Score Load (0.3ms)  SELECT "scores".* FROM "scores" WHERE "scores"."client_id" = 2 LIMIT 1
  Rendered scores/index.html.erb within layouts/application (276.6ms)
Completed 500 Internal Server Error in 283ms

Սա խնդրո առարկա ռեկորդն է (այսինքն՝ client.score երբ client.id = 2)

1.9.3p194 :089 > d = Client.find(2)
  Client Load (0.2ms)  SELECT "clients".* FROM "clients" WHERE "clients"."id" = ? LIMIT 1  [["id", 2]]
 => #<Client id: 2, name: "Jack Daniels", email: "[email protected]", phone: 1234567890, firm_id: 2, created_at: "2012-09-05 19:26:07", updated_at: "2012-10-07 02:44:51", user_id: 1, last_contact: "2012-02-10", vote: false, vote_for_user: false, next_vote: "2012-07-12", weighted_score: nil> 
1.9.3p194 :090 > d.score
  Score Load (0.4ms)  SELECT "scores".* FROM "scores" WHERE "scores"."client_id" = 2 LIMIT 1
 => nil 

Ինչպես նախկինում ասացի, այս սխալը բարձրացվում է ամեն անգամ, երբ հանդիպում է զրոյական գրառում (կամ հատկանիշ): Այս կոնկրետ դեպքում զրոյական գրառումը վերաբերում է 2nd Հաճախորդի գրառումին, որին գնահատական ​​չի տրվել:


  • Խնդրում ենք ցույց տալ համատեքստը, թե ինչպես եք ստանում այս սխալը: 11.10.2012
  • Այն դեպքերում, երբ ես փնտրում եմ ինչ-որ էլեգանտ բան, երբեմն փորձում եմ գրել կեղծ կոդ, որը ես կցանկանայի, որ աշխատեր: Կարո՞ղ եք պատկերացնել ինչ-որ կոդ, որը նրբագեղ կերպով կմշակեր nilը ձեր հավաքածուների համար: 11.10.2012
  • Ես պարզապես ավելացրեցի ավելի շատ համատեքստ, բայց ես չեմ փորձում լուծել միայն ԱՅՍ կոնկրետ խնդիրը, ավելի շուտ nil գրառումների կամ գրառումների ատրիբուտների հետ հանդիպելու և այն նրբագեղորեն վարվելու ավելի լայն գործը: 11.10.2012
  • @Larsenal Դա հետաքրքիր մոտեցում է, բայց ես պատկերացնում եմ, որ սա կլինի այն դեպքը, երբ Rails-ի բոլոր ծրագրավորողների հանդիպումը. Ես չեմ կարող լինել միակը, ում կրկնողները վերադարձնում են զրոյական օբյեկտներ կամ զրոյական հատկանիշներով առարկաներ: Թե՞ ես ինչ-որ բան սխալ եմ անում: 11.10.2012
  • Իմ միտքը պարզապես սա էր... եթե դուք չեք կարող պատկերացնել ավելի էլեգանտ բան, քան if հայտարարությունը, ապա ավելի էլեգանտ բանի ձեր որոնումը հավանաբար անպտուղ կլինի: 11.10.2012

Պատասխանները:


1

Ձեր կոնկրետ դեպքում, ենթադրելով, որ best_in_place-ը օգնական է, դուք կարող եք կարգավորել օգնականի զրոյական թիվը: Պարզապես անցեք client-ում, այլ ոչ թե client.score-ում:

Բանն այն է, որ ինչ-որ տեղ դուք կունենաք if հայտարարություն: Պարզապես դրեք այն լավագույն տեղում:

11.10.2012
  • best_in_place գոհար է և իմ բոլոր հայացքներում չէ: Պարզապես որոշ հատվածներում: Երբ ես ավելացնեմ if հայտարարություն այս տեսակետին, ես լուծում եմ այս կոնկրետ խնդիրը, բայց դա ինձ չի օգնում ամբողջ հավելվածում (ասենք, երբ ես ստեղծում եմ նոր ռեսուրս և նոր տեսք, որտեղ ես կրկնում եմ տարբեր հավաքածուի միջոցով, ես կկատարեմ պետք է տեղադրեմ if հայտարարություններ իմ բոլոր տեսակետներում): Դա այն մասն է, որը ես կնախընտրեի չանել: 11.10.2012

  • 2

    Եթե ​​ձեր կոդը հետևողականորեն զրո է վերադարձնում մի բանի համար, որը չպետք է լինի զրոյական, ապա գուցե լավագույնը վերանայել, թե ինչպես են կոչվում գործառույթները: Այնուամենայնիվ, հաճախ հաճելի է ունենալ (կամ բազմաթիվ) սովորական զրոյական դաս(ներ): Դուք կարող եք գրել ընդարձակումներ NilCLass-ում՝ ձեր ունեցած գործառույթները բռնելու համար, բայց դա կարող է խնդիր լինել, եթե ստանաք գործառույթների անուններ, որոնք նույնն են տարբեր իրավիճակների համար: Դուք կարող եք նաև ձեր բոլոր դասերում ստեղծել սինգլտոն, որը օգնական մեթոդները մատնանշում են, եթե որոշակի ատրիբուտներ զրոյական են:

    11.10.2012
  • Այն հետևողականորեն չի վերադարձնում զրոյին այն բաների համար, որոնք չպետք է: Խնդիրը nil արժեքի վերադարձված չէ: Որ այն վերադառնում է nil, դա սպասված մասն է, օրինակ. Հեծանիվ անցնելով հավաքածուի միջով, որտեղ client.score.firm_size հատկանիշը վերադարձնում է զրոյական, բայց ասենք, որ client.score.value-ը օրինական է: Այսպիսով, խնդիրն այն է, որ այդ հատկանիշով վերադարձված զրոյականը նրբագեղ կերպով վարվի: Դա սովորական խնդիր է, որը ես գտնում եմ, երբ կրկնում եմ տվյալների հավաքածուները, որոնք պետք է ցուցադրվեն տեսքում: 11.10.2012
  • Կարծում եմ, որ լավագույն տարբերակը պարզապես բուլյան ավելացնելն է, որպեսզի տեսնենք, թե արդյոք այն զրոյական է: Եթե ​​ձեզ անհանգստացնում է, որ այն խառնում է ձեր տեսադաշտը, կարող եք սահմանել օգնական մեթոդ, որն իրականացնում է գործողությունը: Առաջ շարժվելով՝ կարող է օգտակար լինել դաշտը լրացնել որոշ իմաստալից տվյալներով, եթե զրոյականը ձեր ուզածը չէ (0 կամ -1 միավոր): 11.10.2012
  • Ինչպե՞ս կարող եմ դաշտը լրացնել զրոյից բացի որոշ իմաստալից տվյալներ: Միգրացիայի՞ մեջ։ 11.10.2012
  • Ամեն անգամ, երբ նոր օբյեկտ եք ստեղծում, համոզվեք, որ դաշտը լրացնում եք տվյալների կտորով: նախկին Client.create(score: 0) ենթադրելով, որ դուք կարող եք զանգվածային նշանակել արժեքը: Հակառակ դեպքում օգտագործեք c = Client.new, ապա c.score = 0 ապա c.save 12.10.2012
  • Եթե ​​ցանկանում եք հետադարձ կերպով ավելացնել տվյալներ զրոյական դաշտերում, ապա այո, դուք կարող եք դա անել միգրացիայի միջոցով 23.10.2012
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..