Db.rake schlägt für mein E-Mail-Check-Plugin beim Neuerstellen der App fehl

Ich habe mein erstes Plugin entwickelt, das bei der Registrierung über eine externe API prüft, ob es sich um eine temporäre E-Mail-Adresse handelt.

Bisher funktioniert es wie vorgesehen…

Aber nun scheint es beim erneuten Erstellen/Upgraden der App ein Problem mit db.rake zu geben:

rails aborted!
ActiveRecord::RecordInvalid: Validierung fehlgeschlagen: E-Mail ist von diesem E-Mail-Anbieter nicht erlaubt. Bitte verwenden Sie eine andere E-Mail-Adresse.
(eval):39:in `block (2 levels) in run_file'
/src/lib/tasks/db.rake:222:in `block in <main>'
bin/rails:17:in `<main>'
Tasks: TOP => db:migrate
(Siehe vollständigen Aufruf, indem Sie den Task mit --trace ausführen)

Wahrscheinlich, weil diese Zeile in db.rake versucht, einige Daten zu initialisieren, was jedoch nicht möglich ist, da mein Plugin ungültige E-Mails prüft und dazwischenfunkt:

SeedFu.seed(SeedHelper.paths, SeedHelper.filter)

Aber im selben Datei habe ich festgestellt, dass es für ein Plugin möglich ist, sich von der Ausführung von Seed-Datendateien auszuschließen:

  def self.filter
    # Ermöglicht es einem Plugin, bestimmte Seed-Datendateien von der Ausführung auszuschließen
    DiscoursePluginRegistry.seedfu_filter.any? ?
      /^(?!.*(#{DiscoursePluginRegistry.seedfu_filter.to_a.join("|")})).*$/ : nil
  end
end

Aber wie? Gibt es Beispiele von Plugins, die das tun? Oder muss ich etwas anderes tun, um diesen Punkt zu überwinden? Vielen Dank im Voraus für jede Hilfe.

Listet die von dir erhaltene Fehlermeldung nicht die eigentliche Seed-Datendatei, die das Problem verursacht?

Sobald du weißt, welche Seed-Datendatei das Problem verursacht, kannst du sie in deinem Plugin mit folgendem Code filtern:

after_initialize do
  register_seedfu_filter "00X_seed_filename"
  ...
end

Toll.

Bezüglich des gemeldeten Fehlers habe ich das alles.

== 20200819021210 AddUserSelectableColumnToColorSchemes: migrating ============
-- add_column(:color_schemes, :user_selectable, :bool, {:null=>false, :default=>false})
   -> 0.0062s
== 20200819021210 AddUserSelectableColumnToColorSchemes: migrated (0.0100s) ===

== 20200819203846 AddColorSchemeIdToUserOptions: migrating ====================
-- add_column(:user_options, :color_scheme_id, :integer)
   -> 0.0035s
== 20200819203846 AddColorSchemeIdToUserOptions: migrated (0.0051s) ===========

== 20200820174703 AddPartialTargetIdIndexToReviewables: migrating =============
-- add_index(:reviewables, [:target_id], {:where=>"target_type = 'Post'", :algorithm=>:concurrently, :name=>"index_reviewables_on_target_id_where_post_type_eq_post"})
   -> 0.0079s
== 20200820174703 AddPartialTargetIdIndexToReviewables: migrated (0.0091s) ====

rails aborted!
ActiveRecord::RecordInvalid: Validation failed: Email is not allowed from that email provider. Please use another email address.
(eval):39:in `block (2 levels) in run_file'
/src/lib/tasks/db.rake:222:in `block in <main>'
bin/rails:17:in `<main>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

Gibt es eine Möglichkeit herauszufinden/zu debuggen, welche Datei genau das Problem für mein kleines neues Plugin verursacht? Ich vermute, es handelt sich um irgendetwas, das Benutzer mit E-Mail-Adressen einrichtet.

Hier sind weitere Debug-Informationen:

Zusammenfassung

terrapop@terrapop:/var/www/discourse$ d/rails --trace db:migrate RAILS_ENV=development
** Invoke db:migrate (first_time)
** Invoke db:load_config (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:load_config
** Invoke environment
** Invoke set_locale (first_time)
** Execute set_locale
** Execute db:migrate
** Invoke db:_dump (first_time)
** Execute db:_dump
** Invoke db:structure:dump (first_time)
** Invoke db:load_config
** Execute db:structure:dump
rails aborted!
ActiveRecord::RecordInvalid: Validation failed: Email is not allowed from that email provider. Please use another email address.
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/validations.rb:80:in raise_validation_error' /usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/validations.rb:53:in save!’
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/transactions.rb:318:in block in save!' /usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/transactions.rb:375:in block in with_transaction_returning_status’
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/connection_adapters/abstract/database_statements.rb:278:in transaction' /usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/transactions.rb:212:in transaction’
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/transactions.rb:366:in with_transaction_returning_status' /usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/transactions.rb:318:in save!’
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/suppressor.rb:48:in save!' /usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/persistence.rb:635:in block in update!’
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/transactions.rb:375:in block in with_transaction_returning_status' /usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/connection_adapters/abstract/database_statements.rb:278:in transaction’
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/transactions.rb:212:in transaction' /usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/transactions.rb:366:in with_transaction_returning_status’
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/persistence.rb:633:in update!' (eval):39:in block (2 levels) in run_file’
/usr/local/lib/ruby/gems/2.6.0/gems/seed-fu-2.3.9/lib/seed-fu/runner.rb:46:in eval' /usr/local/lib/ruby/gems/2.6.0/gems/seed-fu-2.3.9/lib/seed-fu/runner.rb:46:in block (2 levels) in run_file’
/usr/local/lib/ruby/gems/2.6.0/gems/seed-fu-2.3.9/lib/seed-fu/runner.rb:58:in block in open' /usr/local/lib/ruby/gems/2.6.0/gems/seed-fu-2.3.9/lib/seed-fu/runner.rb:57:in open’
/usr/local/lib/ruby/gems/2.6.0/gems/seed-fu-2.3.9/lib/seed-fu/runner.rb:57:in open' /usr/local/lib/ruby/gems/2.6.0/gems/seed-fu-2.3.9/lib/seed-fu/runner.rb:36:in block in run_file’
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/connection_adapters/abstract/database_statements.rb:280:in block in transaction' /usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/connection_adapters/abstract/transaction.rb:280:in block in within_new_transaction’
/usr/local/lib/ruby/gems/2.6.0/gems/activesupport-6.0.3.2/lib/active_support/concurrency/load_interlock_aware_monitor.rb:26:in block (2 levels) in synchronize' /usr/local/lib/ruby/gems/2.6.0/gems/activesupport-6.0.3.2/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in handle_interrupt’
/usr/local/lib/ruby/gems/2.6.0/gems/activesupport-6.0.3.2/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in block in synchronize' /usr/local/lib/ruby/gems/2.6.0/gems/activesupport-6.0.3.2/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in handle_interrupt’
/usr/local/lib/ruby/gems/2.6.0/gems/activesupport-6.0.3.2/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in synchronize' /usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/connection_adapters/abstract/transaction.rb:278:in within_new_transaction’
/usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/connection_adapters/abstract/database_statements.rb:280:in transaction' /usr/local/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/transactions.rb:212:in transaction’
/usr/local/lib/ruby/gems/2.6.0/gems/seed-fu-2.3.9/lib/seed-fu/runner.rb:35:in run_file' /usr/local/lib/ruby/gems/2.6.0/gems/seed-fu-2.3.9/lib/seed-fu/runner.rb:26:in block in run’
/usr/local/lib/ruby/gems/2.6.0/gems/seed-fu-2.3.9/lib/seed-fu/runner.rb:25:in each' /usr/local/lib/ruby/gems/2.6.0/gems/seed-fu-2.3.9/lib/seed-fu/runner.rb:25:in run’
/usr/local/lib/ruby/gems/2.6.0/gems/seed-fu-2.3.9/lib/seed-fu.rb:29:in seed' /src/lib/tasks/db.rake:222:in block in ’
/usr/local/lib/ruby/gems/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:281:in block in execute' /usr/local/lib/ruby/gems/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:281:in each’
/usr/local/lib/ruby/gems/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:281:in execute' /usr/local/lib/ruby/gems/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:219:in block in invoke_with_call_chain’
/usr/local/lib/ruby/2.6.0/monitor.rb:235:in mon_synchronize' /usr/local/lib/ruby/gems/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:199:in invoke_with_call_chain’
/usr/local/lib/ruby/gems/2.6.0/gems/rake-13.0.1/lib/rake/task.rb:188:in invoke' /usr/local/lib/ruby/gems/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:160:in invoke_task’
/usr/local/lib/ruby/gems/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:116:in block (2 levels) in top_level' /usr/local/lib/ruby/gems/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:116:in each’
/usr/local/lib/ruby/gems/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:116:in block in top_level' /usr/local/lib/ruby/gems/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:125:in run_with_threads’
/usr/local/lib/ruby/gems/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:110:in top_level' /usr/local/lib/ruby/gems/2.6.0/gems/railties-6.0.3.2/lib/rails/commands/rake/rake_command.rb:23:in block in perform’
/usr/local/lib/ruby/gems/2.6.0/gems/rake-13.0.1/lib/rake/application.rb:186:in standard_exception_handling' /usr/local/lib/ruby/gems/2.6.0/gems/railties-6.0.3.2/lib/rails/commands/rake/rake_command.rb:20:in perform’
/usr/local/lib/ruby/gems/2.6.0/gems/railties-6.0.3.2/lib/rails/command.rb:48:in invoke' /usr/local/lib/ruby/gems/2.6.0/gems/railties-6.0.3.2/lib/rails/commands.rb:18:in
/usr/local/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.8/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in require' /usr/local/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.8/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in block in require_with_bootsnap_lfi’
/usr/local/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.8/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in register' /usr/local/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.8/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in require_with_bootsnap_lfi’
/usr/local/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.8/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in require' /usr/local/lib/ruby/gems/2.6.0/gems/activesupport-6.0.3.2/lib/active_support/dependencies.rb:324:in block in require’
/usr/local/lib/ruby/gems/2.6.0/gems/activesupport-6.0.3.2/lib/active_support/dependencies.rb:291:in load_dependency' /usr/local/lib/ruby/gems/2.6.0/gems/activesupport-6.0.3.2/lib/active_support/dependencies.rb:324:in require’
bin/rails:17:in `’
Tasks: TOP => db:migrate

Update:

Problem gefunden und behoben:

def seed_primary_email
  UserEmail.seed do |ue|
    ue.id = DiscourseNarrativeBot::BOT_USER_ID
    ue.email = "discobot_email"
    ue.primary = true
    ue.user_id = DiscourseNarrativeBot::BOT_USER_ID
  end
end

in discourse/plugins/discourse-narrative-bot/db/fixtures/001_discobot.rb hat das Problem verursacht.

Das Hinzufügen von register_seedfu_filter "001_discobot" hat das Problem behoben.

Danke an @blake für die richtige Richtung. Es funktioniert jetzt.

Letzte Frage: Für die Zukunft … wie registriert man mehrere Filter? So?

register_seedfu_filter "001_discobot|002_xxxxxx|003_yyyy"

Es gibt vielleicht eine Möglichkeit, dies in einer Zeile zu erledigen, aber um mehrere Filter zu registrieren, können Sie mehrere Zeilen verwenden

register_seedfu_filter "001..."
register_seedfu_filter "002..."

Diese seedfu_filter-API muss jedoch mit äußerster Vorsicht verwendet werden!

Ich denke wirklich nicht, dass du sie zu deinem Plugin hinzufügen solltest, da du damit discobot für andere Benutzer deines Plugins beschädigen könntest, wenn sie die Seed-Datei noch nicht ausgeführt haben.

Vielleicht könntest du Benutzer mit IDs < 0 ausschließen, damit dein Plugin die E-Mails von System und discobot nicht überprüft. Du kannst dafür die Methode .human_users verwenden.

Interessant, ich werde das definitiv prüfen und es wie von dir vorgeschlagen ändern.

@blake

Ich habe nun folgende Zeilen hinzugefügt:

return unless value.present?
return unless defined? record.id
return unless record.password_validation_required?

zusätzlich zu:

return unless record.should_validate_email_address?

Da disco_bot bereits mit einer ID in db.migrate erstellt wurde, funktioniert dies jetzt.

Außerdem musste ich den Validierer password_validation_required hinzufügen, da das Plugin sonst auch ausgelöst wurde, wenn man eingeloggt war und das Benutzer-Avatar änderte.

Jetzt ist es wirklich nur noch an das Anmeldungsformular gebunden, und es wird kein Seedfu-Filter mehr benötigt.