2012-08-01 59 views
6

我已经用Devise和CanCan创建了一个Rails应用程序。我拥有与文章具有一对多关系的用户。我是新来的康康舞,这里就是我打算做的事:CanCan - 如何允许用户更新和删除他们自己的对象

联系

  • 可以做到在用户登录文章

任何行动

  • 可以阅读和创建文章
  • 可编辑和删除自己的帖子

Guest用户

  • 可以阅读文章

但我无法理解惨惨的语法。我明白它会是这样的。

def initialize(user) 
    user ||= User.new 
    if user.admin? 
    can :manage, Article 
    else 
    can :read, Article 
    end 
end 

但这只是为管理和guest用户,我不知道如何从登录的用户区分访客用户,因为它创建了一个新的用户对象时用户是空的。我已经看到代码应该是这样can [:edit, :destroy], Article, :user_id => user.id,但我不确定这将如何适合初始化方法。

还有最后一个问题,如果我只在宾客中定义了can :read, Article,它是否会阻止其他操作,如创建和更新,如列出读取操作的白名单?

任何帮助,将不胜感激。非常感谢!

回答

15

这里就是我所做的:

在ability.rb

def initialize(user) 
    if user.nil? 
    can :read, Article 
    elsif user.admin? 
    can :manage, Article 
    else 
    can [:read, :create], Article 
    can [:update, :destroy], Article, :user_id => user.id 
    end 
end 

和显示的链接,我用这个:

- if can? :read, Article 
    = link_to 'Show', article 
- if can? :create, Article 
    = link_to 'New Article', new_article_path 
- if can? :update, article 
    = link_to 'Edit', edit_article_path(article) 
- if can? :destroy, article 
    = link_to 'Destroy', article, method: :delete, data: { confirm: 'Are you sure?' } 

而且似乎是现在的工作,不知道这是否是最好的方式。

+0

该视图看起来不太好,但它与问题主题无关,这似乎在你的ability.rb中得到了很好的覆盖。 – 2012-08-01 07:38:42

+0

我使用自制的助手,比如link_to_edit,link_to_destroy等等。我的助手包括can?()的调用,所以不需要将逻辑放入视图中。 – 2012-08-02 04:00:14

相关问题