Rails: 如何使控制器操作仅对关联用户可用
Rails: How to make controller actions only available to associated users
我有一个 Users
模型和一个关联的 Company
模型以及我使用脚手架构建的相应控制器。
每个 company
操作 [:show, :edit, :update, :destroy]
只能在关联的 user
.
中访问
Rails脚手架生成了如下代码:
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
这似乎工作正常。谁能告诉我这是否是处理此问题的正确方法?
在我看来,添加 set_company
方法的验证令人困惑。让方法做一件事通常是一个更好的主意。或许您可以创建另一个名为 correct_user
的 before_action
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]
这让一切都变得更干净,并使您的代码更易于维护,这样其他程序员(或您未来的自己)就会确切地知道每个方法的作用。
希望对您有所帮助。
我有一个 Users
模型和一个关联的 Company
模型以及我使用脚手架构建的相应控制器。
每个 company
操作 [:show, :edit, :update, :destroy]
只能在关联的 user
.
Rails脚手架生成了如下代码:
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
这似乎工作正常。谁能告诉我这是否是处理此问题的正确方法?
在我看来,添加 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]
这让一切都变得更干净,并使您的代码更易于维护,这样其他程序员(或您未来的自己)就会确切地知道每个方法的作用。
希望对您有所帮助。