更改角色和mod_objects中的关联表字段时出错

时间:2015-04-13 09:56:41

标签: ruby-on-rails ruby-on-rails-4 activerecord

我正在尝试实现访问我们软件模型的角色系统。所以我有两个模型和这两个模型的绑定模型。

角色(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

1 个答案:

答案 0 :(得分:1)

我终于解决了它。由于模型ModObjectRole没有主键,因此出现错误。所以我不得不使用名为composite_primary_key的gem并为它设置一个复合主键,如(mod_object_id,role_id)。这就是全部......

谢谢...