首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Cancancan不能让正确的用户以奇怪的方式创建、更新或删除

Cancancan不能让正确的用户以奇怪的方式创建、更新或删除
EN

Stack Overflow用户
提问于 2019-08-13 10:28:50
回答 1查看 145关注 0票数 0

我正在使用Devise和cancancan。我有Book模型和Post模型。在应用cancancan后,在图书中,将编辑和删除限制为匹配user.id的用户可以正常工作。我也可以创建一本没有问题的书。在每本书中,我可以(或者应该能够)创建一篇文章。限制编辑和删除在这里也很好用。但是当我以一个为这篇文章创建了这本书的登录用户创建了一篇文章时,它显示我不被允许这样做。

当我去掉下面的"load_and_“时,我可以创建帖子,但其他用户也不能这样做。

posts控制器:

代码语言:javascript
运行
复制
    load_and_authorize_resource :nested => :book

ability.rb (我最初使用的是“管理”,而不是CRUD,但在尝试了不同的方法后,每个CRUD都拼写出来了;两者都不起作用):

代码语言:javascript
运行
复制
class Ability
  include CanCan::Ability

  def initialize(user)
    if user.present?
      can [:create, :read, :update, :destroy], Book, user_id: user.id
      can :read, Book

      can [:create, :read, :update, :destroy], Post, book: { user_id: user.id } 
      can :read, Post
    end

routes.rb:

代码语言:javascript
运行
复制
  resources :books do
    resources :posts, shallow: true
  end

  resources :posts do
    resources :comments, shallow: true
  end

  resources :users do
    resources :comments, shallow: true 
  end

...since我在问一个问题,让我添加另一个相关的问题,以防有人想回答:

我有以下代码来显示或不显示编辑/删除一个帖子。无论哪个用户在看它们,它们似乎都会显示出来。在图书列表中,它们被隐藏或显示得很好。不知道为什么它不能在这里工作。

代码语言:javascript
运行
复制
    <td>
        <% if can? :update, Post %>
          <%= link_to 'Edit', edit_post_path(post) %>
        <% end %>
    </td>
    <td>
        <%if can? :destroy, Post %>
            <%= link_to 'Destroy', {:controller => :posts,
              :action => 'destroy', :id => post },
              method: :delete,
              data: { confirm: 'Are you sure?' } %>
        <% end %>
    </td>

更新

在我将posts控制器上的load_and_authorize_resource更改为:

代码语言:javascript
运行
复制
    load_and_authorize_resource :book
    load_and_authorize_resource :post, through: :book

我现在可以创建一个post,并适当地设置auth。但现在我不能编辑或删除。

...any的想法?

错误消息突出显示:

代码语言:javascript
运行
复制
          raise AccessDenied.new(nil, authorization_action, resource_class) # maybe this should be a record not found error instead?
EN

回答 1

Stack Overflow用户

发布于 2019-08-13 11:16:54

解决方案是替换:

代码语言:javascript
运行
复制
load_and_authorize_resource :post, through: :book

在posts控制器中:

代码语言:javascript
运行
复制
load_and_authorize_resource :post, through: :book, :shallow => true

因为我的book和post的嵌套路由(如我的问题所示)是浅层的。

但我仍然可以在其他用户的帖子上看到编辑/删除...任何帮助都将不胜感激。

更新:

查看编辑/删除的解决方案是更改

代码语言:javascript
运行
复制
<% if can? :update, Post %>

代码语言:javascript
运行
复制
<% if can? :update, post %>

因为它是

代码语言:javascript
运行
复制
<% @book.posts.each do |post| %>

很明显,但应该有匹配的模型进入可以吗?参考模型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57470388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档