0

有Permission Model,没有相关的db表,用于授权。使用 before_filter 授权方法创建新的权限对象,这取决于用户和可选的 test_id(另一个模型)。这个想法是它检查测试是否属于用户,它允许这个用户删除这个测试,如果不是,它取消交易。所以我的初始化方法:

class Permission
 def initialize(user, *test_id)
   @user = user
   if !test_id.empty?
     test_id.each do |t|
       test = Test.find_by_id(t)  #finding real test record
       self.instance_variable_set(:"@test_#{t}", test) #should set @test_{id} 
           #an instance of this new permission refering to actual test record
     end
   end
   allow :users, [:new,:create]
   allow :root,[]
   allow :session, [:create, :destroy]
   allow :tests, [:new, :create]
   if !test_id.empty?
     for i in 0...test_id.length
       t = self.instance_variable_get(:"@test_#{i}")  #getting this test record.
       if t.user_id == @user.id
         allow :tests, [:edit,:lock,:unlock, :destroy ]
       end
     end
   end
 end

问题是 rails 得到的结果instance_variable_get是 nil。所以要么我设置实例@test_{id} 错误,要么得到它。提前致谢

4

3 回答 3

2

您在顶部设置的每个实例变量的格式为@test_{record_id}. 您在 for 循环中获得的实例变量的格式为@test_{loop_index}. 只需使用与顶部相同的循环即可。

test_id.each do |t|
  trec = self.instance_variable_get(:"@test_#{t}")  #getting this test record.
  if trec.user_id == @user.id
    allow :tests, [:edit,:lock,:unlock, :destroy ]
  end
end
于 2013-04-11T19:44:31.677 回答
0

好吧,伙计们,我刚刚发现,我几乎没有把事情复杂化。在我的情况下,我真的不需要设置或获取实例变量,所以

if !test_id.empty?
   test_id.each do |t|
   test=Test.find_by_id(t)
   if test.user_id==user.id
     allow :tests, [:edit,:lock,:unlock, :destroy ]
   end
   end
   end

工作正常

于 2013-04-11T19:42:21.723 回答
0

您将实例变量用作数据库,其主键基于变量名称本身。不用说(我认为?),这不是一个好习惯。您可以使用instance_variable_set设置动态实例变量名称,但总的来说,我觉得这会使您的类变得不可预测,因为跟踪数据的行为是如何实现的更加困难。

如果您需要在实例中缓存多个对象,您可以使用数组或哈希等数据结构,并将其设置为自己的实例变量。

于 2013-04-11T19:44:50.460 回答