종속 관계가 있는 액세스 가능한 객체를 사용하는 동안 문제가 발생했습니다.

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

쿨.도움이 될 수 있어서 기쁩니다.이 문제를 닫으십시오.

좋은 웹페이지 즐겨찾기