声明性授权 - 允许编辑文章中留下的其他评论?

时间:2010-02-04 13:02:40

标签: ruby-on-rails declarative-authorization

我正在关注Ryan Bates的declarative authorization railscast。我正在尝试为特定文章的作者添加功能,以便能够编辑他的文章中留下的评论,无论他是否是所有者。我试过这样做,但无法让它发挥作用。

  role :author do
    has_permission_on :articles, :to => [:new, :create]
    has_permission_on :articles, :to => [:edit, :update, :show] do
      if_attribute :user => is { user }
    end
    **has_permission_on :comments, :to => [:edit, :update] do
      if_attribute :article_id => is { user }
    end**
  end

如何修改评论行上的has_permission以允许用户编辑评论(如果仅留在他的文章中?)

由于

2 个答案:

答案 0 :(得分:3)

为了允许用户编辑他/她的文章中发布的评论,该规则应如下所示:

role :author do
  [...]

  has_permission_on :comments, :to => [:edit, :update] do
    if_attribute :article_id => is_in { user.article_ids }
  end
end

请注意 is_in

的变化

或者,您可以按user.article_ids

更改user.articles.collect{|a| a.id}.uniq

答案 1 :(得分:0)

你的第一份声明......

has_permission_on :articles, :to => [:edit, :update, :show] do
  if_attribute :user => is { user }
end

...完美有效,因为如果:user等于user(这是当前登录的用户 - current_user),您有权在:articles上执行声明的操作。

但如果你看第二个......

has_permission_on :comments, :to => [:edit, :update] do
  if_attribute :article_id => is { user }
end

您可以看到属性:article_id永远不会等于登录user的当前内容。

现在我自己是一个Rails新手,我只是使用了声明授权的一些基本功能,所以我不知道你的问题的确切答案。但我认为您必须找到一种方法来访问user的文章,例如if_attribute :article_id => is { user.articles.id }

也许您可以在文档中找到答案here