4

我见过多个类似的问题,但没有一个对我有用。

我有一个团队模型:

class Team < ActiveRecord::Base
  has_one :p1, :class_name => "Player", :foreign_key => 'player_id', :validate => true
  has_one :p2, :class_name => "Player", :foreign_key => 'player_id', :validate => true
end

在我团队的 _form.html.erb 中,我将球员称为

  <%= f.collection_select :p1, Player.all, :id, :name %>

但是,在提交表单时,我看到了错误:

Player(#28401456) expected, got String(#14111904)

Application Trace | Framework Trace | Full Trace
app/controllers/teams_controller.rb:47:in `new'

Parameters:
{"utf8"=>"✓",
 "authenticity_token"=>"GSIcEvROFnvgGWT4HvE2VNqRw4NxU1J8iAw/WhZeRLk=",
 "team"=>{"p1"=>"1"},
 "commit"=>"Create Team"}

这是行的代码

def create
  @team = Team.new(params[:team])
  .....
end

请问有什么想法吗?

4

3 回答 3

6

最后,这有效:

 <%= f.collection_select :p1_id, Player.all, :id, :name %>

神奇之处在于:我的迁移有 t.references p1 并在数据库中创建了 p1_id 列。提交表单时,rails 会在以下位置填写参考的 id:

def create
  @team = Team.new(params[:team])
  .....
end
于 2013-03-27T21:59:27.600 回答
0

试试这个:

<%= f.collection_select :player_id, Player.all, :id, :name %>
于 2013-03-27T20:06:18.190 回答
0

我可能是错的,但我的猜测是,而不是

<%= f.collection_select :p1, Player.all, :id, :name %>

你需要

<%= f.collection_select :p1, :team_id, Player.all, :id, :name %>

http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-collection_select

于 2013-03-27T20:06:39.530 回答