如何限制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 并查看它是否如您预期的那样带来它们。一步一步去看看吧。
我正在制作任务管理器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 并查看它是否如您预期的那样带来它们。一步一步去看看吧。