如何不让用户打开任何其他用户页面?

时间:2019-11-09 08:28:23

标签: ruby-on-rails ruby-on-rails-5.2 ruby-on-rails-6

在我的应用中,当用户登录时,他/她将被重定向到用户个人资料页面。假设他/她被重定向到http://localhost:3000/users/1

如果他/她用其他任何数字替换1,我希望他们重定向到该数字 当前配置文件,无论用户是否退出数据库

 class SessionsController < ApplicationController
  def new
  end

 def create
  user = User.find_by_email(params[:email])
  if user && user.authenticate(params[:password])
    log_in user
    redirect_to user
  else
    flash.now[:danger] = 'Invalid email/password combination'
    render 'new'
  end
end

 def destroy
  @current_user = nil
  reset_session
  redirect_to root_path
end

结束

用户控制器:

  class UsersController < ApplicationController
     before_action :logged_in_user, only: [:new, :show, :edit, :update]
     before_action :correct_user, only: [:new, :show, :edit, :update]


 def index
  @users = User.all
 end

 def new
   @user = User.new
 end

 def create
   @user = User.new(set_params)
  if @user.save
    redirect_to new_sessions_path
  else
    render 'new'
  end
end

 def show
   @user = User.find(params[:id])
   @posts = @user.posts
 end

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

def update
  @user = User.find(params[:id])
  if @user.update(update_params)
    redirect_to @user
  else
    render 'edit'
 end
end

private

def set_params
  params.require(:user).permit(:name, :email, :password, :password_confirmation)
end

def update_params
  params.require(:user).permit(:name, :email, :password, :password_confirmation)
end 

  def correct_user
    @user = User.find(params[:id])
    redirect_to(root_url) unless current_user?(@user)
 end

 end

当前,如果用户在搜索栏中输入用户名localhost:3000 / users / 5且ID 5的用户在数据库中不存在,则会显示错误

ActiveRecord :: RecordNotFound在UsersController#show中 找不到具有'id'= 3

的用户

但是我只想重定向到当前登录的用户个人资料页面。

如果用户在搜索栏中键入localhost:3000 / users / 3,并且具有此ID的用户存在于db中,则当前显示错误,表明Firefox无法处理此请求,但我希望它重定向到其默认页面,即, ,用户的个人资料页面。

3 个答案:

答案 0 :(得分:1)

创建另一个名为UserController的控制器,而不依赖于 id 。而是从会话中找出当前用户并显示该用户。因此,此控制器的show方法将如下所示:

 def show
   @user = User.find(session["user_id]")
   @posts = @user.posts
 end

此外,您可能希望通过验证当前用户是否有权查看/更新正在查询的用户来保护UsersController。

答案 1 :(得分:0)

只需更改您的UsersController#correct_user即可捕获ActiveRecord NotFound异常:

class UsersController < ApplicationController
  ...

  def correct_user
    @user = User.find(params[:id])
    redirect_to(root_url) unless current_user?(@user)
  rescue ActiveRecord::RecordNotFound
    redirect_to(root_url)
  end

end

答案 2 :(得分:0)

我会在Users show方法中使用“ where”和“ .take”。当找不到任何内容时,find方法会制动代码

def show 
 @user = User.where("id" => params[:id]).take
 if @user.present? 
  @posts = @user.posts
 else
  redirect_to(root_url)
 end
end

或者您可以代替root_url重定向到一个更友好的错误视图,显示未找到用户