使用Devise,如何创建它以便用户只能编辑/查看属于它们的项目

时间:2011-10-22 00:39:17

标签: ruby-on-rails authentication devise

我一直在努力解决这个问题,所以我想我会问专家。

我正在努力使用户只能编辑/查看他们使用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>

有人可以就下一步尝试提供任何建议吗?

非常感谢。

3 个答案:

答案 0 :(得分:2)

  1. 也许我是老派,但我不会使用current_user来查找记录,只是为了验证权限。我会直接使用主键关系(它们不会改变):

    @items = Item.find(:all, :conditions => { :user_id => current_user[:id] }

  2. @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_userUser类的“实例”。

您要做的是使用用户实例中的关联,这是一种应用于每个用户的特殊方法 - “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结合使用。