我正在尝试实现访问我们软件模型的角色系统。所以我有两个模型和这两个模型的绑定模型。
角色(id,name),ModObject(id,name),ModObjectsRoles(role_id,mod_object_id,canCreate,canRead,canUpdate,canDelete)。最后四个字段是布尔值。
角色模型:
class Role < ActiveRecord::Base
acts_as_authorization_role
has_many :mod_objects_roles
has_many :mod_objects, :through => :mod_objects_roles
def change_role_permissions(mod_object_id)
@tmp = self.mod_objects_roles.find_by_mod_object_id(mod_object_id) #I get from mod_objects_roles table the row with mod_object_id=34
@tmp.canUpdate = false #change value of 'canUpdate' field to false
@tmp.save # and save it
end
end
ModObject模型:
class ModObject < ActiveRecord::Base
has_many :mod_objects_roles
has_many :roles, :through => :mod_objects_roles
end
一个关联,加上上面这两个,ModObjectsRole:
class ModObjectsRole < ActiveRecord::Base
belongs_to :mod_object
belongs_to :role
end
问题是,当我试图改变ModObjectsRole模型的canCreate,canRead,canUpdate,canDelete字段为true或false值时,它会给我错误。我现在尝试了3天或更长时间的几种方法。我找不到怎么做。
在RolesController中,我使用以下代码:
class RolesController < ApplicationController
before_action :set_role, only: [:show, :edit, :update, :destroy]
def update
respond_to do |format|
if @role.update(role_params)
@role.change_role_permissions(34) # this is where I am trying to test
format.html { redirect_to @role, notice: "Hi"}
format.json { render :show, status: :ok, location: @role }
else
format.html { render :edit }
format.json { render json: @role.errors, status: :unprocessable_entity }
end
end
end
我在上面的控制器中使用mod_object_id作为34只是为了测试,让我学习如何做到这一点,我将尝试为自己处理剩下的事情:
这是ModObjectRole的表版本,表mod_objects_roles:
mod_object_id | role_id | canCreate | canRead | canUpdate | canDelete
34 1 TRUE TRUE TRUE TRUE
2 1 FALSE FALSE TRUE TRUE
如果有人有经验,请帮助我。 提前谢谢你......
更新,我得到的错误是:
TypeError in RolesController#update
nil is not a symbol
Extracted source (around line #10):
@tmp = self.mod_objects_roles.find_by_mod_object_id(mod_object_id) #I get from mod_objects_roles table the row with mod_object_id=34
@tmp.canUpdate = false #change value of 'canUpdate' field to false
@tmp.save # and save it
end
end
答案 0 :(得分:1)
我终于解决了它。由于模型ModObjectRole没有主键,因此出现错误。所以我不得不使用名为composite_primary_key的gem并为它设置一个复合主键,如(mod_object_id,role_id)。这就是全部......
谢谢...