如何限制Rails'current_user的CRUD内容

How to limit the CRUD content of Rails' current_user

我正在制作任务管理器gement 系统并构建用户注册和登录系统,而不依赖于设计gem。目前我面临一个挑战,我希望每个用户(登录时称为current_user)只能看到他们创建的任务(在homepage/index上列出),包括他们只能编辑或删除自己的任务任务。为此,我给controller加了一个before action def find_user_task,但是完全无效。请告诉我,原则上我缺少什么?

这是 TasksController 的一部分

  before_action :find_task, only: [:show, :edit, :update, :destroy]
  before_action :check_login!, except: [:index, :show]
  before_action :find_user_task, only: [:edit, :update, :destroy, :publish]

private
  def find_task
    @task = Task.find(params[:id])
  end

  def task_params
    p = params.require(:task).permit(:name, :due_date, :note, :priority)
    p[:status] = params[:task][:status].to_i
    return p
  end

  def find_user_task
        @task = Task.find(params[:id])
        @task = Task.find_by(id: params[:id], user_id: current_user.id)
        # @task = current_user.tasks.find(params[:id])
    end
end

这是模型任务的一部分

class Task < ApplicationRecord
  validates :name, :note, :due_date, :status, :priority, presence: true
  has_many :category_tasks
  has_many :categories, through: :category_tasks
  belongs_to :user, foreign_key: true, optional: true

这是模型用户的一部分

require 'digest'

class User < ApplicationRecord
  validates :email, presence: true, uniqueness: true
  validates :password, confirmation: true, length: { minimum: 4 }, presence: true
  validates :role, presence: true, uniqueness: true
  has_many :tasks, dependent: :destroy

希望我能在这里帮助你... 首先,关于这段代码:

    @task = Task.find(params[:id])
    @task = Task.find_by(id: params[:id], user_id: current_user.id)

您的第二行会覆盖第一行,因此您可以删除第一行。关于你的问题,我建议你根据你的模型和关系来做……比在控制器中处理它更容易(也更好)。问题是你想确保一个任务属于一个用户(并且可以有 N 个任务)。在创建任务之前,请确保将该任务的 user_id 设置为 current_user.id。应该是这样的:

class User < ApplicationRecord
  has_many :tasks
end

以及您的任务模型:

class Task < ApplicationRecord
  belongs_to :user
end

然后,在任务控制器(或任何地方)上创建操作时,请确保为您的 current_user:

设置 user_id
@task.user_id = current_user.id

如果您仍然没有为任务创建 foreign_key (user_id),只需进行迁移,如下所示:

rails g migration AddUserIdToTask user_id:integer
rails db:migrate

然后,如果你做对了,你可以获得特定用户的任务,只需通过关系访问它们:user.tasks(或者,在你的情况下):

@tasks = current_user.tasks

为了调试和测试,rails 控制台是你的朋友...为用户创建一个任务,然后在控制台上检查 user_id 是否设置正确。然后尝试加载 user.tasks 并查看它是否如您预期的那样带来它们。一步一步去看看吧。