sql >> Databáze >  >> RDS >> PostgreSQL

Proč dostanu ActionView::Template::Error:nedefinovaná metoda `name' pro nil:NilClass na Heroku, ale ne lokálně

Podle vaší aktualizace navrhnu toto:Pokaždé, když smažete uživatele, který má příspěvky, a poté se pokusíte vypsat jeho příspěvky <%= post.user.name %> vrátí nulu, protože tento příspěvek již nemá uživatele, na kterého by se mohl odkazovat. Můžete použít buď

has_many :posts, dependent: :destroy 

v uživatelském modelu, jak jsem navrhl výše, nebo přidáte nějakou funkcionalitu k mazání uživatelů, abyste předešli chybám při pokusu o zobrazení jejich příspěvků. Některé možnosti jsou:

Když je uživatel smazán, můžete jednoduše smazat vše kromě jeho jména a ID v tomto řádku uživatelské tabulky, což vám umožní mít <%= post.user.name %> vrátit hodnotu.

Když je uživatel smazán, můžete smazat vše v jeho informacích o uživatelské tabulce a přidat "-user-deleted" za to, co dělá Tumblr, když uživatel deaktivuje svůj účet a jeho jméno se objeví v příspěvku na nějakém jiném Tumblru.

Můžete vytvořit uživatele v DB s názvem "uživatel-smazán" a nechat tohoto uživatele zdědit každý příspěvek od uživatele, který je smazán. V ovladači uživatele přidejte něco do delete akci změnit pole user_id v jejich příspěvcích na účet „smazaný uživatelem“.

Nebo nakonec můžete zkontrolovat, zda post.user vrací hodnotu, a pokud ne, stačí vytisknout něco jako "Uživatel již v systému neexistuje"

To vše samozřejmě závisí na tom, zda chcete uživatelům povolit smazání, ale přesto si ponechat jejich příspěvky. To je jistě pravděpodobný případ, pokud jde o víc než jen o třídní projekt nebo něco, co děláte jen proto, abyste se naučili Rails. Snad to pomůže. Určitě mě to přivedlo k zamyšlení nad úskalími v tom, že umožňuje uživatelům smazat své profily, aniž by po nich měli něco na úklid.



  1. Jak pro každý řádek funguje spouštěče v mysql?

  2. Django DB transakce a uváznutí

  3. Aktivní záznam v codeigniteru

  4. Uložená procedura způsobí, že příkazy nejsou synchronizovány při dalším dotazu