2012-08-01 10 views
6

Uruchomiłem aplikację Railsową z Devise i CanCan. Mam użytkowników, którzy mają relację jeden-do-wielu do artykułów. Jestem nowy na kankana, oto co zamierzam zrobić:CanCan - Jak zezwolić użytkownikom na aktualizowanie i usuwanie tylko własnych obiektów

Administrator

  • może wykonywać żadnych działań w artykułach

zalogowany użytkownik

  • może czytać i tworzyć artykuły
  • może edytować i zniszczyć jego własne teksty

Gość

  • można przeczytać artykuły

Ale mam problemy ze zrozumieniem składni kankana. Rozumiem, że byłoby coś takiego.

def initialize(user) 
    user ||= User.new 
    if user.admin? 
    can :manage, Article 
    else 
    can :read, Article 
    end 
end 

Ale to tylko dla administratora i użytkownika guest, nie jestem pewien, jak odróżnić Gość od zalogowanego użytkownika, ponieważ tworzy nowy obiekt użytkownika, gdy użytkownik jest pusty. Widziałem, że kod powinien być podobny do tego can [:edit, :destroy], Article, :user_id => user.id, ale nie jestem pewien, jak to by pasowało do metody initialize.

I ostatnie pytanie, jeśli zdefiniuję tylko can :read, Article dla gości, czy zablokuje inne działania, takie jak tworzenie i aktualizowanie, jak biała lista akcji odczytu?

Każda pomoc zostanie doceniona. Wielkie dzięki!

Odpowiedz

15

Oto co zrobiłem:

W ability.rb

def initialize(user) 
    if user.nil? 
    can :read, Article 
    elsif user.admin? 
    can :manage, Article 
    else 
    can [:read, :create], Article 
    can [:update, :destroy], Article, :user_id => user.id 
    end 
end 

I do wyświetlania linków, użyłem to:

- if can? :read, Article 
    = link_to 'Show', article 
- if can? :create, Article 
    = link_to 'New Article', new_article_path 
- if can? :update, article 
    = link_to 'Edit', edit_article_path(article) 
- if can? :destroy, article 
    = link_to 'Destroy', article, method: :delete, data: { confirm: 'Are you sure?' } 

I wydaje się, że obecnie pracuje , nie jestem pewien, czy to najlepszy sposób.

+0

Widok nie wygląda dobrze, ale nie jest powiązany z tematem pytania, który wydaje się dobrze pokryty z twoją zdolnością.rb. –

+0

Używam samouczących się pomocników, takich jak link_to_edit, link_to_destroy, itd. Moi pomocnicy zawierają wywołanie can(), więc nie ma potrzeby umieszczania logiki wewnątrz widoków. –

Powiązane problemy