Ruby on rails Rails-为用户帐户创建密钥持有者-访问限制问题

Ruby on rails Rails-为用户帐户创建密钥持有者-访问限制问题,ruby-on-rails,permissions,Ruby On Rails,Permissions,我想创建一个应用程序,用户可以指定一个对其帐户具有只读访问权限的“密钥持有者”。我正在使用Desive进行用户身份验证。此外,我在数据库中有布尔字段来确定登录的用户是否是密钥持有者,还有一个“access_id”整型字段,它等于允许他们访问的用户的用户id 我正在尝试创建访问限制,以便只有用户或他们的钥匙持有人才能访问他们的帐户(而不仅仅是任何在地址栏中键入用户号码的人)。稍后,我将根据用户角色进一步限制访问,但我当前收到以下错误: ActiveRecord::RecordNotFound in

我想创建一个应用程序,用户可以指定一个对其帐户具有只读访问权限的“密钥持有者”。我正在使用Desive进行用户身份验证。此外,我在数据库中有布尔字段来确定登录的用户是否是密钥持有者,还有一个“access_id”整型字段,它等于允许他们访问的用户的用户id

我正在尝试创建访问限制,以便只有用户或他们的钥匙持有人才能访问他们的帐户(而不仅仅是任何在地址栏中键入用户号码的人)。稍后,我将根据用户角色进一步限制访问,但我当前收到以下错误:

ActiveRecord::RecordNotFound in UsersController#myaccount 
Couldn't find User without an ID
它指的是我添加到应用程序_controller.rb中的代码:

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :correct_user


    private

      def correct_user
        @user = User.find(params[:id])
        @keyholder = User.find(params[:access_id])

        redirect_to(root_path) unless current_user==@user||@keyholder
      end
end
此外,以下是用户控制器中#myaccount操作的代码:

def myaccount
    if user_signed_in?
    @user = User.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @user }
    end
    else
      redirect_to root_path, notice: 'Please login to view your account'
    end
  end
我将数据库中所有记录的访问id设置为0,但密钥持有者除外,其中访问id等于允许他们访问的用户id

有人能帮我吗?在我进一步限制权限之前,我只想让合适的人能够访问这些帐户。谢谢

更新:

如果我将代码更改为:

def correct_user
        @user = User.find(params[:id])

        redirect_to(root_path) unless current_user==@user
      end

然后用户只能访问他们自己的帐户,这很好,但我需要一种钥匙持有人能够访问帐户的方式。

这一行
@keyholder=user.find(params[:access\u id])
会导致错误,因为您正在使用
find
。你可以把它改成

@keyholder = User.find_by_id(params[:access_id])
#or
@keyholder = User.where(id: params[:access_id]).first
当他们找不到钥匙夹时,将返回
nil

更新:

假设
access\u id
包含可以访问@user的用户的id,您可以使用以下方法进行检查

if @user && current_user.id == @user.id
  # don't redirect
elsif @keyholder && current_user.id == @keyholder.access_id
  # don't redirect
else
  # redirect
end
简单地说,我们有

unless (@user && current_user.id == @user.id) || (@keyholder && current_user.id == @keyholder.access_id)
  # redirect
end

你能解释一下,为什么
find
不起作用,但是
find_by_id
will?现在没有任何错误,但我无法获得允许持钥匙人访问用户帐户的正确语法-你能帮我吗?我已经添加了您对密钥持有者的第一个建议,但需要一个单独的行来实际提供访问权限-即:重定向到(根路径),除非当前用户==(@user | |=@keyholder)有什么想法?谢谢你的帮助!事实上,我不知道你是如何为一个特定的用户设置键槽的。你能在你的问题中给出一些具体的例子吗?基本上,我想要这一行的正确版本:重定向到(根路径),除非当前用户。id=(@user.id | |=@keyholder.access_id),但我无法得到正确的语法-任何帮助都将不胜感激!我只是想在我开始设置钥匙夹之前把访问权限排序一下。我已经用正确的数据手动更新了数据库。密钥持有者是一个“keyholder”布尔字段设置为true的用户,“access_id”字段等于他们可以访问其帐户的用户的用户id。啊,如果当前用户id!=@user.id&¤t_user.id!=@钥匙夹.id
unless (@user && current_user.id == @user.id) || (@keyholder && current_user.id == @keyholder.access_id)
  # redirect
end