У меня проблема с определением способностей для множественных полиморфных ассоциаций.Вот мои модели:
class Document < ApplicationRecord
belongs_to :resource, polymorphic: true, optional: true
end
class Section < ApplicationRecord
has_many :documents, as: :resource, dependent: :destroy
end
class Cabinet < ApplicationRecord
has_many :documents, as: :resource, dependent: :destroy
end
Далее по моему documents_controller.rb
У меня есть следующее:
class DocumentsController < ApplicationController
load_resource :section
load_resource :cabinet
load_and_authorize_resource :document, through: [:section, :cabinet], shallow: true
end
А по моему ability.rb
у меня есть:
def viewer(users_role)
allowed_cabinet_ids = [2,5]
allowed_section_ids = [1,3,4]
can [:read, :create], Document, resource_id: allowed_cabinet_ids, resource_type: 'Cabinet'
can [:read, :create], Document, resource_id: allowed_section_ids, resource_type: 'Section'
end
Проблема возникает, когда я пытаюсь перейти к действию new
, чтобы создать документ для раздела.Путь localhost:3000/sections/1/documents/new
.
Когда я пытаюсь перейти на эту страницу, я получаю ошибку 403
.Я отладил @document
в действии new
и обнаружил, что cancancan
установил resource
как #<Document id: nil, name: nil, resource_type: 'Cabinet', resource_id: 1>
, что неверно и должно быть resource_type: 'Section'
.
Проблема зависит от позицииопределенных способностей, потому что, когда я меняю их, возникает проблема с localhost:3000/cabinets/:id/documents/new
.
Мой вопрос заключается в том, как я могу определить способности для полиморфных ассоциаций с различными типами и идентификаторами и гарантировать, что они будут объединять отношения, на которыхположение они?