我想创建一个应用程序,用户可以在其中指定一个“密钥持有者”,该密钥持有者可以拥有对其帐户的只读权限。我正在使用Devise进行用户身份验证。另外,我在数据库中有布尔字段来确定登录的用户是否是密钥持有者,还有一个'access_id'整数字段,等于允许他们访问的用户的用户ID。
我正在尝试创建访问限制,以便只有用户或其密钥持有者才能访问其帐户(而不仅仅是在地址栏中输入用户编号的任何人)。我稍后将根据用户角色进一步限制访问,但是我当前收到以下错误:
ActiveRecord::RecordNotFound in UsersController#myaccount
Couldn't find User without an ID
它指的是我添加到application_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
它给出了这一行的错误:
@keyholder = User.find(params[:access_id])
此外,以下是用户控制器中#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
对于数据库中的所有记录,我将access_id设置为0,但密钥持有者除外,其中访问ID等于允许他们访问的user_id。
任何人都可以帮我吗?在我进一步限制权限之前,我只是希望合适的人能够访问帐户。谢谢!
更新:
如果我将代码更改为:
def correct_user
@user = User.find(params[:id])
redirect_to(root_path) unless current_user==@user
end
那么用户只能访问他们自己的帐户,这很好,但我需要一种方法让密钥持有人能够访问该帐户。
答案 0 :(得分:0)
此行@keyholder = User.find(params[:access_id])
导致错误,因为您使用的是find
。您可以将其更改为
@keyholder = User.find_by_id(params[:access_id])
#or
@keyholder = User.where(id: params[:access_id]).first
当他们找不到密钥持有者时,都会返回nil
。
更新:
假设access_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