깊이 끼워 넣은 자원이 권한이 부여되지 않은 이상을 일으키다

3812 단어 cancan

묘사

이렇게 많은 배우와 이 플러그인에 감사합니다, 라이언!하지만, 나는 한 가지 문제가 있다. 나는 너의 도움으로 해결되기를 바란다.
나는 문서의 지침에 따라 이 일을 했지만, 일은 내가 예상한 대로 진행되지 않았다.최신 버전의 CanCan 및 Rails 2.3.8을 사용하고 있습니다.
나는 세 가지 모델이 있는데 그것이 바로 사용자, 프로젝트와 임무이다.
클래스 사용자항목
끝맺다
class Project < ActiveRecord::Base
    belongs_to :user
    has_many :tasks
end

class Task < ActiveRecord::Base
    belongs_to :project
end
내 노선 중에는 다음과 같은 몇 가지가 있다.
지도 1에셋:사용자,:많은 =>:항목
지도 1자원:항목,:많은 =>:tasks,:속=>:user
지도 1에셋:작업:속=>:프로젝트
내 디렉터에서 다음을 수행합니다.
클래스 UsersController리소스 로드 및 권한 부여
끝맺다
class ProjectsController < ApplicationController
    load_and_authorize_resource :user
    load_and_authorize_resource :project, :through => :user
end

class TasksController < ApplicationController
    load_and_authorize_resource :project
    load_and_authorize_resource :task, :through => :project
end
내 능력 과정에 다음과 같은 몇 가지가 있다.
학급 능력
CanCan 포함: 기능
    def initialize(user)
        can :read, :all
        can :manage, User, :id => user.id
        can :manage, Project, :user_id => user.id
        can :manage, Task, :project => { :user_id => user.id }
    end
end
만약 내가 id=1의 사용자와 id=3의 항목과 함께 로그인한다면.
이거 되게 좋아요.
/사용자/
/사용자/편집
/사용자/1,: 메서드=> 삭제
이것 또한
/사용자/프로젝트
/사용자/프로젝트/신규
/사용자/프로젝트/3/편집
/users/1/projects/3,:method=>“delete”
하면, 만약, 만약...
/프로젝트/작업/신규
나는 권한을 부여받지 않은 이상을 던졌다.
저도 제 노선에서 이렇게 해볼게요.
  map.resources :users do |user|
      user.resources :projects do |project|
          project.resources :tasks
      end
  end
이것은 나에게 이런 노선을 주었다
/사용자/프로젝트/작업
/사용자/1/projects/3/tasks/:id
/사용자/프로젝트/작업/신규
/사용자/1/projects/3/tasks/:id/edit
제 미션 컨트롤러에 이걸 사용해요.
클래스TasksController리소스 로드 및 승인: 사용자
리소스 로드 및 권한 부여:프로젝트,:통과=>: 사용자
리소스 로드 및 승인:작업,:통과=>:프로젝트
끝맺다
하지만 나도 위와 같은 노선을 사용할 수 있는 권한이 부여되지 않았다.내가 뭘 잘못했는지, 아니면 CanCan이 이런 깊이 끼워 넣은 자원 권한을 제공하지 않았는지?

토론 #1

액세스new 작업 시에만 또는 다른 Tasks Controller 작업 시에만 무단 예외가 발생합니까?첫 번째 경우, before 필터는 new 동작으로 이 동작을 수행합니다.
@ 항목 = 항목.찾기(매개변수 [:project id])
권한 부여!:보기: @project
@task=@project.임무.짓다
권한 부여!:새 작업 @task
임무는 프로젝트를 통해 구축된 것이기 때문에 user_id의 요구를 충족시키고 성공을 거두어야 한다.너의 두 번째 예에서, 그것은 바로 이렇게 한 것이다.
@ 사용자 = 사용자.찾기(매개변수 [:user id])
권한 부여!:읽기, @user
@project=@user.프로젝트찾기(매개변수 [:project id])
권한 부여!:보기: @project
@task=@project.임무.짓다
권한 부여!:새 작업 @task
이론적으로 말하자면, 이것도 마땅히 통할 수 있어야 한다.첫 번째 장면으로 돌아가서 컨트롤러를 이걸로 바꿔 보세요.
클래스TasksController리소스 로드 및 승인:프로젝트
filter: 작업을 로드하기 전에:only=>:new
리소스 로드 및 승인:작업,:통과=>:프로젝트
프라이빗
def load 퀘스트
@task=@project.임무.구축(: 프로젝트=>@프로젝트)
끝맺다
끝맺다new 작업이 이 상황에서 유효한지 확인합니다.

토론 #2

또한 콘솔 또는 테스트 키트에서 직접 Ability 실험을 수행하여 올바른 동작을 확인하고자 할 수도 있습니다.
# 콘솔에서
사용자 = 사용자찾기(1)
항목 = 사용자입니다.프로젝트찾기(3)
작업 = 프로젝트임무.짓다
능력신규(사용자)
능력할 수 있다읽기, 사용자
능력할 수 있다읽기, 항목
능력할 수 있다새로운 임무
컨트롤러는 기본적으로 이렇게 한다.

토론 #셋

라이언, 난 기분이 안 좋아. 나 자신을 때리고 싶어.이 플러그인은 너무 좋아요. 효과가 아주 좋아요.이 서류들도 매우 좋은 문서 기록이 있어 매우 뚜렷하다.깊이 있는 삽입 자원에 대한 내용을 추가하지 않았지만, 나는 여전히 이 점을 해냈다.
나의 코드는 딱 맞지만 효과가 없다.원흉은 사용자 모델과 연결된 프로젝트 모델의 외부 키가 문자열로 설정된 것이다.나는 네가 답장을 한 후에 컨트롤러 테스트를 할 때 비로소 이 점을 발견했다.
나 지금 나 때문에 부끄러워...어쨌든 관심 가져주셔서 감사합니다!

토론 #4

걱정하지 마세요. 문제를 발견하게 되어 기쁩니다.

좋은 웹페이지 즐겨찾기