【问题标题】:Rails routing devise_for / resources CRUD overlapRails 路由 devise_for / 资源 CRUD 重叠
【发布时间】:2011-06-04 08:06:33
【问题描述】:

我已经为我的用户类设计了工作,我正在尝试向用户控制器添加一些 CRUD 方法。我已经阅读了有关路由的信息,只要 devise_for 出现在 resources 之前,它就会优先,否则您将只能通过 /users/sign_in 或其他方式访问不存在的记录。无论如何。

我的 CRUD 方法有效,甚至还有一些资源。假设用户拥有许多财产。我可以通过 /users/1/possessions/1 查看所有物,但是当我尝试删除它时,我无法访问 Devise current_user 方法。我可以通过使用 params[:user_id] 查找用户来删除,然后通过 params[:id] 找到它的财产,但如果我只希望登录用户能够删除他/她自己的财产,这并不安全.

如何在我的用户模型的 CRUD 方法中使用 Devise 的方法?

【问题讨论】:

    标签: ruby-on-rails devise crud


    【解决方案1】:
    【解决方案2】:

    更好的做法可能是不要将所有物路由嵌套在用户下,而是将其作为/possessions/1 单独使用,并在你的所有物控制器中使用 current_user 来确定所有发现的范围,即:

    def index
      @possessions = current_user.possessions
    end
    
    def edit
      @possession = current_user.possessions.find(params[:id])
      ...
    end
    

    这样您就可以确保用户永远只能看到他们自己的物品,如果他们试图访问他人的财产,他们将收到 404。

    Inherited Resources 让这很容易做到,所以你可以像这样编写你的控制器:

    class ProjectsController < InheritedResources::Base
      protected
        def collection
          @projects ||= end_of_association_chain.paginate(:page => params[:page])
        end
    end
    

    【讨论】:

    • 这是有道理的,除了我正在使用 Mongoid 并希望 Possessions 可以公开查看,因此 Possessionembedded_in User,我无法访问它而不去通过根文档 (User)。此外,这确实对我遇到的问题没有影响,现在我认为在我的销毁方法中我的possessions_controller 中一定有另一个原因,current_user 返回 nil。它在 show 方法中有效,但在 destroy 中无效。有什么想法吗?
    猜你喜欢
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多