как не позволить пользователю открыть страницу других пользователей? - PullRequest
0 голосов
/ 09 ноября 2019

В моем приложении, когда пользователь входит в систему, он / она перенаправляется на страницу профиля пользователя. Скажем, он / она перенаправлен на 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

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 и пользователь с идентификатором 5 не существует в базе данныхэто показывает ошибку

ActiveRecord :: RecordNotFound в UsersController # show Не удалось найти пользователя с 'id' = 3

, но я хочу просто перенаправить на текущий вход в системуСтраница профиля пользователя.

Если пользователи вводят в строке поиска localhost: 3000 / users / 3 и пользователь с этим идентификатором существует в БД, в данный момент он показывает ошибку, что firefox не может обработать этот запрос, но я хочу егоперенаправить на страницу по умолчанию, т.е. на страницу профиля пользователя.

Ответы [ 3 ]

1 голос
/ 09 ноября 2019

Создайте еще один контроллер, назовите его UserController и не зависите от id . Вместо этого выясните текущего пользователя из сеанса и отобразите этого пользователя. Таким образом, метод show для этого контроллера будет выглядеть следующим образом:

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

Кроме того, вы можете захотеть защитить свой UsersController, проверив, есть ли у текущего пользователя доступ к просмотру / обновлению запрашиваемого пользователя.

0 голосов
/ 09 ноября 2019

Я бы использовал «где» и «.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 более дружественный вид ошибок, который показывает, что пользователь не найден

0 голосов
/ 09 ноября 2019

Просто измените 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
...