0

ユーザーが自分のアカウントに読み取り専用アクセスできる「キーホルダー」を指名できるアプリを作成したいと考えています。ユーザー認証にDeviseを使用しています。さらに、ログインしているユーザーがキーホルダーであるかどうかを判断するためのブール値フィールドがデータベースにあり、アクセスが許可されているユーザーのユーザー ID に等しい「access_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 に設定しています。

誰でもこれで私を助けることができますか?アクセス許可をさらに制限する前に、適切なユーザーがアカウントにアクセスできるようにしたいだけです。ありがとう!!

アップデート:

コードを次のように変更すると:

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

        redirect_to(root_path) unless current_user==@user
      end

ユーザーは自分のアカウントにしかアクセスできませんが、これは問題ありませんが、キーホルダーがアカウントにアクセスできる方法が必要です。

4

1 に答える 1

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
于 2013-02-28T12:42:03.873 に答える