17

我正在用两个模型做一个简单的练习。运动和团队,定义为

rails g 脚手架运动名称:整数
rails g 脚手架团队名称:整数粉丝:整数运动:参考

(注意:我使用脚手架的原因是快速原型设计,因此我可以学习/实验我还不熟悉的部分)

问题是我的“运动”(即外键引用)显示如下 在此处输入图像描述

所以它有那个奇怪的#<blahl blah>符号......

<%= form_for(@team) do |f| %>
  <% if @team.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@team.errors.count, "error") %> prohibited this team from being saved:</h2>

      <ul>
      <% @team.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
     <div class="field">
    <%= f.label :fans %><br />
    <%= f.number_field :fans %>
  </div>
  <div class="field">
    <%= f.label :sport %><br />
    <%= f.text_field :sport %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

我尝试将一行更改为,@team.sport.name但会导致错误undefined method 'Ice Hockey' for #<Team:0x3e7e040>...任何想法如何从这里正确显示名称?

4

1 回答 1

36

您正在使用 atext_field来引用现有对象, aselect与 Sports 作为选项在这里会更合适。

这是必须更改的地方:

<div class="field">
  <%= f.label :sport %><br />
  <%= f.text_field :sport %>
</div>

至:

<div class="field">
  <%= f.label :sport %><br />
  <%= f.select :sport_id, options_for_select(Sport.all.map{|s|[s.name, s.id]}) %>
</div>

f.select在 HTML 中生成一个选择框,这些选项将包含您数据库中的所有运动。

关于它的一些文档

一种更简洁的方法是在您的控制器中设置一个变量@sports,然后在您的视图中调用它:

# in controller
def edit
  @sports = Sport.scoped
  #...

# in edit view
<div class="field">
  <%= f.label :sport %><br />
  <%= f.select :sport_id, options_for_select(@sports.map{ |s| [s.name, s.id] }) %>
</div>

附加信息:如果你想为选择“预选”一个选项,你必须将它作为options_for_select助手的第二个参数传递:

options_for_select(@sports.map{ |s| [s.name, s.id] }, params[:sport_id])
# this will select by default the option that matches the value of params[:sport_id]
于 2013-05-31T02:25:00.983 回答