2009-07-31 14 views
0

私は作品とそのクレジットでサイトを構築しています。私が達成しようとしているのは、クレジットの相互のタイトルに基づいて各作品の類似の作品を見つけることです。Ruby on Rails:配列内のオブジェクトの属性にアクセスできない

私はそれぞれの類似の作品をforループの配列に追加しています。これらの作品の属性にアクセスしようとすると、「期待していないときはオブジェクトがありません!エラー。私は配列でデバッグするときにWorkオブジェクトを見ることができますが、その属性にアクセスすることはできません。

class Work < ActiveRecord::Base 

    def similar_works 
    @similar_works 
    end 

    def find_similar_works 
    @similar_works = [] 
    for credit in self.credits 
     same_credits = credit.title.credits #same credits with mutual titles 
     for credit2 in same_credits 
     @similar_works << credit2.work 
     end 
    end 
    end 

end 



class WorksController < ApplicationController 

    def index 
    list 
    render(:action => 'list') 
    end 

    def list 
    # find similar works for each work 
    @works.each do |work| 
     work.find_similar_works 
    end 
    end 

end 



list.html 

<% for work in @works -%> 
<% for similarwork in work.similar_works%> 
    <%= similarwork.name%> => nil object 
    <%=debug(similarwork)%> => sample debug output is below 
<% end %> 
<% end %> 



--- !ruby/object:Work 
attributes: 
    name: Borozan 
    updated_at: 2009-07-31 12:30:30 
    created_at: 2009-07-31 12:25:32 
attributes_cache: {} 

--- !ruby/object:Work 
attributes: 
    name: Boom 
    updated_at: 2009-07-31 12:30:30 
    created_at: 2009-07-31 12:25:32 
attributes_cache: {} 

--- !ruby/object:Work 
attributes: 
    name: Kamuflaj 
    updated_at: 2009-07-31 12:30:30 
    created_at: 2009-07-31 12:25:32 
attributes_cache: {} 

答えて

2
  1. 変数がnullのではなく、その属性:ここでは、コードです。
  2. は、plsは
  3. は、次の行の結果を貼り付けスタック全体を貼り付けます。<% =デバッグ(work.similar_works)%>
  4. あなたの配列にはnil値を持つことが可能です。あなたの関数を修正:

    はDEF #をfind_similar_works ..自分のもの #を行い、その後similar_works.compact @値 nilを取り除きます! end

+0

ありがとうございました。 @ similar_work.compact!働いた。 最初に問題が発生した理由を説明してください。私は何が恋しいのですか? ありがとう – fahrio

+0

よろしくお願いいたします。この行のためです: '@similar_works << credit2.work'。すべてのcredit2に作業があるかどうかはチェックしないので、配列にnil値を追加します。次のようなもので簡単にデバッグすることができます:「現在、クレジット#{クレジット2}に対応する作業番号{credit2.work}」を追加します。 投票して、答えをあなたのために良いものとしてマークしてください:) –

関連する問題