【问题标题】:Rails 3, help controlling access to a record based on the user idRails 3,帮助根据用户id控制对记录的访问
【发布时间】:2010-09-05 21:45:53
【问题描述】:

我是 Rails 新手......这就是我想要做的......

我为笔记创建了一个脚手架(t.text :content, t.integer :user_id)

我现在要做的只是允许用户查看他们创建的笔记。即(== user_id)

在我的 /app/controllers/notes_controller.rb 中

我有以下:

class NotesController < ApplicationController
    before_filter :authenticate
    before_filter :correct_user
.
.
.
.



def correct_user
  @noteuserid = Note.find(:conditions=>["note.user_id=?", @noteuserid])
  redirect_to(root_path) unless current_user?(@noteuserid)
end

我在理解如何编写以下行时遇到问题:@noteuserid = Note.find(:conditions=>["note.user_id=?", @noteuserid])

有什么想法吗?

谢谢

【问题讨论】:

  • 不应该这样工作吗? Note.where(["user_id = ?", current_user])

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

在 Rails 3 中:

Note.where(:user_id=>current_user)

或者,您可以从用户开始...

User.find(current_user_id).notes.find(note_id)

【讨论】:

  • 这会去哪里?有什么办法可以像上面那样把整个街区弄出来?我是 Rails 新手,所以这对了解您的想法有很大帮助
  • 这取决于你如何定义你的用户。如果你还没有解决那个问题,你需要。我假设您以某种方式设置了一个会话来验证用户是谁...
  • 现在我正在使用 Rails 3 教程书中的系统:railstutorial.org/chapters/sign-in-sign-out#sec:current_user
  • 似乎问题在于 current_user 是一个对象,而不是一个 ID...不知道如何使两者具有可比性...
  • Rails 似乎拒绝这个:“current_userid = current_user.id”
【解决方案2】:

所以,首先要找到用户正在访问的Note,然后检查该Note对该用户是否有效。我会尝试这样的事情(假设您的 current_user? 方法检查给定的用户 ID 是否与当前登录的用户匹配:

def correct_user
  current_note = Note.find(params[:id])
  redirect_to(root_path) unless current_user?(current_note.user_id)
end

此外,您可能需要注意使用 correct_user 过滤器过滤控制器中的所有操作,因为创建便笺的操作可能没有要检查的便笺 ID。此外,当您查看笔记集合时,您需要进行不同的过滤(例如Note.find(:all, :conditions =&gt; { :user_id =&gt; current_user_id }))。在特定操作中应用正确的逻辑而不是作为通用过滤器可能更合适。

最后,你可以看看cancan 插件,它可以用这样的代码为你做很多艰苦的工作。

【讨论】:

  • 谢谢,这个插件看起来很酷。现在我想在使用任何插件之前学习基础知识,这就是我进行这个练习的原因。奇怪的是,上面的代码不起作用,它总是重定向回root_path,有没有一种简单的方法可以在Rails中调试这种问题?
  • 在这种情况下我要做的第一件事就是从日志开始。检查您期望的查询是否被记录。如果过滤器重定向,Rails 将记录,因此值得检查您期望的过滤器是否重定向到 root。如果失败,则开始添加您自己的日志记录以诊断问题。例如。是你的 current_user?方法接收和返回你所期望的。
猜你喜欢
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 2021-05-07
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多