Ruby,before_action混乱

时间:2016-06-22 17:58:49

标签: ruby-on-rails

在ruby中,我试图阻止用户将某人添加为朋友,如果他们中的任何一方在其忽略列表中有另一个。在友谊控制器中,我试图定义

class FriendshipsController < ApplicationController
before_action :ignored_user,    only: :create

def ignored_user
  if current_user.foes.include?(@user)
    flash[:notice] = "Unable to send friend request."
    redirect_to :back 
  end
end

在此上下文中,current_user是登录的用户,@ user是他们正在查看其个人资料的用户,而敌人意味着&#34;他们选择忽略的人或某人谁不理睬他们。&#34;所有这些似乎都有效,除了&#34;如果current_user等等等等等等。线。如果我用&#34替换它;如果是current_user.admin?&#34;然后它就像你期望的那样工作。如果该用户是管理员,则他们无法向任何朋友发送请求。如果我用&#34替换它;如果current_user.id == 2&#34;它也可以按照您的预期运行。我尝试使用上述代码的许多变体替换错误的行,包括:

if Disagreement.where(foe_id: [@user, params[:id]], user_id: [current_user, params[:id]]).first

在别处工作,而不是在友谊控制器中。

至于错误消息:没有。我的尝试始终要么在他们不应该被添加的情况下结束,要么所有朋友请求被阻止,包括向忽略的用户发送朋友请求。对此的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

比我更聪明的人给了我解决方案。我完全删除了“before_action:ignored_user,only :: create”部分,以及“def ignored_user”部分。所有这一切都被替换为:

class FriendshipsController < ApplicationController

  def create
    @user = User.find(params[:friend_id])
    if current_user.foes.include?(@user)
      flash[:notice] = "Unable to send friend request. You are ignoring this user or vice versa."
      redirect_to :back
      puts "@user is: #{@user}" #This line only existed for the sake of figuring out the problem
      puts "@user.id is: #{@user.id}" #Same
      puts "current_user.foes are: #{current_user.foes}" #Same
    else
      @friendship = current_user.friendships.build(friend_id: params[:friend_id])
      if @friendship.save
        flash[:notice] = "Friend request sent!"
        redirect_to :back
      end
    end
  end

问题在于,由于params [:id]部分,友谊控制器无法以正常定义的任何方式识别@user。因为这是为了在友谊控制器中使用而重写,控制器假定通过“id”,你的意思是某些友谊的id,而不是用户的id。给我解决方案的人意识到你可以用“:friend_id”替换“:id”,因为在这个动作的上下文中,这两个ID将始终是同义词,因为你总是会添加自己的人个人资料页。所以我从来没有想过如何直接从不同的控制器中引用用户的ID,但我已经学会了下一个最好的东西。