如果我们只能使用current_user.method,为什么我们应该在调用方法之前过滤正确的用户

时间:2014-03-12 17:23:27

标签: ruby-on-rails

我看到人们通常会做这样的事情来检查正确的用户,例如:

class UsersController < ApplicationController
  before_action :correct_user,   only: [:edit, :update]
  # ....
  # ....
  private
    def correct_user
      @user = User.find(params[:id])
      redirect_to(root_url) unless current_user?(@user)
    end
end

为什么我们应该完成所有这些验证,如果我们可以做到:

current_user.update(:user_params)

我认为这样我们确信我们只更新当前的用户信息!我不知道第一种方法是否是我们通过教程或其他方式学习的习惯,但我想知道您的意见?

1 个答案:

答案 0 :(得分:0)

Current_user由设计或任何其他身份验证解决方案提供,而不是由rails提供。 除此之外,如果您使用current_user,则只能更新已登录的用户。 如果您有角色和管理员用户也应该能够编辑其他用户,则需要按ID查找这些用户。 技术上,current_user通过在唱歌时提供正确的电子邮件和密码来加载,而User.find通过他的id(显然)找到用户。 确保用户只能更新自己的记录的更好的解决方案是使用授权,例如CanCan。

为您的问题提供更直接的答案:如果您想更新当前登录的用户,使用current_user.update更新它应该没问题,因为current_user包含您可以使用User.find访问的相同用户记录。 我认为你没有看到使用current_user的原因是因为使用User.find更通用,可能部分是因为人们很懒惰而且只使用rails生成器为他们创建的生成的控制器代码。