2012-07-17 22 views
5

Tôi đã đọc phần wiki rails_admin về tùy chỉnh các hành động nhưng tôi hoàn toàn mới đối với rails_admin và tài liệu này hơi khó hiểu đối với tôi.tùy chỉnh rails_admin xóa hành động cho một mô hình cụ thể

Điều tôi cần đạt được là khi người dùng quản trị nhấp vào tùy chọn xóa một nhân viên cụ thể (Nhân viên là một mô hình trong ứng dụng của tôi), mã thực sự xóa nhân viên đã cho không thể là cách mặc định trong đó rails_admin xóa, nhưng một khối mã mà tôi cần phải cung cấp cho rails_admin bằng cách nào đó.

Lưu ý rằng tôi vẫn muốn phần còn lại của các mô hình dữ liệu có thể truy cập được thông qua rails_admin sẽ bị xóa theo cách thông thường. Chỉ mô hình nhân viên cần có thói quen xóa tùy chỉnh.

Trả lời

6

Tôi vừa gặp phải vấn đề tương tự vì tôi cần người dùng được đánh dấu để xóa và không bị xóa ngay lập tức.

Sau khi hack xung quanh một chút, cuối cùng tôi đã tìm thấy một cách: ghi đè hành động xóa mặc định của RailsAdmin.

Đây là hành động xóa sau khi tôi thêm mã tùy chỉnh của riêng mình (không xóa nhưng đánh dấu để xóa bằng thông báo tùy chỉnh, ẩn nút xóa nếu người dùng đã được đánh dấu để xóa). :

# 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 

Bạn có thể tìm thấy mã hành động ban đầu ở đây: https://github.com/sferik/rails_admin/blob/master/lib/rails_admin/config/actions/delete.rb

+1

Tôi cần phải làm điều gì đó tương tự và hy vọng tìm được giải pháp đơn giản hơn (ala Typus, nơi bạn có thể mở rộng bộ điều khiển riêng lẻ và ghi đè hành động riêng lẻ). Cảm ơn bạn đã chia sẻ giải pháp của mình! –

0

Sau giờ hack, tôi đã tìm ra một cách đơn giản hơn tùy biến một hành động. Tất cả những gì bạn cần là tạo một tên mô-đun khác (Trong trường hợp của tôi là 'MyRailsAdmin'), sau đó mở rộng lớp hành động gốc, ví dụ: 'Xóa'

# 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 
Các vấn đề liên quan