2012-07-17 104 views
5

我一直在阅读有关自定义操作的rails_admin wiki部分,但我对rails_admin完全陌生,此文档对我来说有点令人困惑。为特定模型定制rails_admin删除操作

我需要实现的是,当管理员用户单击选项以删除特定的员工(员工是我的应用中的模型)时,实际删除给定员工的代码不能成为rails_admin的默认方式删除,但我需要以某种方式提供给rails_admin的给定块代码。

请注意,我仍然希望通过rails_admin访问的其余数据模型以通常方式删除。只有员工模型需要具有自定义删除例程。

回答

6

我刚刚遇到同样的问题,因为我需要将用户标记为删除,而不是立即删除。

经过黑客入侵后,我终于找到了一种方法:重写RailsAdmin的默认删除操作。

添加我自己的自定义代码(不删除,但标记为删除自定义通知,隐藏删除按钮,如果用户已被标记为删除)后的删除操作。 :

# 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 

您可以找到原来的动作代码在这里:https://github.com/sferik/rails_admin/blob/master/lib/rails_admin/config/actions/delete.rb

+1

我需要做同样的事情,并希望能找到一个简单的解决方案(ALA Typus在那里你可以扩展单个控制器,并覆盖个人行为(或添加你自己的)),但这会做。感谢您分享您的解决方案! – 2013-12-08 13:33:22

0

黑客攻击后几小时,我发现自定义动作的简单的方法。 所有你需要的是创建一个不同的模块名称(在我的情况是'MyRailsAdmin'),然后扩展原来的动作类,例如。 “删除”

# 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