Ruby on rails 禁止用户查看其他帖子

Ruby on rails 禁止用户查看其他帖子,ruby-on-rails,ruby,ruby-on-rails-3,devise,cancan,Ruby On Rails,Ruby,Ruby On Rails 3,Devise,Cancan,我有一个显示其他用户发表的帖子的页面,我可以这样做,如果你转到索引,它只显示用户id为=当前用户id的帖子。但是如果我转到url并更改帖子编号,我可以看到其他用户的帖子,甚至可以编辑它们。我尝试过更改控制器show@time\u sheets=TimeSheet.where(:user\u id=>current\u user.id)find(params[:id]),也尝试过在视图中使用,但两者似乎都不起作用。我做错了什么?在控制器中,您应该: @time_sheet = TimeSheet.

我有一个显示其他用户发表的帖子的页面,我可以这样做,如果你转到索引,它只显示用户id为=当前用户id的帖子。但是如果我转到url并更改帖子编号,我可以看到其他用户的帖子,甚至可以编辑它们。我尝试过更改控制器show
@time\u sheets=TimeSheet.where(:user\u id=>current\u user.id)find(params[:id])
,也尝试过在视图中使用
,但两者似乎都不起作用。我做错了什么?

在控制器中,您应该:

@time_sheet = TimeSheet.where(user_id: current_user.id).find(params[:id])
或者,如果您有关联用户有多个时间表:

@time_sheet = current_user.time_sheets.find(params[:id])
它应该会起作用


顺便说一句,在调用这段代码之前,您当然应该检查是否有人登录

如果用户试图访问其他用户的页面,您可以使用before_筛选器并将用户重定向到带有错误消息的主页

before_filter :validate_user

def validate_user
  timesheet_user_id = Timesheet.find(params[:id]).user_id
  redirect_to :root, :alert => "Unauthorized" unless timesheet_user_id == current_user.id
end

您可以阅读有关过滤器的更多信息,这些过滤器工作得很好,您知道当他们试图查询一个不是他们的错误页面时,我如何显示错误页面吗?如果我没记错的话,默认情况下将显示404。这不好吗?如果“效果很好”,你介意接受这个答案吗哦,我是rails的新手,我在本地运行它,所以它会将我重定向到一个显示不返回的方法的页面。当你进入生产阶段时,我想它将不再是这些页面,而是404,对吗?你从开发中得到了什么信息
RecordNotFound
ActiveRecord::RecordNotFound at/time\u sheets/5找不到id=5的时间表[其中“time\u sheets”。“user\u id”=2]
然后是一个带有show方法的窗口,突出显示行
@time\u sheet=current\u user.time\u sheets.find(参数[:id])
参数[:id]
是time\u sheets id,不是用户id。检查本集和第二集,这可能是最好的授权方法。请注意,您批准的答案只会向当前用户显示他在certian链接上的帖子,但不会阻止他访问其他帖子。该用户将如何访问它,我尝试通过url查询它们,现在如果您尝试查询不属于您的帖子,则为404。(:id应该是真实的)尝试一下(如果端口或资源名称与您的不同,请更正)