Activeadmin: Erros de destruição não mostrados

Criado em 16 ago. 2014  ·  3Comentários  ·  Fonte: activeadmin/activeadmin

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

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 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}"

Todos 3 comentários

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
Esta página foi útil?
0 / 5 - 0 avaliações