Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使用可选的嵌套资源和cancan?_Ruby On Rails_Ruby On Rails 4_Cancan - Fatal编程技术网

Ruby on rails 如何使用可选的嵌套资源和cancan?

Ruby on rails 如何使用可选的嵌套资源和cancan?,ruby-on-rails,ruby-on-rails-4,cancan,Ruby On Rails,Ruby On Rails 4,Cancan,我有可以通过其他资源访问的资源,如 resources :projects do resources :tasks end resources :tasks 如果任务是通过project访问的,我想呈现一些与项目相关的信息,这几乎就是所有的区别 但是,我使用cancan并需要授权所有内容,因此我在TasksController中编写了 load_and_authorize_resource :project load_and_authorize_resource :task, throug

我有可以通过其他资源访问的资源,如

resources :projects do
  resources :tasks
end
resources :tasks
如果任务是通过project访问的,我想呈现一些与项目相关的信息,这几乎就是所有的区别

但是,我使用cancan并需要授权所有内容,因此我在TasksController中编写了

load_and_authorize_resource :project
load_and_authorize_resource :task, through: :project
但当我们不嵌套任务时,这会破坏功能

我怎样才能优雅地解决这个问题

我的第一个想法是使用两个控制器而不是TasksController,并使用关注点共享所有常见的东西,但这有点混乱(至少我必须明确指定视图)

我能想到的另一种方法是手动授权,而不是使用cancan助手


还有其他方法吗?

我会限制在没有项目范围的情况下可以访问的路线:

resources :projects do
  resources :tasks
end
resources :tasks, only: :index
然后,您可以为其余操作调用cancan helper方法,并在index方法上处理自定义加载和授权:

class TasksController < ActionController::Base
  load_and_authorize_resource :project, except: :index
  load_and_authorize_resource :task, through: :project, except: :index

  def index
    authorize! :index, Task
    if params[:project_id].present?
      @project = Project.find(params[:project])
      authorize! :show, @project
      @tasks = @project.tasks.accessible_by(current_ability)
    else
      @tasks = Task.accessible_by(current_ability)
    end
  end
class TasksController

注意:如果要为这两种资源处理新建/创建/编辑/更新操作,则需要自定义视图,并且使用两个控制器会更容易。

我认为,您应该手动处理数据授权。它只需要简单的if条件。在这里使用cancan可能会使解决方案复杂化。我喜欢越简单越好。