2012-07-17 9 views
5

He estado leyendo la sección de wiki rails_admin sobre las acciones de personalización, pero soy totalmente nuevo en rails_admin y esta documentación es un poco confusa para mí.personalizar rails_admin eliminar acción para un modelo específico

Lo que necesito lograr es que cuando un usuario administrador hace clic en las opciones para eliminar un empleado específico (el empleado es un modelo en mi aplicación), el código para eliminar realmente el empleado dado no puede ser la forma predeterminada en que rails_admin elimina, pero un bloque de código dado que necesito proporcionar a rails_admin de alguna manera.

Tenga en cuenta que todavía quiero que el resto de los modelos de datos accesibles a través de rails_admin se eliminen de la manera habitual. Solo el modelo de empleado debe tener la rutina de eliminación personalizada.

Respuesta

6

Acabo de encontrar el mismo problema porque necesito que los usuarios se marquen para su eliminación y no se eliminen de inmediato.

Después de hackear un poco, finalmente encontré la manera de anular la acción de eliminación predeterminada de RailsAdmin.

Aquí está la acción de eliminar después de que agregué mi propio código personalizado (no eliminar pero marcar para eliminar con un aviso personalizado, ocultando el botón eliminar si el usuario ya está marcado para eliminación). :

# 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 

Puede encontrar el código de acción original aquí: https://github.com/sferik/rails_admin/blob/master/lib/rails_admin/config/actions/delete.rb

+1

tengo que hacer algo similar y tenía la esperanza de encontrar una solución más simple (ala Typus donde se puede extender controladores individuales y anular las acciones individuales (o añadir su propio)), pero esto va a hacer. ¡Gracias por compartir su solución! –

0

Después de horas de piratería informática, he encontrado una manera más sencilla de personalizar una acción. Todo lo que necesita es crear un nombre de módulo diferente (en mi caso es 'MyRailsAdmin'), luego amplía la clase de acción original, por ej. 'Borrar'

# 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 
Cuestiones relacionadas