2012-07-17 2 views
5

작업을 사용자 정의하는 방법에 대한 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을 (또는 자신을 추가))하지만이 할 것입니다. 솔루션을 공유해 주셔서 감사합니다. –

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 
관련 문제