所以我是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
现在文章引用了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 %>
现在我的视图如何返回索引和显示视图中的名称而不是id?
<td><%=h article.topic_id %></td>
<td><%=h article.title %></td>
<td><%=h article.author_id %></td>
<td><%=h article.status %></td>
任何帮助都会感激不尽。
答案 0 :(得分:5)
此:
@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
等。
答案 1 :(得分:3)
这种方法不是Ruby on Rails的做法,你将控制器逻辑混合到View中。你的控制器应该有@authors = Author.find(:all, :order => 'name')
等,而不是你的视图。
同样,在您的控制器中,您将拥有:
@author = Author.find(@article.author_id);
在您的视图中,您将显示作者姓名:
<%=h @author.name %>