[RUBY] [Grobe Erklärung] Ursachen und Abhilfemaßnahmen dafür, dass der Name nicht aus dem ActiveHash-Modell abgerufen werden kann

__ "Ich möchte den Namen vom ActiveHash-Modell erhalten, erhalte jedoch einen undefinierten Fehler und kann ihn nicht erhalten ..." __

Für solche Leute werde ich erklären, wie man den ActiveHash-Namen gewaltsam erhält und warum man den Namen überhaupt nicht bekommen kann.

Wenn Sie neu in der Programmierung sind, würden wir uns freuen, wenn Sie sich darauf beziehen könnten. (Für diejenigen, die wissen, warum der Fehler auftritt, ist dieser Artikel nutzlos. Es tut mir leid.)

Zweck dieses Artikels

・ Überprüfen Sie, wie Sie mit ActiveHash normale Werte erhalten -Lernen Sie, wie Sie mit der find-Methode den Wert aus dem ActiveHash-Modell abrufen · Verstehen Sie, warum Undefind-Fehler auftreten

[Prämisse] ActiveHash Erfassung des Normalwerts

sushi.rb


class Sushi < ActiveHash::Base
  self.data = [
    { id: 1, name: 'fetter Thunfisch' },
    { id: 2, name: 'Mittlerer Toro' },
    { id: 3, name: 'Lachsrogen' },
    { id: 4, name: 'Conger Aal' },
    { id: 5, name: 'Engawa' },
    { id: 6, name: 'Seeigel' },
    { id: 7, name: 'Der Tintenfisch' }
  ] 
end

rhtml:lunch.html.erb


<%= @shari.sushi.name %>
<!--@ Sharis Sushi_Wenn die ID "4" ist, wird "Anako" angezeigt.-->

Mit einer solchen Beschreibung können Sie den Wert des mit @ shari.sushi_id verknüpften Namens aus dem ActiveHash-Modell abrufen. (Die Beschreibung des Modells wird diesmal weggelassen.)

Unter bestimmten Bedingungen __ kann das name-Element von ActiveHash jedoch nicht abgerufen werden.

undefined method '〇〇' for …

In einigen Fällen kann ein Fehler auftreten.

In einem solchen Fall werde ich Ihnen erklären, wie Sie den Wert zwangsweise aus dem ActiveHash-Modell abrufen können.

Teil 1: Abrufen und Anzeigen mit find

rhtml:lunch.html.erb


<%= Sushi.find(@shari.neta_id).name %>

"Ich habe einen Fehler erhalten, möchte aber ein Active Hash-Modell schreiben und es verwenden ..."

Die empfohlene Methode besteht darin, die __find-Methode zu verwenden, um __ zwangsweise abzurufen.

(1) Übergeben Sie die ID, die Sie erhalten möchten, an das Argument der find-Methode und suchen Sie im Sushi-Modell (ActiveHash) nach @ shari.neta_id. (2) Ich möchte den Namen der erworbenen ID, also werde ich am Ende .name hinzufügen. (3) Aus dem Sushi-Modell können Sie das Namenselement erhalten, das mit @ shari.neta_id übereinstimmt.

Es ist ein bisschen Brute Force, aber Sie können diese Methode verwenden, um das angegebene Namenselement abzurufen. Seien Sie jedoch vorsichtig, wenn Sie es verwenden, da der Code in der Regel redundant ist.

Teil 2: Abrufen und Anzeigen mit form.select und Case

rhtml:new.html.erb


<%= form.select :neta_id,[["Stöcker",1],["Kohada",2],["Roter Mutsu",3],["Amadai",4]] %>

rhtml:lunch.html.erb


<% case @shari.neta_id %>
  <% when 1 then %>
     <p>Stöcker</p>
  <% when 2 then %>
     <p>Kohada</p>
  <% when 3 then %>
     <p>Roter Mutsu</p>
  <% when 4 then %>
     <p>Amadai</p>
<% end %>

"Die Menge an Beschreibungen ist gering und es muss nicht ActiveHash sein ..."

Wenn Sie den Pulldown-Teil in form.select und den Anzeigeteil in der case-Anweisung beschreiben, können Sie einen Pseudo-ActiveHash-ähnlichen Ausdruck erstellen.

Es wird jedoch empfohlen, diese Methode nur zu verwenden, wenn nur wenige Auswahlmöglichkeiten vorhanden sind, da der Umfang der Beschreibung mit zunehmender Auswahl sehr groß wird und die Lesbarkeit des Codes beeinträchtigt werden kann.

Warum kann ich es überhaupt nicht bekommen?

Wenn __ "Der Modellname des ActiveHash-Modells stimmt nicht mit dem Spaltennamen überein" __, kann das name-Element nicht auf kanonische Weise abgerufen werden.

Wenn der Spaltenname sushi_id (ganzzahliger Typ) lautet, muss der ActiveHash-Modellname auch Sushi.rb sein. Im Fall von (1) oben können Sie den Wert von Sushi.rb nicht in Form von neta.name abrufen, auch wenn Sie versuchen, ihn abzurufen.

Stellen Sie beim Erstellen eines ActiveHash-Modells zum Erstellen von Pulldowns und Kontrollkästchen sicher, dass der Modellname und der Spaltenname identisch sind.

Zusammenfassung

(1) ActiveHash kann das name-Element mit .name nur abrufen, wenn der Modellname und der Spaltenname vorhanden sind. (2) Wenn Sie den Wert aus dem Modell eines anderen Namens abrufen möchten, können Sie das name-Element mithilfe von find abrufen. (3) Wenn die Beschreibung selbst (Auswahlmöglichkeiten) klein ist, gibt es auch eine Methode, um sie mit form.select und when auszudrücken.

Danke, dass du bis zum Ende zugesehen hast. Lass uns weiter hart lernen!

Recommended Posts

[Grobe Erklärung] Ursachen und Abhilfemaßnahmen dafür, dass der Name nicht aus dem ActiveHash-Modell abgerufen werden kann
Ich war süchtig danach, vom Docker-Container aus keine Verbindung zu AWS-S3 herstellen zu können
[Rails] Die Ursache dafür, dass nicht gepostet werden konnte, war in form_with
Ruft Spaltennamen von einer Instanz von Model ab
Problemumgehung für GMO VPS (CentOS8.1) kann nach dem yum-Update nicht gestartet werden
[Deep Learning von Grund auf neu] in Java 1. Zur Zeit Differenzierung und teilweise Differenzierung