Active_model_serializers ile izinleri nasıl serileştiririm? Modellerde ve serileştiricilerde current_user
veya can?
yöntemine erişimim yok.Active_model_serializers ile seri hale getirme izinleri (ör. CanCan)
cevap
Birincisi, yeni kapsam özelliği kullanmak, sıralandırıcı bağlamında current_user
erişmek için:
model.active_model_serializer.new(model, scope: serialization_scope)
: kapsamını geçmek
el serializers başlatmasını olan durumda
class ApplicationController < ActionController::Base
...
serialization_scope :current_user
end
, emin olmak
Ardından, serializer içinde, izinleri belirlemek için scope
(geçerli kullanıcı) kullanarak kendi yetkilendirme sözde özniteliklerinizi eklemek için özel yöntemler ekleyin.
attributes :can_update, :can_delete
def can_update
# `scope` is current_user
Ability.new(scope).can?(:update, object)
end
def can_delete
Ability.new(scope).can?(:delete, object)
end
Biz bu işlevselliği sağlayan bir mücevher yarattı: Eğer Cancan kullanıyorsanız
, sen can?
yöntemini erişmek için yeteneği sınıf örneğini olabilir https://github.com/GroupTalent/active_model_serializers-cancan
Ben bir şey geçebilir düşünüyorum serialization_scope
'u istiyorum, böylece Yeteneği geçiyorum.
class ApplicationController < ActionController::Base
...
serialization_scope :current_ability
def current_ability
@current_ability ||= Ability.new(current_user)
end
end
class CommentSerializer < ActiveModel::Serializer
attributes :id, :content, :created_at, :can_update
def can_update
scope.can?(:update, object)
end
end
Yeteneklerim aslında iki değişkene (yukarıdaki örnekte değil) dayalı olduğu için bunu yapamam.
Eğer hala current_user öğesine erişmeye ihtiyacınız varsa, Yeteneğe bir örnek değişkeni ayarlayabilirsiniz.
Anlamıyorum - kendi sorunuzu hemen cevapladınız mı? –
Evet, yaptım - [bu makale] konusuna bakın (http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/). Bu bilginin korunmasını istedim, ancak blogumda yayınlamak için çok önemsiz/uzman bulduğum için, burayı buraya yazdım, Soru & Cevap stili. –
@JoLiss "super.merge" stiline alternatif olarak, "can_update,: can_delete" öznitelikleri diyebilir ve sonra can_update ve can_delete'yi serializer'daki yöntemler olarak tanımlayabilirsiniz. Ya işe yarıyor. – tee