2015-04-07 14 views
5

Şu ana kadar kusursuz bir şekilde çalışmış olan yetkilendirme için pundit 0.3.0 ile birlikte Active Admin 1.0.0.pre1 kullanarak bir Rails 4 uygulamasına sahibim, ancak formları otomatik olarak bir kullanıcıya göre kişiselleştirmenin iyi bir yolunu bulmakta zorlanıyorum rolü.Active Admin form girişlerini Pundit izin verilen özniteliklerle otomatik olarak nasıl kaldırabilirim?

Verilen bu modeller:

ActiveAdmin.register AdminUser do 
    permit_params do 
    Pundit.policy(current_admin_user, resource).permitted_attributes 
    end 

    form do |f| 
    f.inputs "Admin Details" do 
     f.input :role, as: :select, collection: [:manager, :admin] 
     f.input :email, as: :email 
     f.input :password 
     f.input :password_confirmation 
    end 
    f.actions 
    end 
end 

class AdminUserPolicy < ApplicationPolicy 
    def permitted_attributes 
    attributes = [:email, :password, :password_confirmation] 
    attributes += [:role] if user.has_role? :super_admin 
    attributes 
    end 
end 

Ben role girişi için istediğiniz otomatik formdan kaldırılacak.

Bir seçenek çizgisinde bir şey olurdu: Bu yaklaşım kontrol edilmelidir hangi nitelikleri hatırlamak geliştirici gerekir,

permitted_attributes = Pundit.policy(current_admin_user, resource).permitted_attributes 

    form do |f| 
    f.inputs "Admin Details" do 
     f.input :role if permitted_attributes.include? :role 
     f.input :email 
     f.input :password 
     f.input :password_confirmation 
    end 
    f.actions 
    end 

ama, unutkanlık eğilimli görünüyor ve tam olarak KURU değildir. Belki de bu konuda yanlış bir şekilde gidiyorum? Tüm öneriler kabul edilir.

+1

% 95 eminim, cevap burada 'main_content' yönteminde bir yerde saklanıyor: https://github.com/activeadmin/activeadmin/blob/master/lib/active_admin/views/pages/form.rb. Şu anda test etmek için AA ile açık bir projem yok, ancak bu sınıfı geçersiz kılabilirsiniz ve ':' rolünün girişini el ile dışarıda bırakmayı deneyebilirsiniz. –

cevap

1

Intercepting ActiveAdminForm iyi iş gibi görünüyor. doğru yolu beni başlayan Andrey Deineko için

# /lib/active_admin/permitted_active_admin_form.rb 
module PermittedActiveAdminForm 
    def permitted_attributes 
    policy = Pundit.policy(current_admin_user, resource) 
    policy.respond_to?(:permitted_attributes) ? policy.permitted_attributes : [] 
    end 

    def input(*args) 
    super(*args) if permitted_attributes.include? args[0] 
    end 
end 


# /config/initializers/active_admin.rb 
module ActiveAdmin 
    module Views 
    class ActiveAdminForm < FormtasticProxy 
     prepend PermittedActiveAdminForm 
    end 
    end 
end 

# /app/admin/admin_user.rb 
ActiveAdmin.register AdminUser do 
    permit_params do 
    resource ||= AdminUser 
    Pundit.policy(current_admin_user, resource).permitted_attributes 
    end 

    form do |f| 
    f.inputs "Admin Details" do 
     f.input :role, as: :select, collection: [:manager, :admin] 
     f.input :email, as: :email 
     f.input :password 
     f.input :password_confirmation 
    end 
    f.actions 
    end 
end 

teşekkür: İşte gitti uygulamasıdır.

0

Etkin olduğunu biliyorum pacit, active_admin. Bunu akılda tutarak, sağladığınız kodu kullanarak, orada bir fikir atacağım. Pundit politikasına karşı bir çek ile input geçersiz kılan bir modül ekleyerek bu

whitelist = Pundit.policy(current_admin_user, resource).permitted_attributes 
fields = %i(role email password password_confirmation) 

form do |f| 
    f.inputs "Admin Details" do 
    (fields & whitelist).each do |field| 
     f.input field 
    end 
    end 
    f.actions 
end 
+0

Öneri için teşekkürler! Buradaki problem, 'f.input' argümanlarının alana bağlı olarak değişmesidir, bu yüzden her birini açıkça doğru argalarla çağırmam gerekecek. Bunu daha iyi yansıtmak için örneğimi güncelledim. Aynı boşta, alanın seçenekleri temsil eden değeri temsil ettiği bir karma oluşturmayı düşündüm. Sonra doğru aramaları yapmak için karma bir yardımcı yöntem döngü olabilir, ama daha sıkı bir entegrasyon umuyordum. –

İlgili konular