2010-02-22 10 views
4

Je suis donc un novice en matière de rails et j'essaie de mon mieux de suivre les tutoriels qui abondent sur le Web. J'ai donc trois tables.Afficher le nom sélectionné à la place de l'ID dans la vue d'index des rails

class CreateAuthors < 
    ActiveRecord::Migration def self.up 
     create_table :authors do |t| 
      t.string :name 
      t.string :email 

      t.timestamps 
     end 

     end 

     def self.down 
     drop_table :authors end end 


class CreateTopics < 
ActiveRecord::Migration def self.up 
    create_table :topics do |t| 
     t.string :category 

     t.timestamps 
    end end 

    def self.down 
    drop_table :topics 
    end 
end 

Maintenant, les articles font référence au author_id et topic_id

class CreateArticles < 
ActiveRecord::Migration def self.up 
    create_table :articles do |t| 
     t.string :title 
     t.integer :author_id 
     t.integer :topic_id 
     t.text :content 
     t.integer :status 

     t.timestamps 
    end end 

    def self.down 
    drop_table :articles end end 

Maintenant, pour la new.html.erb et edit.html.erb j'ai découvert comment utiliser collection_select pour obtenir les enregistrements des sujets et les auteurs. Maintenant pour mon affichage, comment puis-je retourner les noms dans l'index et afficher la vue et pas l'ID?

<td><%=h article.topic_id %></td> 
    <td><%=h article.title %></td> 
    <td><%=h article.author_id %></td> 
    <td><%=h article.status %></td> 

Toute aide serait reconnaissante.

Répondre

3

Cette approche n'est pas tout à fait la façon de faire Ruby on Rails, vous mélangez la logique du contrôleur dans votre View. Vous devriez avoir @authors = Author.find(:all, :order => 'name') etc. dans votre contrôleur, pas votre vue.

De même, dans votre contrôleur, vous auriez:

@author = Author.find(@article.author_id); 

Et à votre avis vous montrer le nom de l'auteur:

<%=h @author.name %> 
+0

Cela ressemble vraiment à la bonne approche pour faire les choses. Fonctionne parfaitement. –

5

Ce:

@authors =Author.find(:all, :order => 'name') 

et ceci:

@topics = Topic.find(:all, :order => 'category') 

doit être dans votre contrôleur dans les actions correspondantes (new et edit).

Vos modèles devraient ressembler à ceci:

# Article model 
belongs_to :author 
belogns_to :topic 

# Author model 
has_many :articles 

# Topic model 
has_many :articles 

Avec cela, vous pouvez faire ce que vous voulez ainsi:

<td><%=h @article.title %></td> 
<td><%=h @article.author.name %></td> 
<td><%=h @article.status %></td> 

Et toute autre modification: @article.topic.category, @author.articles.first.topic etc.

+0

Une meilleure explication. Enlever ma réponse. Typo dans votre modèle d'article si. – ghoppe

+0

@ghoppe vôtre réponse était également bonne. Spécialement quand il accédera plusieurs fois à 'article.author.name', il vaudrait mieux charger l'auteur dans' @ author' et l'utiliser. – klew

+0

J'ai pu l'obtenir pour montrer la vue et j'ai trouvé la faute de frappe aussi. Génial et merci encore les gars. –

Questions connexes