2017-01-21 1 views
0

J'ai un problème inhabituel où je peux accéder à un objet, mais pas ses propriétés dans une vue. Toute assistance, conseils, est grandement appréciée.Rails - Objet Disponible dans la vue, mais pas les propriétés de l'objet?

Ceci est mon modèle (app/models/team_member.rb):

class TeamMember < ApplicationRecord 
    attr_accessor :name 
end 

Ceci est mon contrôleur (app/controllers/static_controller.rb):

class StaticController < ApplicationController 
    def index 
    @team_members = TeamMember.all 
    end 
end 

Ceci est mon fichier graines (db/seeds.rb):

puts 'POPULATING TEAM MEMBERS' 
team_member = TeamMember.create! :name => 'Jones Namerson' 
team_member = TeamMember.create! :name => 'John Johnson' 
team_member = TeamMember.create! :name => 'Billy Bob' 
team_member = TeamMember.create! :name => 'Tom Thompson' 

C'est ma vue (app/views/static/index.html.erb):

<div class="team-member"> 
      <a href="#bioModal1" class="portfolio-link" data-toggle="modal"> 
      <img src="http://www.canyon-news.com/wp-content/uploads/2015/09/Pope-Francis-1.jpg" class="img-responsive img-circle"> 
      <h4><%= @team_members[0] %></h4> 
      <p class="text-muted">Co-Owner</p> 
      </a> 
     </div> 

Ce produit sortie comme:

<image>THE IMAGE</image> 

#<TeamMember:0x007fdd5e08c288> 
Co-Owner 

Donc, je suis en mesure d'accéder à l'objet dans la vue, mais mon objectif est d'accéder aux propriétés des objets. Je vais faire un changement à mon avis en ajoutant ce que je veux vraiment voir:

<div class="team-member"> 
      <a href="#bioModal1" class="portfolio-link" data-toggle="modal"> 
      <img src="http://www.canyon-news.com/wp-content/uploads/2015/09/Pope-Francis-1.jpg" class="img-responsive img-circle"> 
      <h4><%= @team_members[0].name %></h4> 
      <p class="text-muted">Co-Owner</p> 
      </a> 
     </div> 

mais ce produit:

<image>THE IMAGE</image> 

Co-Owner 

Donc, au fond de mon objet est disponible dans la vue, mais pas son Propriétés? Toute aide est grandement appréciée.

Répondre

1

Vous avez dans votre modèle:

attr_accessor :name 

Vous avez également une colonne name dans votre base de données. Le attr_accessor :name est essentiellement un raccourci pour ceci:

def name 
    @name 
end 
def name=(s) 
    @name = s 
end 

mais ActiveRecord fournit généralement des méthodes accesseurs et mutateurs pour les attributs de base de données et soutenu que vous avez fourni vos propres name et name= méthodes (via attr_accessor) qui ne connaissent rien au sujet la colonne name dans votre base de données.

Supprimez l'appel attr_accessor :name de votre classe TeamMember et votre problème devrait disparaître.

+0

Merci beaucoup! ça a marché. J'apprécie vraiment que tu m'expliques si bien. Merci de partager vos connaissances –

0

La ligne de votre classe TeamMember "attr_accessor: name" n'est pas nécessaire. Contrairement aux classes Ruby classiques, vous créez une sous-classe de ApplicationRecord, aussi, tant que vous avez votre migration TeamMember en place, Active Record s'en charge. Par exemple, si vous exécutez quelque chose comme "rails g modèle MyModel my_property: string" suivi de "rake db: migrate", Rails crée une classe MyModel qui étend l'enregistrement d'application et une table my_models avec un champ de nom. La classe MyModel obtient des accesseurs pour la propriété name gratuitement sans ajouter de code. Ainsi, ajouter à nouveau comme vous le faites peut créer un comportement attendu

Enfin, si vous voulez juste accéder au premier objet, vous pouvez remplacer @team_members = TeamMember.all par @team_member = TeamMember.first. Ceci est juste une amélioration.

Je vous suggère de le tester en utilisant "rails" c

TeamMember.all 
TeamMember.first 
TeamMember.first.name 
+0

Cela explique vraiment bien. merci beaucoup pour la perspicacité. Beaucoup apprécier –