Ես միշտ ստանում եմ այսպիսի սխալի հաղորդագրություն.
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
Հաճախորդի գրառումին, որին գնահատական չի տրվել:
best_in_place
գոհար է և իմ բոլոր հայացքներում չէ: Պարզապես որոշ հատվածներում: Երբ ես ավելացնեմif
հայտարարություն այս տեսակետին, ես լուծում եմ այս կոնկրետ խնդիրը, բայց դա ինձ չի օգնում ամբողջ հավելվածում (ասենք, երբ ես ստեղծում եմ նոր ռեսուրս և նոր տեսք, որտեղ ես կրկնում եմ տարբեր հավաքածուի միջոցով, ես կկատարեմ պետք է տեղադրեմif
հայտարարություններ իմ բոլոր տեսակետներում): Դա այն մասն է, որը ես կնախընտրեի չանել: 11.10.2012