我如何创建朋友?

时间:2013-07-27 18:30:54

标签: ruby-on-rails ruby-on-rails-3 friend amistad

我似乎无法让Amistad的友谊正常工作。我收到以下错误:

ActiveRecord::RecordNotFound in FriendshipsController#update
Couldn't find Friendship with id=29

我也在使用装饰和康康。我按照wiki页面上的gem设置创建了我的控制器,如this related post中所述。

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,就像上面的帖子一样,回答者说明了宝石开发者提供了他回答的代码。

我觉得我在更新方法中需要的是替换:

@friend = User.find(params[:id])

有了这个:

@friendship = Friendship.find_by_friend_id(params[:id])

修改 我可以成功请求朋友,我就是不能接受或拒绝朋友。我是用户列表,单击“添加好友”链接可以正确地在友谊数据库中创建记录。如果我以最近请求的用户身份登录并尝试接受请求是在我收到上述错误时。如果我尝试拒绝请求,也会发生这种情况。

你要求看到的朋友方法带有amistad gem,这里是the code for that method。至于我的Ruby日志,显示错误的部分很长,所以我把它包含在this gist中。

2 个答案:

答案 0 :(得分:2)

鉴于我目前的声誉,我只能在您的问题上发布答案而非评论,但就我从您发布的控制器来源中看到的情况而言,您致电{{1}在您的更新操作中。

我最近在我的一个项目中使用过这个gem,没有遇到任何问题。控制器操作如下所示:

current_user.approve @friend

我希望这会有所帮助。

答案 1 :(得分:1)

查找问题是因为你不一致地传递id。在其中的3个链接中,您直接传递User对象,该对象应自动将ID存储在params[:id]中,您可以在User.find(params[:id])的操作中将其用于params[:user_id]。但是在您的操作中,您从params[:id]中提取它,这是空的。不确定如何在错误消息(或32或其他)中获得29的ID,但是......

如果您将所有操作都更改为User并切换“添加朋友”路径链接以传递其他人已有的approve对象,那么您应该传递正确的数据正确的参数,查找应该理顺。

当然,正如Wonky Business指出的那样,你实际上并没有在你的更新方法中调用friendship,所以没有任何东西可以实际链接,但至少你应该找到所有的模型对象。

另外,从您的路径中可以看出,您正在将friend命名路由重新映射到friends_path(user)。这是混乱的问题,因为没有任何RESTful路由实际上正在执行其名词/动词组合所暗示的内容:如果您使用POST调用Friend,那么在您完成时应该有一个新的Friendship对象,但是这个控制器正在创建和销毁Friend个对象,并且只保留friendship_path个对象。

如果删除该别名并切换到friendship等等,那么REST实际上将按照它的说法执行:管理{{1}}个对象。

希望有所帮助!