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



在我的应用程序中,当用户登录时,他/她会被重定向到用户配置文件页面。说他/她被重定向到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

Currenty如果用户在搜索栏localhost:3000/users/5中键入,并且id为5的用户在数据库中不存在,则显示错误

ActiveRecord::RecordNotFound in UsersController#show找不到"id"=3的用户

但我想简单地重定向到当前登录的用户配置文件页面。

如果用户在搜索栏localhost:3000/users/3中键入,并且数据库中存在具有此id的用户,则当前会显示一个错误,即firefox无法处理此请求,但我希望它重定向到其默认页面,即用户的配置文件页面。

创建另一个控制器,称之为UserController,不依赖id。相反,从会话中找出当前用户并显示该用户。所以这个控制器的显示方法是这样的:

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

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

只需更改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

我会在Users-show方法中使用"where"one_answers".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到一个更友好的错误视图,显示User not found

相关内容

  • 没有找到相关文章

最新更新