gpt4 book ai didi

ruby-on-rails - 阻止其他登录用户访问 'edit' 页面

转载 作者:行者123 更新时间:2023-12-03 15:57:09 24 4
gpt4 key购买 nike

我正在构建一个小型网络应用程序,允许用户列出他们的目标。我希望用户只能编辑自己的内容。我已经有了一个作为 before_filter 的身份验证功能,它检查以确保有人登录,但它不检查用户是否是内容的创建者。我尝试创建第二个名为 correct_user 的 before_filter,其代码如下:

def correct_user
@user = User.find(params[:id])
redirect_to(user_path(current_user)) unless current_user?(@user)
end

此外,这里是运行获取请求以编辑我自己的内容的服务器输出
Started GET "/goals/31/edit" for 127.0.0.1 at 2011-05-18 15:22:38 -0400
Processing by GoalsController#edit as HTML
Parameters: {"id"=>"31"}
User Load (0.2ms) SELECT "users".* FROM "users" WHERE ("users"."id" = 101) LIMIT 1
User Load (0.2ms) SELECT "users".* FROM "users" WHERE ("users"."id" = 31) LIMIT 1
Redirected to http://localhost:3000/users/101 Completed 302 Found in 49ms
Completed 302 Found in 49ms

为清楚起见,我使用的 user_id 是 101,而我要编辑的 goal_id 是 31。有人可以解释一下到底发生了什么吗?

另外,我知道您可以使用名为 CanCan 的 gem 来解决这个问题(因为类似的问题已经回答了这个问题),但是有没有办法在不使用 gem 的情况下做到这一点?看起来我的简单小功能应该可以工作,但有人可以解释为什么它不工作吗?

最佳答案

params是发送到您的操作的所有参数(通过 url 或表单字段等)的哈希值。参数的名称(如果存在于 URL 中)在您的路由文件中定义。对于您的目标 Controller 路线,您可能(大概)拥有:

goals_path: /goals/
goal_path: /goals/:id
edit_goal_path: /goals/:id/edit

因为你得到 /goals/31/edit , params[:id]是 31,您正在编辑的目标的 id。 correct_user 中的第一行正在查找 id 与 params 哈希 (goal_id) 中的 id 匹配的用户。所以真的,你应该做这样的事情:
def correct_user
user = Goal.find(params[:id]).user if params[:id]
redirect_to user_path(current_user) unless current_user?(user)
end

这就是说,找到某人想要编辑的目标(来自 params[:id]),并给我与之关联的用户(你没有发布你的目标模型,我假设 Goal belongs_to :user 但你可能已经命名它是“创造者”或“所有者”)。如果用户与当前登录的用户不同,则重定向。您之前的代码试图查找与正在编辑的目标具有相同 ID 的用户。

关于ruby-on-rails - 阻止其他登录用户访问 'edit' 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6050670/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com