CanCan ограничивает найденные данные - PullRequest
1 голос
/ 11 июня 2011

Я использую Cancan, Devise, Rails 3 для своего приложения для заказа.

Каждый пользователь имеет много компаний по соглашениям.У каждой компании также есть много пользователей по соглашениям.

В моей модели способностей у меня есть следующее:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user   
    if user.role? :super
      can :manage, :all
    elsif user.role? :admin
      can :manage, [User, Company, Order]
    elsif user.role? :tech
      can :manage, [User, Company, Tech]  
    elsif user.role? :customer_admin
      can [:read, :update], User, :id => user.id
      can [:read, :update], Company, :id => user.id  
      can [:read ], Order, :id => user.id            
    end
  end
end

Когда пользователь customer_admin входит в систему, я пытался показать им толькокомпании, с которыми они связаны.С точки зрения компании, я вижу список пользователей просто отлично.

В контроллере моих компаний (индекс) я пытался сделать это:

 @usercompanies = Company.where(['user_id = ?', current_user.id ])

Однако в этом списке перечисленынеправильная компания?!

Уверен, что это глупая ошибка новичка, но я был бы признателен за вашу помощь.Если вам нужно что-нибудь еще, дайте мне знать.

1 Ответ

1 голос
/ 11 июня 2011

Вы можете добавить ограничения с помощью cancan очень быстро, и это было озадачивающе, когда мне впервые пришлось его настроить. Документация для настройки этого здесь . И просто в качестве ссылки вы хотите, чтобы действие вашего индекса в вашем контроллере выглядело примерно так:

@usercompanies = Company.accessible_by(current_ability)

Однако в последней версии гема это должно быть сделано автоматически для действия index. Я думаю, что у вас есть ошибка в вашем abilities.rb, потому что, когда у вас есть запись, и вы связываете ее с пользователем, обычно есть столбец с именем user_id. Вы хотели бы использовать это так:

can [:read ], Order, :user_id => user.id

Поскольку атрибут id обычно используется в качестве уникального идентификатора записи, а не идентификатора ассоциации .

...