我有一个Users
模型和一个关联的Company
模型以及我使用脚手架构建的相应控制器。
每个company
操作[:show, :edit, :update, :destroy]
只能在关联的user
上访问。
Rails scaffolding生成了以下代码:
class CompaniesController < ApplicationController
before_action :set_company, only: [:show, :edit, :update, :destroy]
<actions>
private
def set_company
@company = Company.find(params[:id])
end
然而,这允许任何用户访问任何公司,这是一个安全问题。因此我更改了set_company
方法如下:
def set_company
if current_user.companies.find_by_id(params[:id]).present?
@company = current_user.companies.find(params[:id])
else
redirect_to companies_url
end
end
这似乎工作正常。谁能告诉我这是否是处理这个问题的正确方法?
答案 0 :(得分:1)
在我看来,添加set_company
方法的验证令人困惑。让方法做一件事通常是一个更好的主意。也许您可以创建另一个名为correct_user
def correct_user
@company = current_user.companies.find_by(id: params[:id])
redirect_to companies_url if @company.nil?
end
然后你可以简单地添加另一个before_action
before_action :correct_user, [:show, :edit, :update, :destroy]
这可以使所有内容更清晰,并使代码更易于维护,以便其他程序员(或您未来的自己)能够确切知道每种方法的作用。
希望有所帮助。