2012-02-21 6 views
7

Yazılımın Blogger için yazdığını varsayalım.Nasıl yapılır: Ana nesneyle tanımlanan cancanda izin oluşturulsun mu?

Her kullanıcının blogun sahibi yalnızca, bir blog yazısı oluşturabilirsiniz. CanCan normalde olarak bu duruma bir yetenek onay tanımlarsınız:

user.can? :create, Post 

onlar şimdiki blogun sahibi olan ve sadece kendi sınıfadı kullanarak mevcut blog başvurmak için hiçbir yolu varsa kullanıcı sadece yazı oluşturabilir Ancak. Ne gerçekten yapmak gerekiyor ise: cancan'ait tanımlarında ben

can :create, Post do |post, blog| 
    user == blog.owner 
end 

olması mümkün mü yoksa nasıl bu yaklaşıyorum içinde karıştı diyebiliriz

user.can? :create, Post, @current_blog 

öyle ki?

cevap

8

@current_blog geçerli nesnenin ebeveyn dayalı bir yeteneği tanımla onlar bir sahibi.

  • karşılaştırır ebeveyn Blog rekor bulmak için Post.blog_id kullanır Blog.user_id alan alan current_user.id-
  • Ayrıca

CanCan bilmesi için, bir :through beyanı kullanırken yükleme ve Mesaj kaynak yetkilendirme emin olun kim ebeveyn kaydı.

PostsController: 

load_and_authorize_resource :through => :blog 

daha fazla ayrıntı için GitHub üzerinde CanCan wiki bakınız.

+1

The: sonunda =>: blog sonunda anlaşma oldu. Çok teşekkür ederim! – rfsbsb

0

Sen

user.can kullanabilir? :, Güncelleme

yerine

user.can

@current_blog:? Create_posts,

veya

user.can @current_blog? :,, Yayınla oluşturmak

@current_blog. Tabii ki, muhtemelen new ve load_and_authorize_resource dan create eylemi almak gerekir. Ve

def kendiniz test "yetkilendirme" Yeni
yetkisiz! yapamaz mı :

can :create, Post, :blog => { :user => user } 

Bu akım kullanıcı yalnızca bir blog için yeni Mesaj kaydı oluşturabilirsiniz sağlayacağız: create_posts,
sonuna

+0

Gerçek yetenek tanımını nasıl ele aldığınızı biliyor musunuz? normalde, form: post post | post_instance | ... formunu oluşturabilir, bu yüzden farklı değişkenlerin nasıl geçtiğinin bununla nasıl işleyeceği açık değil mi? –

+0

Örneğiniz için 'can (: create_posts, Blog) do | blog | user == blog.owner sonu '. Bu yüzden test, @Current_blog Post değil, PostsController.new'de yazılmıştır. – Foton

+0

CanCan'ın izin verilen nesnenin türüne göre izinleri endekslediğine inandığımdan emin değilim. Bu yüzden eğer blogda iletilmişse, blog izinlerine bakacaktır. Sonunda etrafında var olan yol yeni bir nesne kurmak: 'user.can? : create, @ current_blog.posts.new' - bir gönderi nesnesinde geçiş yapabilirim ve hala ebeveyni okuyabilirim –