2012-03-30 4 views
0

私は、互いに友人になるための自己参照関係モデルを設定しました。何の問題もなく友達リクエスト(私のDBに2つのエントリ、友情のために1つ、逆の友情のために1つ)を作成することができます。友人関係を破壊/拒否しようとすると、未定義のメソッド 'destroy'

友だちのリクエストは減少していますが、 、私は@friendship2 = @user.friendships.find_by_friend_id(params[:id]).destroyをコメントアウトした場合、私は上記のエラーを取得していても破壊され、、友情を保留し、データベースレコードの

NoMethodError in FriendshipsController#destroy 
undefined method `destroy' for nil:NilClass 

一つ:私は、私はアクションを破壊に私を取る衰退を押したときに、このエラーを取得しておきます他のレコードも破壊されます。したがって、両方の行が個別に作業するように見えますが、上記のエラーが返されます。解決策:2つの破壊ステートメントが同じレコードを参照していたようです。私は私のコントローラで間違ったコードをコメントアウトし、私のために働くものを追加しました。ここで

は私の友情コントローラである:ここで

class FriendshipsController < ApplicationController 
    before_filter :authenticate, :only => [:update, :create, :destroy] 

def create 
    @user = User.find(current_user) 
    @friend = User.find(params[:friend_id]) 
    params[:friendship1] = {:user_id => @user.id, :friend_id => @friend.id, :status => 'requested'} 
    params[:friendship2] = {:user_id => @friend.id, :friend_id => @user.id, :status => 'pending'} 
    @friendship1 = Friendship.create(params[:friendship1]) 
    @friendship2 = Friendship.create(params[:friendship2]) 
    redirect_to @friend 
end 
end 

    def destroy 
    @user = User.find(params[:user_id]) 
    @friend = User.find(params[:id]) 
    #@friendship2 = @user.friendships.find_by_friend_id(params[:id]).destroy 
    #@friendship1 = @friend.friendships.find_by_id(params[:user_id]).destroy 
    @friendship1 = @user.friendships.find_by_friend_id(@friend.id).destroy #removes the requested friendship 
    @friendship2 = @friend.friendships.find_by_friend_id(@user.id).destroy #removes the pending friendship 

    flash[:success] = "Removed." 
    redirect_to @user 
    end 
end 

は私のUserモデルである:ここで

class User < ActiveRecord::Base 
    has_many :friendships, :dependent => :destroy 

    has_many :friends, 
    :through => :friendships, 
    :conditions => "status = 'accepted'", 
    :source => :friend 

    has_many :pending_friends, 
    :through => :friendships, 
    :conditions => "status = 'pending'", 
    :foreign_key => "user_id", 
    :source => :friend 

    has_many :requested_friends, 
    :through => :friendships, 
    :source => :friend, 
    :conditions => "status = 'requested'"  
end 

は、私の見解は(ユーザー/ show.html.erb)です:

<% if signed_in? && @user == current_user %> 
    <% unless current_user.pending_friends.empty? %> 
    <h2>Pending</h2> 
    <% current_user.pending_friends.each do |pending| %> 
     <%= pending.name %> 
     <%= link_to '[Accept]', friendship_path(:user_id => current_user, :id => pending), :method => :put, :confirm => "Accept?" %> 
     <%= link_to '[Decline]', friendship_path(:user_id => current_user, :id => pending), :method => :delete, :confirm => "Decline?" %> 
    <% end %> 
    <% end %> 
<% end %> 

私には2つの質問があります。

  1. 私はthe use of inverse_friendshipsについてのチュートリアル/ディスカッションから見ましたが、これは本当に必要ですか?これまでのところ、私はこれの必要性を見たことはありませんでしたが、私は創造して破壊する行動をコーディングすることしかできませんでした。

  2. 未定義のメソッド '破壊'エラーは何ですか?

この壁紙を入手していただきありがとうございます。 :D

答えて

1

最初の1つについては、あなたとあなたのシステムによって異なります。すべてのタイプの友情を保持するために異なる変数を作成することは少しハードコアかもしれませんが、それはあなたに完全な情報、より多くの制御を与え、データベースにデータの重複はありません。

2つ目は、クエリが結果を返すかどうかを確認する必要があります。未定義のメソッド

`nilのために「破棄:あなたの例外以来NilClass

はNilClass(ない友情)に "破壊" 何の方法がありませんと言います。 idパラメータと、find_by_friend_idが何かを返すかどうかをチェックするだけです。

+0

両方の質問を明確にしていただきありがとうございます。私はまだエラーを見つけるのに苦労しているし、私の見解も含めました。問題は '@ friendship1 = @ friend.friendships.find_by_id(params [:user_id])。destroy'という行にあると思います。私の未熟さを許してください(まだRailsには初めてです)。私はこれを調べ続けます。 – Huy

+0

ありがとうございました。これは最終的に答えを発見するように私を導きます。 – Huy

+0

あなたは大歓迎です:) –

1

廃棄前にチェックを入れてください。

friendship = @friend.friendships.find_by_id(params[:user_id]) 
@friendship1 = friendship.destroy if !friendship.nil? 

また、callbacksの助けを借りてモデルにこのdestoryを作ることができます。

+0

これは、私が解決策に近づくのを助けました。これによりエラーメッセージが削除されましたが、依然としてrequested_friendshipが削除されていません。私は2つの破壊が同じ記録を参照していることを知ることができました。今、私はuser_idとしてfriend_idを渡す方法を理解しなければなりません。 – Huy

+0

あなたの助けに感謝、Vik。私はそれを理解することができました。ドミトリーにチェックマークをつけましたが、あなたもアップしました。 – Huy

関連する問題