当销毁失败时,我可以在活动管理员中有一条flash消息吗?

时间:2014-01-25 16:00:07

标签: ruby activeadmin

在我的应用中,某些资源无法销毁。所以我写了这样的模型:

before_destroy :destroy_check
def destroy_check
  if some_reason?
    errors.add(:base, 'cannot destroy this resource!')
  end
  errors.blank?
end

然后,当我在ActiveAdmin中单击destroy按钮时,没有任何显示:没有错误,没有消息,并且记录没有被真正销毁。如何在销毁失败时显示错误消息?

3 个答案:

答案 0 :(得分:8)

首先使用您的模型的before_destroy回调来检查记录是否可以销毁(如果学生已登录,则在此处):

class Student < ActiveRecord::Base
  before_destroy :before_destroy_check_for_groups

  def before_destroy_check_for_groups   
    if StudentInGroup.exists?(student_id: self.id)
      errors.add(:base, I18n.t('app.student_signed_in'))
      return false   
    end 
  end
end

这是常见且简单的,你可以为你想要的每个模型做到这一点。

这是一个技巧。 您可以为所有Active Admin资源应用常规修补程序,以将模型的错误消息作为ResourceController的回调传递给用户。这是下面的check_model_errors方法。并且在执行每个资源的ActiveAdmin.register方法调用期间,必须将此方法注册为回调(请参阅修补后的run_registration_block)。 您只需将以下代码粘贴到应用程序的config/initializers文件夹(或应用程序启动时初始化的任何其他文件夹)的新文件(任何名称)即可。我把它作为config/initializers/active_admin_patches.rb

class ActiveAdmin::ResourceController
  def check_model_errors(object)
      return unless object.errors.any?
      flash[:error] ||= []
      flash[:error].concat(object.errors.full_messages)
  end
end
class ActiveAdmin::ResourceDSL
  alias_method :old_run_registration_block, :run_registration_block
  def run_registration_block(&block)
    old_run_registration_block(&block)
    instance_exec { after_destroy :check_model_errors }
  end
end

答案 1 :(得分:6)

我发现这可以通过I18n翻译在ActiveAdmin中完成,并在控制器中自定义响应者'Interpolation Options

在初始值中将方法#interpolation_options添加到ActiveAdmin :: BaseController:

# config/initializers/active_admin.rb
class ActiveAdmin::BaseController
  private

  def interpolation_options
    options = {}

    options[:resource_errors] =
      if resource && resource.errors.any?
        "#{resource.errors.full_messages.to_sentence}."
      else
        ""
      end

    options
  end
end

然后覆盖语言环境文件中的销毁警报消息的翻译:

# config/locales/en.yml
en:
  flash:
    actions:
      destroy:
        alert: "%{resource_name} could not be destroyed. %{resource_errors}"

答案 2 :(得分:3)

如果您想成为尚未从活动管理员中删除的资源:

ActiveAdmin.register SomeModel do
  controller do        
    def destroy
      flash[:notice] = 'Cant delete this!'
      redirect_to :back
    end        
  end
end

或删除操作:

ActiveAdmin.register SomeModel do
  actions :all, except: [:destroy]
end