【问题标题】:how to not let a user open any other users page?如何不让用户打开任何其他用户页面?
【发布时间】:2019-11-09 08:28:23
【问题描述】:

在我的应用中,当用户登录时,他/她会被重定向到用户个人资料页面。假设他/她被重定向到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 in UsersController#show 找不到 'id'=3 的用户

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

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

【问题讨论】:

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


    【解决方案1】:

    创建另一个控制器,将其命名为 UserController,并且不依赖于 id。而是从会话中找出当前用户并显示该用户。所以这个控制器的 show 方法看起来像这样:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 请注意,正如所写,此解决方案不会重定向不正确的用户。在这种情况下,使用find_by 等非抛出方法而不是依赖异常可能也是一个好主意。
      • @AndrewSchwartz 感谢您的指正。我已经确定了答案。
      【解决方案3】:

      我会在用户显示方法中使用“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 到更友好的错误视图,显示未找到用户

      【讨论】:

        猜你喜欢
        • 2012-11-19
        • 1970-01-01
        • 2011-04-21
        • 2015-01-24
        • 2019-11-28
        • 1970-01-01
        • 1970-01-01
        • 2011-03-18
        • 1970-01-01
        相关资源
        最近更新 更多