Показывать выбранное имя вместо идентификатора в представлении индекса рельсов - PullRequest
4 голосов
/ 22 февраля 2010

Так что я новичок в рельсах, и я стараюсь изо всех сил, как я могу следовать учебникам, которые изобилуют в Интернете. Итак, у меня есть три стола.

  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

Теперь статьи ссылаются на author_id и 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

Теперь для new.html.erb и edit.html.erb я узнал, как использовать collection_select для получения записей из тем и авторов.

<% form_for(@article) do |f| %>
  <%= f.error_messages %>

  <p>
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </p>
  <p>
    <%= f.label :author_id %><br />
    <%= @authors =Author.find(:all, :order => 'name')
    collection_select(:article,:author_id, @authors,:id,:name) %>
  </p>
  <p>
    <%= f.label :topic_id %><br />
    <%= @topics = Topic.find(:all, :order => 'category') 
        collection_select(:article,:topic_id, @topics,:id,:category) %>
  </p>
  <p>
    <%= f.label :content %><br />
    <%= f.text_area :content %>
  </p>
  <p>
    <%= f.label :status %><br />
    <%= f.text_field :status %>
  </p>
  <p>
    <%= f.submit 'Create' %>
  </p>
<% end %>

<%= link_to 'Back', articles_path %>

Теперь, на мой взгляд, как мне вернуть имена в индексе и показать представление, а не идентификатор?

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

Любая помощь будет благодарна.

Ответы [ 2 ]

5 голосов
/ 22 февраля 2010

Это:

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

и это:

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

должен быть в вашем контроллере в соответствующих действиях (new и edit).

Ваши модели должны выглядеть так:

# Article model
belongs_to :author
belogns_to :topic

# Author model
has_many :articles

# Topic model
has_many :articles

С этим вы можете делать то, что вы хотите следующим образом:

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

И любые другие варианты: @article.topic.category, @author.articles.first.topic и т. Д.

3 голосов
/ 22 февраля 2010

Этот подход не совсем в стиле Ruby on Rails, вы смешиваете логику контроллера в вашем View. Вы должны иметь @authors = Author.find(:all, :order => 'name') и т. Д. В контроллере, а не в View.

Аналогично, в вашем контроллере вы должны иметь:

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

И в вашем представлении вы бы указали имя автора:

<%=h @author.name %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...