Rails - 在表单中显示外键引用

Ric*_*cky 17 ruby forms views ruby-on-rails

我正在做两个模型的简单练习.体育和团队,定义为

rails g scaffold sport name:integer
rails g scaffold team name:integer fans:integer sport:references

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

问题是我的"运动"(即外键参考)显示如下 在此输入图像描述

所以它有奇怪的#<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 %>
Run Code Online (Sandbox Code Playgroud)

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

MrY*_*iji 35

您正在使用a text_field来引用现有对象,select使用Sports作为选项在这里更合适.

这是必须改变的地方:

<div class="field">
  <%= f.label :sport %><br />
  <%= f.text_field :sport %>
</div>
Run Code Online (Sandbox Code Playgroud)

至:

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

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>
Run Code Online (Sandbox Code Playgroud)

附加信息:如果要"预先选择"选项的选项,则必须将其作为帮助程序的第二个参数传递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]
Run Code Online (Sandbox Code Playgroud)

  • 我通过在team_controller的attr_accessors中添加`:sport_id`来实现它.这是正确的方法吗?此外,我尝试了第二种方法,它的工作原理,但我不明白为什么.什么是`Sport.scoped`呢?为什么只在`edit`方法中需要它?例如,`new`方法也共享相同的`_form.html.erb`视图,但我没有在那里调用`@sports = Sport.scoped`,但它仍然有效......感谢您的任何见解 (2认同)