アミスタッドの友情が正しく機能していないようです。次のエラーが表示されます。
ActiveRecord::RecordNotFound in FriendshipsController#update
Couldn't find Friendship with id=29
私もdeviseとcancanを使っています。wiki ページの gem セットアップに従い、この関連記事で説明されているようにコントローラーを作成しました。
class FriendshipsController < ApplicationController
before_filter :authenticate_user!
def index
@friends = current_user.friends
@pending_invited_by = current_user.pending_invited_by
@pending_invited = current_user.pending_invited
end
def create
@friend = User.find(params[:user_id])
@friendship_created = current_user.invite(@friend)
if @friendship_created
redirect_to users_path, :notice => "Your friend request is pending"
end
end
def update
@friend = User.find(params[:user_id])
@friends = current_user.friends
@pending_invited_by = current_user.pending_invited_by
redirect_to users_path, :notice => "You are now friends!"
end
def destroy
@friend = User.find(params[:user_id])
@friendship = current_user.send(:find_any_friendship_with, @friend)
if @friendship
@friendship.delete
@removed = true
redirect_to users_path, :notice => "You are no longer friends!"
end
end
def createblock
@friend = User.find(params[:user_id])
current_user.block @friend
redirect_to users_path, :notice => "You have blocked #{@friend.first_name}"
end
end
次の方法でユーザーをループして、ユーザーの現在のステータスを確認し、適切なアクションを提供します。
<% if current_user.friend_with? user %>
<%= link_to "Unfriend", friend_path(user), :method => "delete", :class => 'btn btn-mini' %>
<% elsif current_user.invited? user %>
<span class="btn btn-mini disabled">Pending</span>
<% elsif user.invited? current_user %>
<%= link_to "Accept", friend_path(user), :method => "put", :class => 'request-approve btn btn-mini' %>
<%= link_to "Decline", friend_path(user), :method => "delete", :class => 'request-decline btn btn-mini' %>
<% else %>
<%= link_to "Add friend", friends_path(:user_id => user), :method => "post", :class => 'btn btn-mini' %>
<% end %>
私のスキーマで友情テーブルがどのように見えるかを確認すると便利だと思いました:
create_table "friendships", :force => true do |t|
t.integer "friendable_id"
t.integer "friend_id"
t.integer "blocker_id"
t.boolean "pending", :default => true
end
add_index "friendships", ["friendable_id", "friend_id"], :name => "index_friendships_on_friendable_id_and_friend_id", :unique => true
エラーがこれがどのように変化するかを理解できないことを理解しています。私の問題は、フレンド ID を渡しており、フレンド ID を期待していることだと思います。このソリューションに関する私の唯一の問題は、私が見つけることができるすべての例または投稿が user_id を渡すことを提案していることです。
update メソッドで必要だと思うのは、次のものを置き換えることです。
@friend = User.find(params[:id])
これとともに:
@friendship = Friendship.find_by_friend_id(params[:id])
編集 友達をリクエストすることはできますが、友達を承認または拒否することはできません。ユーザーのリストで、[友達を追加] リンクをクリックすると、友情データベースにレコードが正しく作成されます。最近リクエストしたユーザーとしてログインし、リクエストを受け入れようとすると、上記のエラーが発生します。これは、リクエストを拒否しようとした場合にも発生します。
あなたが見るように頼んだ友人のメソッドは、amistad gem に付属しています。これがそのメソッドのコードです。私の Ruby ログでは、エラーを表示するセクションが非常に長いので、この gistに含めました。