尝试使用权威使用户授权更加干燥

时间:2014-09-20 19:44:27

标签: ruby-on-rails ruby pundit

我正在使用专家来处理rails应用程序中的ruby中的授权,我想看看登录的用户是否可以在显示删除和编辑帖子,评论等按钮之前适度。

以下是发布政策,评论政策等的原始工作方法

 def destroy
   user.present? && (user == record.user || user.role?(:admin) || user.role?(:moderator))
 end

这是我添加到应用程序策略的新方法

  def can_moderate?(user, record)
    @user = user
    @record = record
    user == record.user || user.role?(:admin) || user.role?(:moderator)
  end

这是我正在研究的DRYer邮政政策

  def destroy?
    user.present? && user.can_moderate?
  end

这个DRYer版本为can_moderate提供了一个未定义的错误方法。 有什么想法吗?

谢谢!

编辑添加完整错误

ActionView::Template::Error (undefined method `can_moderate?' for #<User:0xb5671e60>):
14:     <% if policy(@post).edit? %>
15:       <%= link_to "Edit", edit_topic_post_path(@topic, @post), class: 'btn btn-success' %>
16:     <% end %>
17:     <% if policy(@post).destroy? %>
18:       <%= link_to "Delete", [@topic, @post], method: :delete, class: 'btn btn-danger', data: { confirm: 'Are you sure you want to delete this topic?' } %>
19:     <% end %>
20:   </div>
app/policies/post_policy.rb:7:in `destroy?'
app/views/posts/show.html.erb:17:in `_app_views_posts_show_html_erb___159039275__620331048'

2 个答案:

答案 0 :(得分:2)

不要在用户对象上调用can_moderate?。假设用户类/模型中存在can_moderate?。相反,只需在当前相同的文件/控制器中调用该方法。

  def destroy?
    user.present? && can_moderate?
  end

你还可以拥有can_moderate吗?方法

  def can_moderate?(user, record)
    user == record.user || user.role?(:admin) || user.role?(:moderator)
  end

答案 1 :(得分:-1)

DRYer版本,

# policy file
def destroy?
  can_moderate?
end

def can_moderate?(user, record)
  user.present? && user == record.user ||
                   user.role?(:admin)  || user.role?(:moderator)
end