我怎么能干这个?
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")
答案 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)
假设您希望此设施位于ConstructionCompaniesController
和RealEstateCompaniesController
内:
def correct_user
@company = controller_name.classify.constantize.find(params[:id])
redirect_to(root_path) unless (current_user == @company.user)
end