Rails:如何使控制器操作仅对关联用户可用

时间:2016-03-19 00:58:26

标签: ruby-on-rails-4 controller associations

我有一个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

这似乎工作正常。谁能告诉我这是否是处理这个问题的正确方法?

1 个答案:

答案 0 :(得分:1)

在我看来,添加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]

这可以使所有内容更清晰,并使代码更易于维护,以便其他程序员(或您未来的自己)能够确切知道每种方法的作用。

希望有所帮助。