У меня традиционная модель дружбы:
Пользовательская модель имеет:
has_many :friendships, :dependent => :destroy
has_many :friends, :through => :friendships, :dependent => :destroy
has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id", :dependent => :destroy
has_many :inverse_friends, :through => :inverse_friendships, :source => :user, :dependent => :destroy
Я хотел бы определить статус «друг» только в том случае, если запрос на добавление в друзья был отправлен и принят другим пользователем. Все работает нормально, за исключением того, что мне не удалось обработать часть «игнорировать запрос на добавление в друзья».
Что я пытаюсь сделать, так это: на странице профиля пользователя есть список запросов от другого пользователя, ожидающих утверждения. Затем пользователь может принять запрос на добавление в друзья (тогда он становится другом) или отклонить его (тогда дружеские отношения разрушаются).
Вот фрагмент кода в контроллере дружбы, когда он блокируется:
<h2 class="small_v_space">Waiting your approval</h2>
<ul>
<% for user in @user.inverse_friends %>
<% if user.friends.exists?(@user) and not @user.friends.exists?(user) %>
<li>
<%=h user.name %>
(<%= link_to "Accept", friendships_path(:friend_id => user), :method => :post %>,
<%= link_to "Ignore", friendship_path, :controller => :friendships, :method => :delete %>)
</li
<% end %>
<% end %>
</ul>
Проблема в том, что если я сделаю так, метод удаления удалит последнее добавленное отношение вместо того, которое связано с кнопкой игнорирования.
Давайте рассмотрим пример: Вот отношения, которые я хотел бы разрушить: User_id: 10 Friend_id: 6 Friendship_id: 18
Я на странице «показать» (профиль) пользователя, чей user_id равен 6. Я вижу, что пользователь 10 сделал запрос на добавление в друзья, который я хотел бы проигнорировать. Даже если бы мне удалось извлечь правильный Friendship_id, выполнив:
<%= link_to "Ignore", friendship_path(Friendship_id), :controller => :friendships, :method => :delete %>)
Это приводит к «Не удается найти дружеские отношения с идентификатором = 18 [где user_id = 6]»
Кто-нибудь знает, как в этом случае я могу вызвать действие по уничтожению правильных отношений? Или я должен действовать по-другому?
Большое спасибо за любую подсказку!
ИЗМЕНИТЬ
Уничтожить действие контроллера дружбы:
def destroy
@friendship = current_user.friendships.find(params[:id])
if @friendship.friend.friends.exists?(current_user)
@friendship.destroy
flash[:notice] = "Removed friendship."
else
@friendship.destroy
flash[:notice] = "Removed friend request."
end
redirect_to current_user
end
РЕДАКТИРОВАТЬ 2:
class Friendship
belongs_to :user
belongs_to: :friend, :class_name => 'User'
end
Пользователь A отправляет запрос на добавление в друзья пользователю B (A=пользователь, B=друг в экземпляре класса). Если B принимает запросы, то создается другой экземпляр (B=пользователь, A=друг). Если существует отношение A->B и B->A, то A является другом B. В противном случае запрос остается в ожидании (или может быть проигнорирован, отклонен...).
<%= link_to "Ignore", friendship_path(Friendship_id), :method => :delete %>
должно работать, не могли бы вы показать действие уничтожения вашего контроллера дружбы? - person Ashitaka   schedule 20.03.2012