당김 요청 #806 파괴력 조건 구축

8858 단어 cancan

묘사

나는 방금 마스터를 당겨서 #806을 얻었다. 마스터는 아직 긴장을 풀지 못했다. 그러나 지금 보니 이런 일을 할 때도 캔캔은 실패했다.
can  :read, Comment, :article => { :condition => true , :condition2 => true }
예를 들어, 하나의 연결이라도 두 조건을 지정합니다.위의 내용은 발표된 1.6.9 버전에 적용됩니다.만약 내가 조건 2를 삭제한다면, 그것은 일할 것이다.원본 문제 설명의 조인과 같이 두 레벨 조인도 마찬가지입니다.
can  :read, Comment, :article => { :category => { :condition => true, :condition2 => true } }
아니면 이건 그냥 나야?Rails 3.2.12 + Ruby 1.9.3p327

토론 #1

"cancan 실패"라고 말했을 때 테스트가 실패했다는 뜻입니까?#806에서 묘사한 문제가 여전히 존재한다고요?만약 테스트가 모두 통과되었다면, 당신은 오류를 묘사할 수 있습니까? 아니면 실패한 테스트를 더 잘 쓸 수 있습니까?감사합니다!

토론 #2

관심 가져주셔서 감사합니다.
내 말은, 이것은 칸칸 내부의 잘못이다.
다음과 같은 모드를 사용합니다.
사용자는 경고가 많습니다. 경고는 InstallationSite, InstallationSite는CityArea에 속합니다.
다음과 같은 기능 정의를 제공합니다.
    can :read, Alert , :installation_site => {
      :city_area => {
        :country => target.country, :region_name => target.region
      }
    }
나는 다음과 같은 것을 얻었다.
1.9.3p327 :001 > a= User.find(2)
  User Load (0.4ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1
 => #<User id: 2, name: "Kosta .... <output snipped>
1.9.3p327 :002 > b= Ability.new(a)
  ApplianceType Load (0.4ms)  SELECT `appliance_types`.* FROM `appliance_types` ORDER BY display_order
  ApplianceType Load (0.3ms)  SELECT `appliance_types`.* FROM `appliance_types` ORDER BY display_order
  Permission Load (0.2ms)  SELECT `permissions`.* FROM `permissions` WHERE `permissions`.`user_id` = 2
  Role Load (0.2ms)  SELECT `roles`.* FROM `roles` WHERE `roles`.`id` = 3 LIMIT 1
 => #<Ability:0x00000003d4f348 @rules=[#<CanCan::Rule:0x00000004abaff0   ... <output snipped>
1.9.3p327 :003 > Alert.accessible_by(b)
NoMethodError: undefined method `table_name' for nil:NilClass
    from /home/kostas/.rvm/gems/ruby-1.9.3-p327@energy_analytics/bundler/gems/cancan-ff2b632f1524/lib/cancan/model_adapters/active_record_adapter.rb:76:in `block (2 levels) in tableized_conditions'
    from /home/kostas/.rvm/gems/ruby-1.9.3-p327@energy_analytics/bundler/gems/cancan-ff2b632f1524/lib/cancan/model_adapters/active_record_adapter.rb:71:in `each'
    from /home/kostas/.rvm/gems/ruby-1.9.3-p327@energy_analytics/bundler/gems/cancan-ff2b632f1524/lib/cancan/model_adapters/active_record_adapter.rb:71:in `inject'
    from /home/kostas/.rvm/gems/ruby-1.9.3-p327@energy_analytics/bundler/gems/cancan-ff2b632f1524/lib/cancan/model_adapters/active_record_adapter.rb:71:in `block in tableized_conditions'
    from /home/kostas/.rvm/gems/ruby-1.9.3-p327@energy_analytics/bundler/gems/cancan-ff2b632f1524/lib/cancan/model_adapters/active_record_adapter.rb:67:in `each'
    from /home/kostas/.rvm/gems/ruby-1.9.3-p327@energy_analytics/bundler/gems/cancan-ff2b632f1524/lib/cancan/model_adapters/active_record_adapter.rb:67:in `inject'
    from /home/kostas/.rvm/gems/ruby-1.9.3-p327@energy_analytics/bundler/gems/cancan-ff2b632f1524/lib/cancan/model_adapters/active_record_adapter.rb:67:in `tableized_conditions'
    from /home/kostas/.rvm/gems/ruby-1.9.3-p327@energy_analytics/bundler/gems/cancan-ff2b632f1524/lib/cancan/model_adapters/active_record_adapter.rb:81:in `block in tableized_conditions'
    from /home/kostas/.rvm/gems/ruby-1.9.3-p327@energy_analytics/bundler/gems/cancan-ff2b632f1524/lib/cancan/model_adapters/active_record_adapter.rb:67:in `each'
    from /home/kostas/.rvm/gems/ruby-1.9.3-p327@energy_analytics/bundler/gems/cancan-ff2b632f1524/lib/cancan/model_adapters/active_record_adapter.rb:67:in `inject'
    from /home/kostas/.rvm/gems/ruby-1.9.3-p327@energy_analytics/bundler/gems/cancan-ff2b632f1524/lib/cancan/model_adapters/active_record_adapter.rb:67:in `tableized_conditions'
    from /home/kostas/.rvm/gems/ruby-1.9.3-p327@energy_analytics/bundler/gems/cancan-ff2b632f1524/lib/cancan/model_adapters/active_record_adapter.rb:60:in `block in conditions'
    from /home/kostas/.rvm/gems/ruby-1.9.3-p327@energy_analytics/bundler/gems/cancan-ff2b632f1524/lib/cancan/model_adapters/active_record_adapter.rb:59:in `each'
    from /home/kostas/.rvm/gems/ruby-1.9.3-p327@energy_analytics/bundler/gems/cancan-ff2b632f1524/lib/cancan/model_adapters/active_record_adapter.rb:59:in `inject'
    from /home/kostas/.rvm/gems/ruby-1.9.3-p327@energy_analytics/bundler/gems/cancan-ff2b632f1524/lib/cancan/model_adapters/active_record_adapter.rb:59:in `conditions'
    from /home/kostas/.rvm/gems/ruby-1.9.3-p327@energy_analytics/bundler/gems/cancan-ff2b632f1524/lib/cancan/model_adapters/active_record_adapter.rb:105:in `database_records'
    from /home/kostas/.rvm/gems/ruby-1.9.3-p327@energy_analytics/bundler/gems/cancan-ff2b632f1524/lib/cancan/model_additions.rb:23:in `accessible_by'
    from (irb):3
    from /home/kostas/.rvm/gems/ruby-1.9.3-p327@energy_analytics/gems/railties-3.2.12/lib/rails/commands/console.rb:47:in `start'
    from /home/kostas/.rvm/gems/ruby-1.9.3-p327@energy_analytics/gems/railties-3.2.12/lib/rails/commands/console.rb:8:in `start'
    from /home/kostas/.rvm/gems/ruby-1.9.3-p327@energy_analytics/gems/railties-3.2.12/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'
하나의 조건만 지정한 경우 다음을 수행합니다.
    can :read, Alert , :installation_site => {
      :city_area => {
        :country => target.country
      }
    }
그것은 예기한 대로 일한다.
단순히 프로세스에 연결되어 있는 경우에도 동일한 방법으로 오류가 발생합니다. 즉, 능력이 다음과 같이 나타날 수 있는 경우입니다.
    can :read, InstallationSite,
      :city_area => {
        :country => target.country, :region => target.region
      }
그것은 같은 점에서 오류를 없앨 것이다.
내가 이 편지를 제출했을 때, 스승님은 @ff2b632f1524에 계셨다.나는 또한 최근의 1.6.10 버전을 시험해 보았는데 결과는 같다.1.6.9 버전에서는 오류가 발생하지 않았고 두 개의 연결(위의 첫 번째 사례)을 실행할 때 오류가 발생한 SQL 문자열만 발생했습니다. #806은 이 문제를 해결하려고 시도하고 있습니다.
1.6.9 릴리즈 이후 유일하게 활성 # 레코딩 # 어댑터가 변경된 것이므로 #806 탓으로 돌려야 한다고 생각합니다.rb(제가 틀렸을 수도 있지만 제 GitHub 기술은 그렇게 좋지 않습니다. ()

토론 #셋

제가 실패한 테스트를 썼는데 당신이 묘사한 NoMethodError를 만들었습니다.
https://github.com/jaredbeck/cancan/commit/45bc237e1116e59deb33f334d69e47aaa5f60e5a
이것은 단지 출발점일 뿐이다.정확한 행동을 확인할 수 있도록 테스트를 개선해 주시겠어요?고맙습니다.

토론 #4

나는 너의 테스트가 매우 좋다고 생각한다.안전을 위해서 나는 단일 연결을 위해 하나를 추가했다.차이가 많지 않다
it "should support more than one nested conditions" do 
   @ability.can :read, Article, :category => { 
     :name => 'foo', :visible => true 
   } 
   expect { Article.accessible_by(@ability) }.to_not raise_error 
end

토론 #5

단언이 정확한 행위에 대해서는 @yuszuv에서 기존의 깊이 삽입 테스트를 복사하여 붙여넣습니다.
(경고, 테스트되지 않음...)
it "should return appropriate sql conditions in complex case with nested joins and more than one nested conditions" do 
  @ability.can :read, Comment, :article => { :category => { :visible => true , :name => 'foo'} } 
  @ability.model_adapter(Comment, :read).conditions.should == { Category.table_name.to_sym => { :visible => true , :name => 'foo' } } 
end 

it "should return appropriate sql conditions in complex case with nested joins of different depth  and more than one nested conditions" do 
  @ability.can :read, Comment, :article => { :published => true, :category => { :visible => true, :name => 'foo' } } 
  @ability.model_adapter(Comment, :read).conditions.should == { Article.table_name.to_sym => { :published => true }, Category.table_name.to_sym => { :visible => true, :name => 'foo' } } 
end 

토론 #6

pullrequest#871을 추가했습니다. 이 문제를 복구하고 @jaredbeck이 45bc237

토론 #7

에서의 테스트 조건을 통합했습니다. 헤헤, 좋은 포획입니다!!:)
나는 #871이 내가 보고한 문제를 해결했다고 확인했다.신청을 고려해 주세요.

토론 #8

도 이 문제에 부딪혔다.이 버전을 통합해서 새gem버전을 발표할 수 있습니까?

토론 #9

도 이 문제에 부딪혔다.매우 고통스럽다.

토론 #10

IMO는 당김 요청을 적용할 때까지 이 결함을 다시 열어야 합니다.공공 관계를 신청할 수 있는 공헌자가 있습니까?

토론 #11

나도 이 문제에 부딪힌 적이 있다.투고인에게 홍보를 신청해 주시겠습니까?

토론 #12

나는 대다수의 사람들이 이 프로젝트가 이미 실패했다고 생각한다.다행히도 이곳에는 지역 사회 지도자의 갈라진 부분이 있다.https://github.com/CanCanCommunity/cancancan
이것은 위의pull 요청과 더 많은 요청을 포함합니다. (강한 파라미터에 대한 지원 포함)나는 최근에 그것을 바꿨다. 그것은 틈이 없는 것이다.

좋은 웹페이지 즐겨찾기