干我:Rails代码

时间:2010-11-08 00:19:19

标签: ruby-on-rails ruby-on-rails-3 dry

我怎么能干这个?

def correct_user
  @company = RealEstateCompany.find(params[:id])     
  if(current_user != @company.user)
    redirect_to(root_path)
  end
end  

def correct_user
 @company = ConstructionCompany.find(params[:id])     
 if(current_user != @company.user)
   redirect_to(root_path)
 end
end

答案如下,在模块中如下:

def correct_user_for_controller?(controller_name)
  @company = controller_name.classify.constantize.find(params[:id])     
  redirect_to(root_path) unless (current_user == @company.user)
end     

然后在任何控制器内部包含模型并使用

correct_user_for_controller?("ConstructionCompany") 

correct_user_for_controller?("RealEstateCompany")

3 个答案:

答案 0 :(得分:3)

module OwnershipPermission
    def accessible_for_user?(user)
        self.user == user
    end
end

只需在两个模型中包含此模块并执行模型级别检查。    您也可以为控制器创建一个模块,但我强烈建议不要这样做(伤害可维护性)。

答案 1 :(得分:2)

看起来您正在尝试进行授权检查(< / clippy>)。

您是否检查过任何现有的综合授权解决方案?利用其他人的努力来解决这个常见问题可能是有意义的。

这个thread on authorization for rails给出了一些例子。特别是,使用CanCan,您可以在要保护的方法中包含类似的内容:

authorize! :read, @company

其中说“当前用户是否有权查看@company的详细信息”。

答案 2 :(得分:1)

假设您希望此设施位于ConstructionCompaniesControllerRealEstateCompaniesController内:

def correct_user
  @company = controller_name.classify.constantize.find(params[:id])     
  redirect_to(root_path) unless (current_user == @company.user)
end