Насколько я могу сказать, ваши авторизации были правильными.
Разработчик CanCan gem ryan написал, как это должно вести себя: https://github.com/ryanb/cancan/issues/127#issuecomment-364475
Это означает, что ваш
load_and_authorize_resource :account
load_and_authorize_resource :project, :through => :account
load_and_authorize_resource :model, :through => :project
окажется в блоке, подобном следующему (здесь: создайте действие. Для других действий следует выполнить последнюю авторизацию! И изменение @model):
@account = Account.find(params[:account_id])
authorize! :read, @account
@project = @account.projects.find(params[:project_id])
authorize! :read, @project
@model = @project.models.build
authorize! :new, @model
Я надеюсь, что этот ответ можетпомочь разработчикам, ищущим вложенную авторизацию cancan :-).
источник: https://github.com/ryanb/cancan/issues/127#issuecomment-364475
ps: неправильное поведение для / account / 1 / projects / 2 / models / new:
load_and_authorize_resource :project
load_and_authorize_resource :model, :through => :project
Это своего рода проблема безопасности, потому что это будет делать
@ project = Project.find (params [: project_id]) [...]
и не проверяет, разрешено ли текущему аккаунту читать связанный аккаунт «1».И он не проверяет, действительно ли проект «2» является проектом с учетной записью «1».