Rails从模型collection_select中保存0而不是字符串

时间:2012-04-21 15:08:58

标签: ruby-on-rails ruby-on-rails-3

我一直在尝试创建一个基本的rails应用程序。我使用generate来创建一个基本的脚手架,我在玩家和团队之间设置了belongs_to关系,因此玩家属于团队和团队拥有很多玩家。

我的表单视图如下所示

<%= 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 :Playerone %><br />
    <%= f.collection_select :Playerone, Player.all, :firstname, :firstname %>
  </div>

  <div class="field">
    <%= f.label :Playertwo %><br />
    <%= f.collection_select :Playertwo, Player.all, :firstname, :firstname %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

当我尝试创建一个新团队时,我得到了下拉列表,因为我希望他们使用玩家的名字来选择,但是当它被保存时,它会将0保存为记录。

上市团队

Playerone Playertwo
0 0显示编辑销毁

新团队

最初我有这样的集合选择 <%= f.collection_select :Playertwo, Player.all, :id, :firstname %> 这会插入ID,但我想要插入文本。

我已经查看了大量的文档,并且在我还在学习的时候已经取得了成功。

感谢您的帮助:)

1 个答案:

答案 0 :(得分:3)

然后这取决于您的迁移。如果在数据库中创建了整数字段,则保存字符串将保存为0。

您可以(a)将迁移更改为使用字符串而不是整数。

你可以(b)使用id,并通过查找名称来显示名称。

f.collection_select :Playertwo, Player.all, :id, :firstname

您可以从团队belongs_to playerone和playertwo获取名称,

class Team
  belongs_to :playerone, :class_name => "Player"
  belongs_to :playertwo, :class_name => "Player"
end

<%= team.playerone.firstname %>

或者您可以将名字委托给玩家。

class Team
  belongs_to :playerone, :class_name => "Player"
  belongs_to :playertwo, :class_name => "Player"
  delegate :firstname, :to => :playerone, :prefix => true, :allow_nil => true
  delegate :firstname, :to => :playertwo, :prefix => true, :allow_nil => true
end

<%= team.playerone_firstname %>

或者您可以(c)使用belongs_to,它使用整数。请查阅文档 http://guides.rubyonrails.org/getting_started.html