0

アミスタッドの友情が正しく機能していないようです。次のエラーが表示されます。

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に含めました。

4

2 に答える 2

2

私の現在の評判を考えると、あなたの質問にコメントする代わりに回答を投稿することしかできませんが、あなたが投稿したコントローラー ソースからわかる限り、あなたは更新アクションを呼び出していません。current_user.approve @friend

私は最近、私のプロジェクトの 1 つでこの宝石を問題なく使用しました。コントローラーのアクションは次のようになります。

def update
  @friend = User.find_by_id(params[:id])
  if current_user.approve @friend
    redirect_to friendships_path, notice: t('.confirmation_successful')
  else
    redirect_to friendships_path, alert: t('.confirmation_unsuccessful')
  end
end

def destroy
  @friend = User.find_by_id(params[:id])
  if current_user.remove_friendship @friend
    redirect_to friendships_path, notice: t('.deletion_successful')
  else
    redirect_to friendships_path, alert: t('.deletion_unsuccessful')
  end
end

これが役立つことを願っています。

于 2013-08-02T16:16:48.277 に答える