Ruby on rails 基于Rails中的链接表字段分配实例变量

Ruby on rails 基于Rails中的链接表字段分配实例变量,ruby-on-rails,Ruby On Rails,我正在尝试创建一个系统来检查当前用户是否有权编辑记录。我认为这样做的方法是将@user的变量分配并实例化到显示记录的链接ID和一个私有函数,该函数重定向,除非@user=当前用户,但当我这样做时,我每次都会得到重定向行为(即使用户拥有该记录) 这是控制器的设置 def edit @deal = Deal.find(params[:id]) @user = User.where(params[:id] === @deal.user_id) correct_user

我正在尝试创建一个系统来检查当前用户是否有权编辑记录。我认为这样做的方法是将@user的变量分配并实例化到显示记录的链接ID和一个私有函数,该函数重定向,除非
@user
=
当前用户
,但当我这样做时,我每次都会得到重定向行为(即使用户拥有该记录)

这是控制器的设置

def edit 
    @deal = Deal.find(params[:id]) 
    @user = User.where(params[:id] === @deal.user_id)
    correct_user
  end
...
private

  def correct_user
    unless @user === current_user
      redirect_to root_path
      flash[:error] = 'You can only edit deals that you own'
    end
  end
用户和交易模型通过拥有多个

class User < ApplicationRecord
  has_many :deals
...
class Deal < ApplicationRecord
  belongs_to :user

该项目是使用Desive设置的,因此也可以使用这些帮助程序。

使用
==
而不是
==
您只想将
@user
当前用户进行比较

@user == current_user
看到这里的区别了吗

你也需要改变

@user = User.where(params[:id] === @deal.user_id)


好的,那么从哪里开始

首先,不要使用
==
来比较记录,而是使用
=

第二:

def edit 
  @deal = Deal.find(params[:id]) 
  @user = User.find_by(params[:id]: @deal.user_id)
  correct_user
end
当试图查找用户时,您需要提供AR选项作为散列,而不是布尔参数。如果要在未找到记录时引发异常,请使用
find
,或者使用
find\u by
简单地返回nil

correct\u user
中,再次使用
=
而不是
==

然而,这段代码仍然不是很漂亮,可能需要一些重构;)

@user = @deal.user
def edit 
  @deal = Deal.find(params[:id]) 
  @user = User.find_by(params[:id]: @deal.user_id)
  correct_user
end