2012-07-17 12 views
5

Ho letto la sezione wiki rails_admin sulla personalizzazione delle azioni, ma sono totalmente nuovo su rails_admin e questa documentazione è un po 'confusa per me.personalizza rails_admin elimina l'azione per un modello specifico

Quello che devo raggiungere è che, quando un utente amministratore fa clic sulle opzioni per eliminare un Dipendente specifico (il dipendente è un modello nella mia app), il codice per eliminare effettivamente il dipendente specificato non può essere il modo predefinito in cui rails_admin cancella, ma un determinato blocco di codice che devo fornire a rails_admin in qualche modo.

Nota che desidero che il resto dei modelli di dati sia accessibile tramite rails_admin per essere eliminato nel solito modo. Solo il modello dei dipendenti deve avere la routine di eliminazione personalizzata.

risposta

6

Ho appena riscontrato lo stesso problema perché ho bisogno che gli utenti siano contrassegnati per la cancellazione e non cancellati immediatamente.

Dopo aver hackerato un po 'ho finalmente trovato un modo: ignorare l'azione di eliminazione predefinita di RailsAdmin.

Ecco l'azione di eliminazione dopo aver aggiunto il mio codice personalizzato (non eliminando ma contrassegnando per l'eliminazione con un avviso personalizzato, nascondendo il pulsante Elimina se l'utente è già contrassegnato per l'eliminazione). :

# config/initializers/rails_admin_delete_override.rb 
module RailsAdmin 
    module Config 
    module Actions 
     class Delete < RailsAdmin::Config::Actions::Base 

     RailsAdmin::Config::Actions.register(self) 

     register_instance_option :member do 
      true 
     end 

     register_instance_option :route_fragment do 
      'delete' 
     end 

     register_instance_option :http_methods do 
      [:get, :delete] 
     end 

     register_instance_option :authorization_key do 
      :destroy 
     end 

     register_instance_option :visible? do 
      bindings[:object].class.base_class.name != 'User' || !bindings[:object].to_destroy? 
     end 

     register_instance_option :controller do 
      Proc.new do 
      if request.get? # DELETE 

       respond_to do |format| 
       format.html { render @action.template_name } 
       format.js { render @action.template_name, :layout => false } 
       end 

      elsif request.delete? # DESTROY 

       redirect_path = nil 
       @auditing_adapter && @auditing_adapter.delete_object(@object, @abstract_model, _current_user) 
       if @object.class.base_class.name == 'User' 
       @object.to_destroy! 
       flash[:success] = t("admin.flash.user_destroy_successful", :name => @model_config.label) 
       redirect_path = index_path 
       else 
       if @object.destroy 
        flash[:success] = t("admin.flash.successful", :name => @model_config.label, :action => t("admin.actions.delete.done")) 
        redirect_path = index_path 
       else 
        flash[:error] = t("admin.flash.error", :name => @model_config.label, :action => t("admin.actions.delete.done")) 
        redirect_path = back_or_index 
       end 
       end 

       redirect_to redirect_path 

      end 
      end 
     end 

     register_instance_option :link_icon do 
      'icon-remove' 
     end 
     end 
    end 
    end 
end 

È possibile trovare il codice di azione originale qui: https://github.com/sferik/rails_admin/blob/master/lib/rails_admin/config/actions/delete.rb

+1

ho bisogno di fare qualcosa di simile e speravo di trovare una soluzione più semplice (ala Typus dove è possibile estendere i singoli regolatori e sovrascrivere le azioni individuali (o aggiungere il proprio)), ma questo farà. Grazie per aver condiviso la tua soluzione! –

0

Dopo ore di hacking, ho trovato un modo più semplice di personalizzare un'azione. Tutto ciò che serve è creare un nome di modulo diverso (nel mio caso è 'MyRailsAdmin'), quindi estende la classe di azione originale, ad es. 'Elimina'

# config/initializers/rails_admin_delete.rb 

require 'rails_admin/config/actions' 
require 'rails_admin/config/actions/base' 

module MyRailsAdmin 
    module Config 
     module Actions 
      class Delete < RailsAdmin::Config::Actions::Delete 
      RailsAdmin::Config::Actions::register(self) 

      register_instance_option :controller do 
       proc do 
        if request.get? # DELETE 

         respond_to do |format| 
          format.html { render @action.template_name } 
          format.js { render @action.template_name, layout: false } 
         end 

        elsif request.delete? # DESTROY 

         redirect_path = nil 
         @auditing_adapter && @auditing_adapter.delete_object(@object, @abstract_model, _current_user) 

         # [CUSTOM DELETE] mark as deleted (status = 0) rather than actually hard delete it 
         @object.status = 0 

         if @object.save 
          flash[:success] = t('admin.flash.successful', name: @model_config.label, action: t('admin.actions.delete.done')) 
          redirect_path = index_path 
         else 
          flash[:error] = t('admin.flash.error', name: @model_config.label, action: t('admin.actions.delete.done')) 
          redirect_path = back_or_index 
         end 

         redirect_to redirect_path 

        end 
       end 
      end 

     end 
    end 
end 
end