[RUBY] [Explication approximative] Causes et remèdes pour ne pas pouvoir obtenir le nom du modèle ActiveHash

__ "Je veux obtenir le nom du modèle ActiveHash, mais j'obtiens une erreur non définie et je ne peux pas l'obtenir ..." __

Pour ces personnes, je vais expliquer comment obtenir le nom ActiveHash de force et pourquoi vous ne pouvez pas obtenir le nom en premier lieu.

Si vous êtes nouveau dans la programmation, nous vous serions reconnaissants de bien vouloir vous y référer. (Pour ceux qui savent pourquoi l'erreur se produit, cet article est inutile. Je suis désolé.)

Objectif de cet article

・ Découvrez comment obtenir des valeurs normales en utilisant ActiveHash -Apprenez à obtenir la valeur du modèle ActiveHash avec la méthode find · Comprendre pourquoi des erreurs de non-détection se produisent

[Premise] ActiveHash Acquisition de la valeur normale

sushi.rb


class Sushi < ActiveHash::Base
  self.data = [
    { id: 1, name: 'thon gras' },
    { id: 2, name: 'Toro moyen' },
    { id: 3, name: 'Combien' },
    { id: 4, name: 'anguille congre' },
    { id: 5, name: 'Engawa' },
    { id: 6, name: 'oursin' },
    { id: 7, name: 'Le calamar' }
  ] 
end

rhtml:lunch.html.erb


<%= @shari.sushi.name %>
<!--@ Sushi de Shari_Si l'identifiant est "4", "Anako" s'affiche.-->

Avec une telle description, vous pouvez obtenir la valeur du nom associée à @ shari.sushi_id à partir du modèle ActiveHash. (La description du modèle est omise cette fois.)

Cependant, sous certaines conditions __, l'élément name d'ActiveHash ne peut pas être obtenu.

undefined method '〇〇' for …

Dans certains cas, une erreur peut se produire.

Dans un tel cas, je vais vous dire comment obtenir de force la valeur du modèle ActiveHash.

Partie 1: Obtenir et afficher à l'aide de la recherche

rhtml:lunch.html.erb


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

"J'ai eu une erreur, mais je veux écrire un modèle Active Hash et l'utiliser ..."

La méthode recommandée consiste à utiliser la méthode __find pour forcer __.

(1) Passez l'id que vous souhaitez obtenir à l'argument de la méthode find, et recherchez @ shari.neta_id à partir du modèle Sushi (ActiveHash). (2) Je veux le nom de l'identifiant acquis, je vais donc ajouter .name à la fin. (3) À partir du modèle Sushi, vous pouvez obtenir l'élément name qui correspond à @ shari.neta_id.

C'est un peu la force brute, mais vous pouvez utiliser cette méthode pour obtenir l'élément de nom spécifié. Cependant, soyez prudent lorsque vous l'utilisez, car le code a tendance à être redondant.

Partie 2: Obtenir et afficher avec form.select et Case

rhtml:new.html.erb


<%= form.select :neta_id,[["Chinchard",1],["Kohada",2],["Mutsu rouge",3],["Amadai",4]] %>

rhtml:lunch.html.erb


<% case @shari.neta_id %>
  <% when 1 then %>
     <p>Chinchard</p>
  <% when 2 then %>
     <p>Kohada</p>
  <% when 3 then %>
     <p>Mutsu rouge</p>
  <% when 4 then %>
     <p>Amadai</p>
<% end %>

"La quantité de description est petite et il n'est pas nécessaire qu'elle soit ActiveHash ..."

Pour ceux qui disent, en décrivant la partie déroulante dans form.select et la partie affichage dans une instruction case, il est possible de créer une pseudo expression de type ActiveHash.

Cependant, il est recommandé d'utiliser cette méthode uniquement lorsqu'il y a peu de choix, car la quantité de description devient énorme à mesure que les choix augmentent et cela peut réduire la lisibilité du code.

Pourquoi ne puis-je pas l'obtenir en premier lieu?

En conclusion, si __ "Le nom du modèle du modèle ActiveHash ne correspond pas au nom de la colonne" __, l'élément de nom ne peut pas être obtenu de manière canonique.

Si le nom de la colonne est sushi_id (type entier), le nom du modèle ActiveHash doit également être Sushi.rb. Dans le cas de (1) ci-dessus, même si vous essayez d'obtenir la valeur de Sushi.rb sous la forme de neta.name, vous ne pouvez pas l'obtenir.

Lors de la création d'un modèle ActiveHash pour créer des listes déroulantes et des cases à cocher, assurez-vous que le nom du modèle et le nom de la colonne sont identiques.

Résumé

(1) ActiveHash ne peut pas obtenir l'élément name avec .name sauf si le nom du modèle et le nom de la colonne sont présents. (2) Si vous souhaitez obtenir la valeur du modèle d'un autre nom, vous pouvez obtenir l'élément name en utilisant find. (3) Si la description elle-même (choix) est petite, il existe également une méthode pour l'exprimer en utilisant form.select et quand.

Merci d'avoir regardé jusqu'à la fin. Continuons à étudier dur!

Recommended Posts

[Explication approximative] Causes et remèdes pour ne pas pouvoir obtenir le nom du modèle ActiveHash
J'étais accro à ne pas pouvoir me connecter à AWS-S3 à partir du conteneur Docker
[Rails] La cause de l'impossibilité de publier des messages était form_with
Obtenir les noms de colonnes d'une instance de Model
Solution de contournement pour GMO VPS (CentOS8.1) ne pouvant pas démarrer après la mise à jour de yum
[Deep Learning from scratch] en Java 1. Pour le moment, différenciation et différenciation partielle