私のモデルで非常に奇妙なエラーが発生しています。
私のビューコードは次のとおりです。
Pickup by: <%= link_to Trip.find_by_pickedpost_id(post).volunteer.name, Trip.find_by_pickedpost_id(post).volunteer %>
しかし、ページをレンダリングできません。それが示している:
NoMethodError in Posts#index
Showing /Users/rails_projects/pickup/app/views/posts/_post.html.erb where line #31 raised:
undefined method `volunteer' for nil:NilClass
Extracted source (around line #31):
28: </div>
29: <% else %>
30:
31: Pickup by: <%= link_to Trip.find_by_pickedpost_id(post).volunteer.name, Trip.find_by_pickedpost_id(post).volunteer %>
32: <% end %>
33: <% end %>
34: </li>
Trace of template inclusion: app/views/posts/index.html.erb
Application Trace | Framework Trace | Full Trace
app/views/posts/_post.html.erb:31:in `_app_views_posts__post_html_erb___3981341078159890289_70243818995260'
app/views/posts/index.html.erb:5:in `_app_views_posts_index_html_erb__1562091740607633290_70243844957440'
Rails コンソールで、問題なくボランティア メソッドを呼び出そうとしました。
1.9.2-p290 :016 > Trip.find_by_pickedpost_id(post11)
Trip Load (0.3ms) SELECT "trips".* FROM "trips" WHERE "trips"."pickedpost_id" = 11 LIMIT 1
=> #<Trip id: 10, pickedpost_id: 11, volunteer_id: 30, created_at: "2012-05-12 16:49:50", updated_at: "2012-05-12 16:49:50">
1.9.2-p290 :017 > Trip.find_by_pickedpost_id(post11).volunteer.name
Trip Load (0.3ms) SELECT "trips".* FROM "trips" WHERE "trips"."pickedpost_id" = 11 LIMIT 1
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = 30 LIMIT 1
=> "Ari Runte"
実際にはボランティアメソッドだけでなく、トリップオブジェクトで呼び出そうとしたすべてのメソッドで未定義のメソッドエラーが発生し、Trip.find_by_pickedpost_id(post11).id でさえも発生します。
Trip.find_by_pickedpost_id(post) をレンダリングしようとしましたが、ページは trip オブジェクトを正常にレンダリングします。
Pickup by: #<Trip:0x007fc5d4866608>
何が問題なのですか?
いくつかの観測を追加するには:
コードを次のように変更すると
<%= link_to Trip.find_by_pickedpost_id(post).some_invalid_method, ....%>,
ページがレンダリングされます
undefined method `some_invalid_method' for #<Trip:0x007fc5d6ec8fd0>
と比べて
undefined method `volunteer' for nil:NilClass
メソッドが実際には合法であるのに、ページが trip オブジェクトに対して「Nil」をレンダリングするのはなぜですか?
ありがとう