종속 관계가 있는 액세스 가능한 객체를 사용하는 동안 문제가 발생했습니다.
5592 단어 cancan
묘사
여보세요,accessible_by
에 대한 호출 반환empty
에 대한 질문이 발생했습니다. 검사 권한을 사용하면 이 대상에 접근할 수 있습니다.상세한 상황은 여기에 있다환경:
Gemfile
ruby '1.9.3'
gem 'rails', '3.2.13'
gem 'devise', '~> 2.2.4'
gem 'cancan', '~> 1.6.10'
구독 분배 모델class SubscriptionAssignment < ActiveRecord::Base
attr_accessible :active, :child_id, :subscription_id
belongs_to :child, :class_name => "User"
belongs_to :subscription
has_one :section, :through => :subscription
end
모델에 가입class Subscription < ActiveRecord::Base
attr_accessible :quota, :section_id, :user_id
belongs_to :user
belongs_to :section
has_many :subscription_assignments
end
재능.class Ability
include CanCan::Ability
def initialize(user)
if user
if user.role == 'admin'
return admin_permission
elsif user.role == 'parent'
return parent_permission(user)
elsif user.role == 'child'
return child_permission(user)
end
end
# all other casese
return guest_permission
end
...
def parent_permission(user)
can [:index, :show, :update, :destroy], Subscription, :user_id => user.id
can [:create], Subscription
can [:destroy, :show, :update], SubscriptionAssignment, subscription: {:user_id => user.id}
can [:create], SubscriptionAssignment
end
end
디버그:Subscription.all
=> [#<Subscription id: 1, user_id: 1, section_id: 110, quota: 1, created_at: "2013-07-22 02:19:58", updated_at: "2013-07-22 02:19:58">,
#<Subscription id: 2, user_id: 4, section_id: 110, quota: 1, created_at: "2013-07-22 02:21:09", updated_at: "2013-07-22 02:21:48">]
----------------------------------------------------------------------------
SubscriptionAssignment.all
=> [#<SubscriptionAssignment id: 1, child_id: 2, subscription_id: 1, active: true, created_at: "2013-07-22 02:19:58", updated_at: "2013-07-22 02:19:58">,
#<SubscriptionAssignment id: 2, child_id: 5, subscription_id: 2, active: true, created_at: "2013-07-22 02:21:48", updated_at: "2013-07-22 02:21:48">]
----------------------------------------------------------------------------
current_ability
=> #<Ability:0x00000006597d50
@aliased_actions={:read=>[:index, :show], :create=>[:new], :update=>[:edit]},
@rules=
[#<CanCan::Rule:0x000000065979e0
@actions=[:index, :show, :update, :destroy],
@base_behavior=true,
@block=nil,
@conditions={:user_id=>1},
@expanded_actions=[:index, :show, :update, :edit, :destroy],
@match_all=false,
@subjects=
[Subscription(id: integer, user_id: integer, section_id: integer, quota: integer, created_at: datetime, updated_at: datetime)]>,
#<CanCan::Rule:0x00000006597698
@actions=[:create],
@base_behavior=true,
@block=nil,
@conditions={},
@expanded_actions=[:create, :new],
@match_all=false,
@subjects=
[Subscription(id: integer, user_id: integer, section_id: integer, quota: integer, created_at: datetime, updated_at: datetime)]>,
#<CanCan::Rule:0x000000065971c0
@actions=[:destroy, :show, :update],
@base_behavior=true,
@block=nil,
@conditions={:subscription=>{:user_id=>1}},
@expanded_actions=[:destroy, :show, :update, :edit],
@match_all=false,
@subjects=
[SubscriptionAssignment(id: integer, child_id: integer, subscription_id: integer, active: boolean, created_at: datetime, updated_at: datetime)]>]>
----------------------------------------------------------------------------
current_ability.can? :update, SubscriptionAssignment.find(1) => true
current_ability.can? :update, SubscriptionAssignment.find(2) => false
SubscriptionAssignment.accessible_by(current_ability) => []
SubscriptionAssignment.accessible_by(current_ability).to_sql => "SELECT \"subscription_assignments\".* FROM \"subscription_assignments\" WHERE ('t'='f')"
SQL 쿼리에 내부 접속이 없는 이유는 확실하지 않습니다.네가 나에게 아이디어를 줄 수 있다면 다행이다: current_ability.can?
재미있는 문제 고마워!결과토론 #1
는 두 번째 선택할 수 있는 매개 변수인 액션을 얻었고 기본값accessible_by
을 얻었다.참조model_additions.rb.def accessible_by(ability, action = :index)
ability.model_adapter(self, action).database_records
end
당신의 :index
forcurrent_ability
는 허용하지만 허용하지 않습니다SubscriptionAssignment
.당신의 :show
규칙이 모두 일치하지 않기 때문에 이것이 SQL 포함contradiction:index
의 원인이라고 가정합니다.미래의 문제에 대해github문제는 버그나 제안에 대한 기능임을 기억하세요.용법에 관한 문제는 stackoverflow.com/tags/cancan에 더욱 적합하다.고마워, 가리드!
그럼 그렇게 물어볼게요.
can
응, 네가 원한다면 그렇게 할 수 있어.하지만 나는 이미 대답했지, 그렇지 않니?WHERE ('t'='f')
네, 저는 그것을 자기 대답의 문제로 삼고 싶습니다. 단지 정보를 공유하기 위해서입니다.마지막에 이런 걸로 고쳤어요.
can [:read, :update, :destroy], SubscriptionAssignment, subscription: {:user_id => user.id}
토론 #2
쿨.도움이 될 수 있어서 기쁩니다.이 문제를 닫으십시오.Reference
이 문제에 관하여(종속 관계가 있는 액세스 가능한 객체를 사용하는 동안 문제가 발생했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://github.com/ryanb/cancan/issues/905텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)