我一直在努力解决这个问题,所以我想我会问专家。
我正在努力使用户只能编辑/查看他们使用Devise创建的项目。
我有用户设置并且运行良好。正在使用与之关联的用户创建项目,我可以通过rails控制台进行验证。
def create
@item = Item.new(params[:item])
@item.user = current_user
end
我现在要做的是让它一旦登录,用户只能看到他们创建的项目,而不能看到其他项目。
在我的项目控制器中尝试更换:
def index
@items = Items.all
end
带
def index
@items = current_user.Items.find(params[:id])
end
但这似乎不适合我,我得到了
undefined method `Items' for #<User:0x007fdf3ea847e0>
有人可以就下一步尝试提供任何建议吗?
非常感谢。
答案 0 :(得分:2)
也许我是老派,但我不会使用current_user来查找记录,只是为了验证权限。我会直接使用主键关系(它们不会改变):
@items = Item.find(:all, :conditions => { :user_id => current_user[:id] }
或
@items = Item.find_all_by_user_id current_user[:id]
至于设置权限,设计实际上并没有让你这样做但是有一个很好的补充名为Cancan,你一定要调查它。使用Cancan,您将拥有一个能够定义权限的ability.rb类。你正在寻找的是:
class Ability
can [:read, :show, :edit, :update, :delete, :destroy], Item do |item|
item.user_id == user.id
end
# or
can :manage, Item do |item|
item.user_id == user.id
end
end
阅读Cancan文档将澄清上面的代码。
答案 1 :(得分:1)
你要做的事情真的很接近......
current_user
是User
类的“实例”。
您要做的是使用用户实例中的关联,这是一种应用于每个用户的特殊方法 - “items
”。 (如果Item
类也有belongs_to :user
,那么它也会有一个名为user
的方法
您想要current_user.items.find(params[:id])
此外,当您创建它时,您也可以使用current_user.items.create(params[:item])
答案 2 :(得分:1)
如果我理解你的问题,我想你可能想看一个授权库 - 比如CanCan就可以了。
https://github.com/ryanb/cancan
它处理许可类型的事情非常流畅。很多人将这个库与Devise结合使用。