在我的应用程序中,一些资源无法销毁.所以我写了这样的模型:
before_destroy :destroy_check
def destroy_check
if some_reason?
errors.add(:base, 'cannot destroy this resource!')
end
errors.blank?
end
Run Code Online (Sandbox Code Playgroud)
然后,当我单击ActiveAdmin中的destroy按钮时,没有任何显示:没有错误,没有消息,并且记录没有被真正销毁.如何在销毁失败时显示错误消息?
首先使用模型的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
Run Code Online (Sandbox Code Playgroud)
这是常见且简单的,您可以为您想要的每个型号执行此操作.
这是一个技巧.您可以为所有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
Run Code Online (Sandbox Code Playgroud)
我发现这可以通过I18n转换在ActiveAdmin中完成,并在控制器中自定义响应者的插值选项.
在初始化程序中将方法#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
Run Code Online (Sandbox Code Playgroud)
然后覆盖语言环境文件中的destroy警报消息的转换:
# config/locales/en.yml
en:
flash:
actions:
destroy:
alert: "%{resource_name} could not be destroyed. %{resource_errors}"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5998 次 |
| 最近记录: |