如何不让用户打开任何其他用户页面?
how to not let a user open any other users page?
在我的应用程序中,当用户登录时 he/she 被重定向到用户个人资料页面。说 he/she 被重定向到 http://localhost:3000/users/1
如果 he/she 将 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 的用户存在于数据库中,当前它会显示一个错误,即 firefox 无法处理此请求,但我希望它重定向到它的默认页面,即用户的个人资料页面。
只需更改您的 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
创建另一个控制器,将其命名为 UserController,并且不依赖于 id。而是从会话 中找出 当前用户并显示该用户。所以这个控制器的 show 方法看起来像这样:
def show
@user = User.find(session["user_id]")
@posts = @user.posts
end
此外,您可能希望通过验证当前用户是否有权查看/更新正在查询的用户来保护您的 UsersController。
我会在 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 到更友好的错误视图,显示未找到用户
在我的应用程序中,当用户登录时 he/she 被重定向到用户个人资料页面。说 he/she 被重定向到 http://localhost:3000/users/1
如果 he/she 将 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 的用户存在于数据库中,当前它会显示一个错误,即 firefox 无法处理此请求,但我希望它重定向到它的默认页面,即用户的个人资料页面。
只需更改您的 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
创建另一个控制器,将其命名为 UserController,并且不依赖于 id。而是从会话 中找出 当前用户并显示该用户。所以这个控制器的 show 方法看起来像这样:
def show
@user = User.find(session["user_id]")
@posts = @user.posts
end
此外,您可能希望通过验证当前用户是否有权查看/更新正在查询的用户来保护您的 UsersController。
我会在 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 到更友好的错误视图,显示未找到用户