Ruby on rails 可以通过能力检查传递对象

Ruby on rails 可以通过能力检查传递对象,ruby-on-rails,cancan,user-roles,cancancan,Ruby On Rails,Cancan,User Roles,Cancancan,我正在使用Cancancan设置管理功能。我有一个协会,那里有一个房间 has_one:group,through::property 我知道不能使用cancancan传递对象,但我们可以使用散列来检查能力 #ability.rb if user.has_role?(:admin) can :manage, Room, :group => { :id => user.group_id } end 当我加载我的索引、显示、更新、编辑和销毁方法时,上面的能力检查有效,

我正在使用Cancancan设置管理功能。我有一个协会,那里有一个房间

has_one:group,through::property

我知道不能使用cancancan传递对象,但我们可以使用散列来检查能力

#ability.rb

if user.has_role?(:admin)    
  can :manage, Room, :group => { :id => user.group_id }  
end
当我加载我的索引、显示、更新、编辑和销毁方法时,上面的能力检查有效,但当我加载新方法或创建方法时不起作用。 我知道Cancancan会以散列的形式传递任何条件,但我认为它不会传递我的散列,因为组被设置为一个关联,而不是每个房间对象上的一列

#rooms_controller.rb

class RoomsController < ApplicationController 
  load_and_authorize_resource
    def new
      @room = Room.new
    end
end
#rooms_controller.rb
类RoomsController<应用程序控制器
加载和授权资源
def新
@房间
结束
结束
我的问题是,我如何在新方法和创建方法上检查这种能力,最好不向对象添加新列

谢谢你的帮助


谢谢

如果您正在使用
加载和授权资源
,您不应该在
新建方法中执行
@room=room.new
load\u和\u authorize\u资源
方法为您完成这一任务。所以我的假设是你正在覆盖它初始化的那个


这同样适用于
RoomsController
中的所有其他方法,除非您希望覆盖图像的加载方式(快速加载等)或搜索方式。

何时设置房间所属的组?它是通过创建时的属性设置的。每个组大约有6个属性,每个属性大约有10个房间。即使删除了
@room=room.new
,我仍然有相同的问题。因此,我应该补充一点,您的问题表明您希望在新建/创建方法中检查此功能。但是对于新建/创建,
load_and_authorize
部分只是初始化一个值并使用查询参数填充它(在创建的情况下)。B/c您说过用户可以管理
房间
,他们总是可以创建房间。在这个场景中没有真正的授权(检查组id)。但是它在新建和创建时检查它。当我有
can:manage,Room,:group=>{:id=>user.group\u id}
时,它失败了,但当我只有
can:manage,Room
时,它通过了检查。但仅限于新建和新建