로드 및 권한 부여 리소스는 shoulda의 assign to matcher와 호환되지 않습니다.

4780 단어 cancan

묘사

load 와 authorize resource는 실제 대상이나 집합이 아닌 arel 대상을 사용하여 컨트롤러의 실례 변수를 설정하는 것 같습니다.객체 유형 및/또는 값을 테스트하는 경우 shoulda의 assign to matcher가 실패합니다.
나는 어떤 상황에서 빈랑을 사용하는 것이 얼마나 유용한지 안다. 그러나...
사상

토론 #1

상황이 이러면 안 된다.CanCan은 Arel을 직접 사용하지 않습니다.index행동을 말씀하시는 건가요?거기서 실례 변수를 ActiveRecord::Relation의 실례에 분배하는데 이 실례는 기본적으로 하나의 작용역이다.이렇게 하면 너는 더 많은 전화를 할 수 있다.예를 들면 다음과 같습니다.
load_and_authorize_resource
def index
  @products = @products.paginate(:page => 5)
end

Is that what you are referring to?

토론 #2

Yes, show action as well. Consider a controller with only an index and show action. If you were using InheritedResources without CanCan your controller could be:

class ThingsController < InheritedResources::Base
end
색인 작업 중 @things는 집합 내용을 포함합니다.전부show action에서 @thing이thing으로 설정됩니다.여기서(:id=>id).첫째arel 객체는 포함되지 않습니다.현재, 같은 컨트롤러를 사용하고load 와authorize 자원을 추가하면,arel 대상을 포함합니다.Inherited Resources를 사용하지 않았다면, 같은 논리도 적용됩니다. 처음에는 그곳에 코드만 있었을 뿐입니다.
최초의 게시물에서 말했듯이, 어떤 경우에는load 와 authorize resource가arel 대상의 값을 되돌려주는 것을 볼 수 있습니다.그러나 기본적으로 이것은 컨트롤러가 일반적으로 하는 것과 일치하지 않는 것 같다.
아마도 matcher의 assign arel 대상을 검사하고 강제로 불러와야 할 것 같습니까?

토론 #셋

"arel 대상 포함"은 무슨 뜻입니까?너는 구체적으로 무슨 수업을 보고 있니?
칸칸은 아레르와 직접 아무 일도 하지 않았다.연기 동작에서, 그것은 바로 이렇게 하는 것이다.
@thing = Thing.find(params[:id])

The index action does something like this.

@things = Thing.where(...).joins(...)

Depending on what the Ability conditions are. Both of these are pretty standard things when interacting with Active Record.

토론 #4

Yes, I understand all of that. By "contain the arel object" I mean the ActiveRecord::Relation object that you get before something causes the actual database load.

p = Thing.order(:name)
p.class -> ActiveRecord::Relation
p = p.all
p.class -> Array
나는 내가 최초의 게시물에서 문제의 본질을 단도직입적으로 이야기했지만 전체 문제를 잘 설명하지 못했다는 것을 깨달았다.한 발 물러서서 더 큰 상황을 설명해 보겠습니다.
작업 애플리케이션이 있는데 CanCan을 추가하고 싶습니다.Inherited Resources를 사용하기 때문에 리소스를 로드합니다.컨트롤러에 load 와 authorize 자원을 추가하면 기능 테스트가 중단됩니다. 컨트롤러에 설정된 실례 변수는 보통 Inherited Resources가 설정한 실제 집합이나 자원이 아닌Active Record::Relation 대상을 포함하고 있기 때문입니다.
CanCan의 Inherited Resources 지원과 관련이 없음을 지적하고 싶습니다.디렉터에 다음 부품이 있는 경우에도 같은 문제가 발생합니다.
def index
  @things = Thing.all
end

def show
   @thing = Thing.where(:id => params[:id]).first
end
그런 다음 이 옵션을 삭제하여 CanCan이 load 및 authorize resource를 통해 리소스를 로드할 수 있도록 합니다.
현재 나는 여전히 테스트에 실패했을 뿐, 작업 프로그램이 하나 있다.문제는 CanCan의 load 자원이 Inherited Resources와 위의 코드와 다른 행동을 하고 있다는 점이다. (틀림없지만 다르다.)기능 테스트에 설정된 인스턴스 변수의 값을 테스트하려면 Active Record::Relation 객체를 어떤 방식으로 강제로 계산해야 합니다.이것은 CanCan의 load 자원을 수정하거나 내 모든 컨트롤러를 수정하는 것을 의미합니다.
Inherited Resources와CanCan의load resource 행동을 일치시킬 수 있는 다른 방법을 보았습니까?

토론 #5

색인 작업은 이 효과를 볼 수 있는 유일한 작업입니다.다른 모든 작업에서는 인스턴스 변수를 클래스의 단일 인스턴스로 설정합니다(Thing.find(params[:id]).

Do you see some other way of making InheritedResources and CanCan's load_resource behavior consistent?


나는 행동에서만 색인을 사용할 수 있다고 생각한다.나는 이렇게 하고 싶지 않다. 왜냐하면 그것은 앞으로 Before 필터에서 할 수 있는 일을 제한하기 때문이다.나는 all 대상이 더 좋은 해결 방안이라고 생각한다. 왜냐하면 그것은 유연성의 극치이기 때문이다.보기에서 이 실례 변수를 사용하지 않으면 데이터베이스에 대한 호출을 포기하지 않습니다.이 검색어에 페이지를 추가하는 것도 매우 쉽다.
너는 시험에 불합격한 것을 붙일 수 있니?나는 가장 좋은 해결 방법은 복구 테스트라고 생각한다.사용ActiveRecord::RelationFoo.order() 사이에 어떤 차이가 있는지 알 수 없다. 왜냐하면 이 두 가지는 색인 작업에서 매우 흔하기 때문이다.Foo.all 이 공연은 사실상 같은 문제를 보여 주었다.
나는 모든 상황에서 하중을 가하는 것이 결코 가장 좋은 해결 방안이 아니라는 것에 동의한다.나의 유일한 생각은 자원을 불러오는 옵션을 전달하는 것이다. (또는 자원을 불러오게 하는 것이다.)이것은 부하를 강요할 것이다.복구 테스트에도 비슷한 복잡성이 있다.
나는 크리스마스 후에 테스트 앱을 준비할 것이다.휴가 잘 보내세요!

토론 #6

show action에 같은 문제가 있다고 했을 때

토론 #7

대상을 ActiveRecord::Relation 실례 변수로 설정하고 있다고요?이것은 매우 이상하다. 왜냐하면 그것은 반드시 이렇게 해야 하기 때문이다.
물건찾기(매개변수[:id])@thing 네.나는 오늘 오후에 빠른 테스트 프로그램을 조립할 수 있는지 없는지를 볼 것이다.

토론 #8

네, 여기는 빠르고 더러운 테스트 용례입니다.git://github.com/nestegg/can_can_issue_218.git
show 작업은 이 테스트에서 실패하지 않았지만, 변환된 프로그램에서 실패했습니다.나는 돌아가서 차이를 찾을 수 있는지 없는지를 볼 것이다.

토론 #9

이 예시 프로그램을 작성해 주셔서 감사합니다. 도움이 될 것입니다.
이 문제를 해결하려면

토론 #10

섹션을 제거하십시오.나는 이 검사가 필요하다고 생각하지 않는다. 왜냐하면 .with_kind_of(Array) 검사가 통과되었기 때문이다.
이 테스트들은 무엇으로 만들어진 것입니까?나는 .with { @a }가 너무 융통성이 없어서 색인 작업에서 흔히 볼 수 있는 역할 영역에 공간을 남기지 못했다고 생각한다.

좋은 웹페이지 즐겨찾기