Я настроил модель отношений с ссылками на самих себя, чтобы пользователи могли дружить друг с другом. Я могу без проблем создать запрос на добавление в друзья (две записи в моей БД, одну для дружбы и одну для обратной дружбы).
Однако у меня возникли проблемы с отклонением запроса на добавление в друзья. Я продолжаю получать эту ошибку, когда нажимаю «Отклонить», что приводит меня к действию «уничтожить»:
NoMethodError in FriendshipsController#destroy
undefined method `destroy' for nil:NilClass
Одна из записей базы данных, ожидающая дружбы, уничтожается, хотя я получаю указанную выше ошибку, и если я закомментирую @friendship2 = @user.friendships.find_by_friend_id(params[:id]).destroy
, другая запись тоже будет уничтожена. Таким образом, похоже, что обе строки работают по отдельности, но возвращают указанную выше ошибку.
РЕШЕНИЕ. Похоже, что два моих оператора уничтожения ссылались на одну и ту же запись. Я закомментировал неправильный код в своем контроллере и добавил те, которые мне подходят.
Вот мой контроллер Дружбы:
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
Вот моя модель пользователя:
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
Вот мое мнение (users/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 %>
У меня есть два вопроса.
Я видел из некоторых руководств/обсуждений о использование inverse_friendships, но действительно ли это необходимо? До сих пор я не видел в этом необходимости, но опять же, я добрался только до кодирования своего действия создания и уничтожения.
Что случилось с ошибкой undefined method 'destroy'?
Спасибо, что преодолели эту стену текста! :D