我正在使用专家来处理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'
答案 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