我正在构建一个允许用户列出目标的小型Web应用程序。我希望用户只能编辑自己的内容。我已经获得了authenticate函数作为before_filter进行检查以确保有人登录,但它不检查用户是否为内容的创建者。我试图创建一个第二的before_filter称为correct_user具有代码如下:防止其他登录用户访问'编辑'页面
def correct_user
@user = User.find(params[:id])
redirect_to(user_path(current_user)) unless current_user?(@user)
end
另外这里是运行一个GET请求来编辑自己的内容
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的情况下做到这一点?这似乎是我的简单小功能应该工作,但有人可以解释为什么它不?
说,在索引视图,这清除了很多东西,谢谢!但为什么你在第一行的末尾添加“if params [:id]”?离开它的后果是什么? – 2011-05-18 22:56:49
取决于你如何定义你的before_filter。如果before过滤器在每个动作上运行,它将在收集动作(index,new)上引发RecordNotFound异常。如果你之前的过滤器只在编辑,更新,销毁,创建之前运行,那么可能没有必要。基本上,如果第一行在params散列中找不到id,而不是执行并抛出异常,则不执行第一行。 – 2011-05-18 23:11:25
是的,我只有在某些行动上运行它。再次感谢! – 2011-05-18 23:20:56