2012-07-17 99 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