在我的应用中,某些资源无法销毁。所以我写了这样的模型:
before_destroy :destroy_check
def destroy_check
if some_reason?
errors.add(:base, 'cannot destroy this resource!')
end
errors.blank?
end
然后,当我在ActiveAdmin中单击destroy按钮时,没有任何显示:没有错误,没有消息,并且记录没有被真正销毁。如何在销毁失败时显示错误消息?
答案 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