Os erros de destruição não são exibidos em uma mensagem flash.
Acontece quando um modelo é definido com has_many
com restrict_with_error
como tal:
class User
has_many :orders, dependent: :restrict_with_error
..
end
O código a seguir pode corrigi-lo, mas realmente acho que este deve ser o comportamento padrão:
after_destroy :check_model_errors
controller do
def check_model_errors(object)
return unless object.errors.any?
flash[:error] ||= []
flash[:error].concat(object.errors.full_messages)
end
end
O tratamento / exibição de erros não faz parte do AA, é parte do InheritedResources
@kaspernj , descobri que isso pode ser feito no ActiveAdmin por meio de traduções I18n e da personalização das opções de interpolação dos respondentes no controlador.
Adicionando o método #interpolation_options
a ActiveAdmin::BaseController
em um inicializador:
# 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
Em seguida, substituindo a tradução da mensagem de alerta de destruição no arquivo local:
# config/locales/en.yml
en:
flash:
actions:
destroy:
alert: "%{resource_name} could not be removed. %{resource_errors}"
A solução de @ zorab47 é ótima, mas não cobre a uniformidade quando estamos tentando destruir um objeto aninhado (accept_nested_attributes no modelo e f.has_many (: resources, allow_destroy: true) no activeadmin).
Como _experimental monkey patch_, adiciono o seguinte em config / initializers / active_admin.rb:
ActiveAdmin::ResourceController::DataAccess.module_eval do
def update_resource(object, attributes)
if object.respond_to?(:assign_attributes)
object.assign_attributes(*attributes)
else
object.attributes = attributes[0]
end
begin
run_update_callbacks object do
save_resource(object)
end
rescue ActiveRecord::RecordNotDestroyed => e
flash[:error] = "Cannot destroy nested object."
object.errors.add(:base, e.to_s)
end
end
end
Comentários muito úteis
@kaspernj , descobri que isso pode ser feito no ActiveAdmin por meio de traduções I18n e da personalização das opções de interpolação dos respondentes no controlador.
Adicionando o método
#interpolation_options
aActiveAdmin::BaseController
em um inicializador:Em seguida, substituindo a tradução da mensagem de alerta de destruição no arquivo local: