Gem devise 中的 current_user 方法的使用。

fengfans · 2013年05月29日 · 最后由 fengfans 回复于 2013年05月30日 · 3486 次阅读

我有两个模型,它是一个单词表--wordlist,它与 user 是一对一的关联。 我想在 wordlist 的 index 视图中仅显示调用当前登录用户的 wordlist,在 wordlist 的控制器 index 方法中,如何写代码? 即:wordlist 的 index 方法中如何写,在对应的视图中如何调用。 目前代码是 def index @wordlist = Wordlist.all end 在视图中使用@wordlist.each方法来显示 wordlist 的各个字段(属性)值。

你要在 wordlist 里面加入 user_id 字段 还有 在 user 和 wordlist model 里面写上 has_one 和 belong_to 然后就可以 了 我桌面感觉你这个关系应该是 one_to_many 啊 一个用户有很多 wordlist

在一对一关联的状态下,我也是这么做的,但是实现不了。改成 one_to_many 的,就可以了。我想在这个基础上,实现一个这样的业务逻辑: 1、每个用户仅能对自己的单词表进行增、删、改、查操作,而无法对其他用户的单词表做这样的操作。 2、今后想实现,普通的注册用户仅能创建一个单词表,只有授权的用户可以实现多个单词表。 请问实现这样的效果,实现的思路是什么?我用的是 devise 插件。

#2 楼 @fengfans wordlist 表加个标记字段

首先,你既然打算以后让授权用户可以创建多个单词表,那么你的 user 表 和 wordlist 的关系一定得是一对多的啊,你的帖子里说是 一对一,这让我很迷惑。

我就当是一对多吧。当你在 activerecord 里面指定了 user 和 wordlist 的关系后,你应该可以通过

current_user.wordlists 来取出当前用户对应的 wordlist 来的。Rails 会自动取出 user_id 对应当前用户的 wordlist 来。这样的话,当然『每个用户仅能对自己的单词表进行增、删、改、查操作,而无法对其他用户的单词表做这样的操作。』啦。

『今后想实现,普通的注册用户仅能创建一个单词表,只有授权的用户可以实现多个单词表。 请问实现这样的效果,实现的思路是什么?』

我觉得你在 #2 楼 的两个需求啊,其实都是关于权限控制方面的内容,这跟你用不用 devise 貌似关系不是很大。有兴趣的话,去了解一下 cancan 这个 gem 吧。

@alsotang 非常感谢您的回复! 用户登录后,显示的也确实是当前用户的 wordlist,但是如果我更换链接中的 wordlist 的 ID,也同样可以查看它的详情,包括修改与删除。如果想实现,是不是也需要借助 cancan

#5 楼 @fengfans 小需求其实也没必要用那么多库,你可以简单地做 before_filter 判断啊。

在 wordlist 的 controller 里面的 delete 和 edit 里面判断一下:

if current_user.id == wordlist.user_id then allow else deny end

非常感谢!新手,不熟悉!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号