1

次のエラーが表示されます。その理由は、まだ関連付けられていない関連レコードで関数を呼び出しているためだとわかっていますが、これを修正する最善の方法を知りませんでした。

エラーの原因となるコード:

<%= link_to member.names.last.fullname, polymorphic_path([member, Name]) %>

この例では、Name は Member との belongs_to 関係を持ち、Member は Name と has_many の関係を持ちます。たまたまポリモーフィックな関係ですが、このエラーには関係ないと思います。

上記のコードが呼び出され、関連する名前がない場合、エラーは次のとおりです。

nil:NilClass の未定義メソッド `fullname'

これが起こらないようにするために、ここで欠けている非常に基本的なものがあると確信しています。皆様のご協力をよろしくお願いいたします。

マーク

より多くのコード:

class Name < ActiveRecord::Base
belongs_to :person, polymorphic: true

attr_accessible :dob, :dod, :first, :gender, :last, :mi, :prefix, :relation, :suffix

def fullname
first + last
end
end


class Member < ActiveRecord::Base
has_many :names, as: :person

attr_accessible :active, :deleted
end
4

1 に答える 1

1

これを解決する簡単な方法は、 を使用すること#tryです。

<%= link_to member.names.last.try(:fullname), polymorphic_path([member, Name]) %>

これにより、エラーが修正されます。ただし、値のないリンクが表示されます。
したがって、メンバーにデフォルトのフルネーム値を提供する必要があります。

fullnameこれに対する 1 つの解決策は、モデルにメソッドを追加することMemberです。

class Member < ActiveRecord::Base
  def fullname
    if names.any?
      names.last.fullname
    else
      "John Doe"
    end
  end
end

次に、あなたの見解では、次のことを行う必要があります。

<%= link_to member.fullname, polymorphic_path([member, Name]) %>

メンバーに名前が定義されていない場合は、デフォルトにフォールバックします。こちら、「ジョン・ドゥ」です。ただし、必要に応じて設定してください。

別の解決策は、メンバーに少なくとも 1 つの名前を強制することです。

class Member < ActiveRecord::Base
  has_many :names, as: :person
  validates :names, presence: true
end

あなたのメンバーは、少なくとも 1 つの名前を指定しない限り、検証エラーが発生し、保存できません。これを使用すると、ネストされた属性も使用して、メンバーが自分自身を作成し​​た後ではなく、作成時に効果的に名前を追加できるようにする
必要があります。

于 2013-07-23T15:15:45.773 に答える