Überschreiben von user_guardian.rb in einem Plugin (kein Fork nötig!)

Hey, entschuldige die Anfängerfrage hier. Ich habe die Dokumentation gelesen, brauche aber bitte etwas Anleitung.

Ich habe Discourse geforkt und eigene Änderungen vorgenommen, die ich dann selbst deployen möchte. Der Leitfaden zum Mitwirken erklärt, wie man Änderungen vornimmt und einen PR einreicht, aber in diesem Fall möchte ich keinen PR stellen. Ich möchte einfach meine kleine Änderung übernehmen und eine Discourse-Installation daraus zum Laufen bringen. Ich dachte, der Weg dazu bestünde darin, diese Zeile auf mein eigenes Repository zu ändern:

Ich habe das getan und eine Installation durchgeführt, aber meine Änderungen werden nicht angezeigt. Offensichtlich mache ich also etwas falsch. Hast du eine Idee? Danke!

EDIT:
Zur Transparenz und falls es einen einfacheren Weg gibt: Alles, was ich erreichen möchte, ist, anonymen Benutzern zu erlauben, ihre Benutzernamen und Benutzerdaten zu ändern, wenn sie in den anonymen Modus wechseln. Das ist so einfach wie das Ändern von false zu true in dieser Zeile:

Wenn es einen besseren Weg gibt, bin ich sehr offen dafür. Aber das ist alles, was ich aktivieren muss. Ich bin versiert in Python, Java und vielen anderen Backend-Technologien, aber ich kenne mich mit Ruby/JavaScript/HTML usw. überhaupt nicht aus.

EDIT2:
Wie in einem Beitrag, den ich woanders gesehen habe, habe ich die app.yml wie folgt aktualisiert:

run:
- exec:
 cd: /var/www/discourse
 cmd:
    - sudo -u discourse git remote set-url origin https://github.com/my/forked/discourse.git
    - sudo -u discourse git fetch origin
    - sudo -u discourse git checkout origin/master

Trotzdem keine Besserung nach dem Neuaufbau der App. Sie startet zwar ordnungsgemäß, aber meine Änderungen scheinen nicht vorhanden zu sein.

Ist es nicht möglich, deine Änderungen in ein Plugin zu packen und stattdessen dieses zu verwenden?

5 „Gefällt mir“

Jeder, der das getan hat, hat es bitter bereut. Und hier bekommst du kaum Hilfe.

Was auch immer du tust, mach es in einem Plugin.

10 „Gefällt mir“

Okay. Hast du eine Idee, wie ich das über ein Plugin machen könnte?

Hey @leighno5

Aus persönlicher Erfahrung möchte ich dir sagen, dass das Schreiben von Plugins für Ruby, um das zu erreichen, was du in deinem „Fork

5 „Gefällt mir“

Hier ist ein guter Ausgangspunkt:

3 „Gefällt mir“

Nein, du liegst absolut richtig. Ich habe überhaupt keine Erfahrung mit Ruby, also ist das überhaupt keine Beleidigung!

Ich habe den Plug-in-Leitfaden gesehen und ihn ein paar Mal durchgearbeitet, aber leider führt meine Unkenntnis von Ruby weiterhin zu Frustration. Ich habe keine Ahnung, wie ich ein Plug-in schreiben könnte, das diesen kleinen Code-Abschnitt in der user-guardian-Datei überschreibt, um anonymen Benutzern zu erlauben, ihre Namen zu ändern. :confused:

2 „Gefällt mir“

Hallo @leighno5,

ja, ich verstehe.

Diese „HOWTO“-Plug-in-Themen wurden von sehr talentierten Entwicklern verfasst, die über ein Jahrzehnt Erfahrung in der Programmierung mit Rails und Ruby haben (vielleicht sogar mehr). Tatsächlich gehören einige dieser Leute zu den besten Ruby- und JS-Entwicklern der Welt.

Ich bin mir zu 100 % sicher, dass diese Leute Rails und Ruby lange vor dem Schreiben ihres ersten Discourse-Plug-ins gelernt haben.

Es ist eigentlich gar nicht so schwer, Rails zu lernen; aber man muss das „Hands-on-Ritual“ durchmachen, einige Rails-Anwendungen von Grund auf zu entwickeln. Nicht nur einem YT-Tutorial folgen (was gut ist), sondern eine funktionierende Anwendung bauen, bei der du dich mit der Einrichtung der Datenbank, dem Erstellen eigener Modelle, dem Erstellen eigener Controller, dem Schreiben von Modellvalidierungen, dem Schreiben von Initialisierern und Hilfsmodulen, dem Migrieren (Ändern) der Datenbank, der Arbeit mit Embedded Ruby und vielem mehr auseinandersetzen musst.

Es macht tatsächlich viel Spaß und ist der „kürzeste Weg“, um sich wirklich wohlfühlend beim Schreiben von Plug-ins zu fühlen (bezüglich der Rails-Seite; ich persönlich arbeite nicht viel mit Ember, aber die Rails-Seite liebe ich!).

Außerdem musst du die Rails-Konsole lernen! Die Rails-Konsole macht wirklich Spaß, und ich nutze sie täglich mit Freude!

Heute habe ich mit meinem Lieblingskunden AnyDesk benutzt, und er fragte: „Können wir diese neue Ansicht für den Bestand haben?“. Er wollte mir dabei zusehen, wie ich es umsetze. Nachdem alles eingerichtet und lauffähig war, sagte er am Ende des Anrufs: „Du hast etwas in Rails in 30 Minuten erledigt, wofür es vor einigen Jahrzehnten viele Wochen gebraucht hätte!“ Wirklich beeindruckend, @leighno5. Mach dich daran!!

Sobald du Rails gelernt hast, wirst du sagen: „WOW“, das Schreiben von Discourse-Plug-ins ist ziemlich einfach, zumindest was den Rails- und Ruby-Teil betrifft!!

HTH

3 „Gefällt mir“

Schau dir den bestehenden #plugin-Code an. Es gibt mittlerweile absolut jede Menge davon, also gibt es reichlich Beispiele. Überspringe das Lesen von Vorarbeiten nicht, damit du sie nutzen kannst.

Es klingt so, als wolltest du nur eine Methode überschreiben, was einfach durch deren Neudefinition in deiner plugin.rb erreicht wird (obwohl es als Best Practice gilt, sie pro Modul in eine eigene Datei auszulagern, aber bei nur einer Methode lohnt sich das nicht!)

5 „Gefällt mir“

Ich möchte meine Unwissenheit nicht weiter zur Schau stellen und die Freundlichkeit, die du mir bereits entgegengebracht hast, nicht weiter ausnutzen, aber wärst du bereit, das noch etwas zu erläutern? Oder falls dir ein anderes Beispiel bekannt ist, in dem jemand ein Modul überschrieben hat, wäre ich dankbar, wenn du mir einen Link dazu schicken könntest. Ich habe absolut nichts gegen „rtfm

3 „Gefällt mir“

Hier ist ein Beispiel, bei dem wir eine Methode im PostGuardian definiert haben:

Sie könnten etwas Ähnliches für den UserGuardian mit dem vorhandenen Methodennamen tun, wodurch diese Methode überschrieben wird.

Einfache Lösung (um es zum Laufen zu bringen, auch wenn es nicht robust ist):

Schreiben Sie einfach den ursprünglichen Methodencode aus und nehmen Sie Ihre Änderung vor. Nachteil: Wenn Discourse den Code ändert, könnte Ihr Plugin die Instanz beschädigen.

Fortgeschrittene Lösung (robustere Lösung):

Für zusätzliche Punkte könnten Sie super verwenden, um die ursprüngliche Methode zu erben. Das funktioniert jedoch aus Gründen, die ich hier nicht weiter ausführen werde, nicht garantiert. Es ist dennoch Best Practice, da dann Aktualisierungen dieser Methode in Discourse immer berücksichtigt werden, ohne dass Sie Ihr Plugin ändern müssen.

Discourse ist eine Plattform. Es braucht Zeit, sie zu lernen. Gehen Sie es einfach Schritt für Schritt an.

6 „Gefällt mir“

Das war genau das, worum ich mir Sorgen gemacht habe. Wird die in deinem nächsten Absatz erwähnte erweiterte Methode im How-to-Leitfaden behandelt? Gibt es ein gutes, einfaches Beispiel dafür, wie es in einem bestehenden Plugin verwendet wird, das man (kopieren und) beim Erstellen eines neuen Plugins nutzen könnte?

Mach dir vorerst keine Sorgen um die fortgeschrittene Methode. Konzentriere dich einfach darauf, dass es funktioniert. Du kannst dich allgemein über Ruby on Rails in anderen Online-Anleitungen informieren. Das liegt etwas außerhalb des Rahmens von Discourse und dieses Forums. Sei dir dessen bewusst.

1 „Gefällt mir“

Ok, danke! Nehmen wir an, ich schreibe ein kleines Plugin. Wenn ich es richtig verstanden habe, sollte ich dann bei jedem Upgrade den Kerncode prüfen und das Plugin neu schreiben, falls sich der betreffende Kerncode geändert hat. Ist das korrekt? Danke.

1 „Gefällt mir“

Das ist korrekt. Prüfen Sie es gelegentlich, insbesondere wenn es zu Fehlfunktionen kommt. Der Guardian-Code ist etwas kritischer, da er die Berechtigung für die Codeseite regelt, also halten Sie ihn im Auge.

Eine weitere Lösung besteht darin, Testfälle (auch Specs genannt) hinzuzufügen und eine automatisierte Aufgabe zum Ausführen dieser einzurichten – das wird jedoch etwas aufwendig!

2 „Gefällt mir“

Eine weitere Zusatzleistung besteht darin, travis-ci.org so einzurichten, dass es Tests für dein Plugin ausführt, damit du sofort Bescheid weißt, falls es Probleme gibt.

5 „Gefällt mir“

Offensichtlich keine Aufgabe, die man auf die leichte Schulter nehmen sollte. Ich möchte die Modal-Fenster für die Anmeldung und die Kontoerstellung ändern und das Twitter-Bild entfernen. Vielleicht wäre Letzteres ein besserer erster Schritt. Vielen Dank.

Falls jemand hier vorbeikommt und genauso verloren war wie ich, stelle ich hier meinen Code zur Verfügung, da ich ihn wie gewünscht zum Laufen gebracht habe. Ich habe keine Dateien geändert. Ich habe einfach eine neue Datei plugin.rb erstellt und folgenden Inhalt hineingeschrieben:

# about: Ermöglicht Benutzern im anonymen Modus, ihre Benutzernamen zu ändern
# version: 0.1


require_dependency 'guardian'
require_dependency 'guardian/user_guardian'

class ::Guardian
end

module ::UserGuardian
  def can_edit_username?(user)
    return false if SiteSetting.sso_overrides_username?
    return true if is_staff?
    return false if SiteSetting.username_change_period <= 0
    return true if is_anonymous?
    is_me?(user) && ((user.post_count + user.topic_count) == 0 || user.created_at > SiteSetting.username_change_period.days.ago)
  end


  def can_edit_name?(user)
    return false unless SiteSetting.enable_names?
    return false if SiteSetting.sso_overrides_name?
    return true if is_staff?
    return true if is_anonymous?
    can_edit?(user)
  end
end

Dies überschreibt die Klasse user_guardian.rb im Discourse-Kern, damit Benutzer den Benutzernamen und Namen ihrer anonymen Benutzerkonten ändern können.

Wenn Sie vergleichen, was ich hier habe, mit dem, was in user_guardian.rb im Discourse-Kern steht, sehen Sie, dass es eine Reihe weiterer Dinge gibt, bei denen ich nichts tun musste, also habe ich sie unverändert gelassen. Alles, was ich brauchte, war, diese beiden Methoden can_edit_username und can_edit_name zu bearbeiten, indem ich einige Rückgabewerte von false auf true änderte, und ich konnte erreichen, was ich wollte.

Sicherlich gibt es Verbesserungen, die vorgenommen werden könnten, und es gibt wahrscheinlich bewährte Praktiken, die ich durch das Lesen der verlinkten Beiträge hier und anderswo ableiten konnte. Aber wenn Sie wie ich brandneu in Ruby sind und einfach nur etwas sehr Einfaches im Kern anpassen möchten, ist dies ein funktionierendes minimalistisches Beispiel dafür, was Sie tun müssen.

Vielen Dank an die Leute in diesem Thread für ihre Geduld mit mir sowie für ihre Ermutigung und Unterstützung! Insbesondere an @merefield, der mich bereits bei einem anderen Beitrag in der Vergangenheit unterstützt hat.

10 „Gefällt mir“

LOL

Du hast es weit gebracht von deiner ursprünglichen Idee, Discourse komplett zu forken und den Hauptzweig für solche einfachen Aufgaben aufzugeben.

Gut gemacht :slight_smile:

4 „Gefällt mir“

Bist du den gesamten Weg unter Install Discourse on Ubuntu or Debian for Development gegangen oder hast du einfach an deiner Produktionsseite gearbeitet und auf das Beste gehofft?