Activeadmin: Hancurkan kesalahan tidak ditampilkan

Dibuat pada 16 Agu 2014  ·  3Komentar  ·  Sumber: activeadmin/activeadmin

Hancurkan kesalahan tidak ditampilkan dalam pesan flash.

Terjadi ketika model didefinisikan dengan has_many dengan restrict_with_error seperti itu:

class User
  has_many :orders, dependent: :restrict_with_error
  ..
end

Kode berikut dapat memperbaikinya, tetapi menurut saya ini harus menjadi perilaku default:

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

Komentar yang paling membantu

@kaspernj , saya menemukan ini dapat dicapai dalam ActiveAdmin melalui terjemahan I18n dan menyesuaikan Opsi Interpolasi Responder di controller.

Menambahkan metode #interpolation_options ke ActiveAdmin::BaseController dalam penginisialisasi:

# 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

Kemudian ganti terjemahan untuk pesan peringatan penghancuran di file lokal:

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

Semua 3 komentar

Penanganan/penampilan kesalahan bukan bagian dari AA, ini adalah bagian dari InheritedResources

@kaspernj , saya menemukan ini dapat dicapai dalam ActiveAdmin melalui terjemahan I18n dan menyesuaikan Opsi Interpolasi Responder di controller.

Menambahkan metode #interpolation_options ke ActiveAdmin::BaseController dalam penginisialisasi:

# 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

Kemudian ganti terjemahan untuk pesan peringatan penghancuran di file lokal:

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

Solusi oleh @zorab47 bagus tapi jangan menutupi evenience ketika kami mencoba untuk menghancurkan objek bersarang (accept_nested_attributes dalam model dan f.has_many(:resources, allow_destroy: true) di activeadmin).

Sebagai _experimental monkey patch_ saya menambahkan berikut ini di 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
Apakah halaman ini membantu?
0 / 5 - 0 peringkat