私は、互いに友人になるための自己参照関係モデルを設定しました。何の問題もなく友達リクエスト(私の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つの質問があります。
私はthe use of inverse_friendshipsについてのチュートリアル/ディスカッションから見ましたが、これは本当に必要ですか?これまでのところ、私はこれの必要性を見たことはありませんでしたが、私は創造して破壊する行動をコーディングすることしかできませんでした。
未定義のメソッド '破壊'エラーは何ですか?
この壁紙を入手していただきありがとうございます。 :D
両方の質問を明確にしていただきありがとうございます。私はまだエラーを見つけるのに苦労しているし、私の見解も含めました。問題は '@ friendship1 = @ friend.friendships.find_by_id(params [:user_id])。destroy'という行にあると思います。私の未熟さを許してください(まだRailsには初めてです)。私はこれを調べ続けます。 – Huy
ありがとうございました。これは最終的に答えを発見するように私を導きます。 – Huy
あなたは大歓迎です:) –