我有一个帐户的简单自我加入模型。帐户可以包含单个父帐户和/或多个子帐户。
这是班级:
class Account < ActiveRecord::Base
has_many :children, class_name: "Account", foreign_key: "parent_id"
belongs_to :parent, class_name: "Account"
end
和迁移:
class CreateAccounts < ActiveRecord::Migration
def change
create_table :accounts do |t|
t.references :parent, index: true
t.string :name
t.string :category
t.timestamps null: false
end
end
end
在控制器上调用create方法时,出现以下错误:
Account(#70188397277860) expected, got String(#70188381177720)
它引用了控制器中create方法的第一行:
def create
@account = Account.new(account_params)
respond_to do |format|
if @account.save
format.html { redirect_to @account, notice: 'Account was successfully created.' }
format.json { render :show, status: :created, location: @account }
else
format.html { render :new }
format.json { render json: @account.errors, status: :unprocessable_entity }
end
end
end
由于帐户模型是自引用的,似乎Rails希望将帐户作为构建帐户的参数。
Rails ActiveRecord指南有一个有限的例子,我相信我已经密切关注,但我无法弄清楚我哪里出错了。
我尝试了各种排列外键类型,什么不是没有运气。任何指针都表示赞赏。
编辑:
这是由scaffold命令生成的表单,用于收集创建新帐户的信息。正如@SteveTurczyn在评论中所建议的那样,表单正在收集父字段而不是id的字符串。
<%= form_for(@account) do |f| %>
<% if @account.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@account.errors.count, "error") %> prohibited this account from being saved\
:</h2>
<ul>
<% @account.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :parent %><br>
<%= f.text_field :parent %>
</div>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :category %><br>
<%= f.text_field :category %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
EDIT2:
将parent
字段从text_field
更改为number_field
对结果没有影响。
传递给create方法的参数是相同的:
{"utf8"=>"✓",
"authenticity_token"=>"pq0sp162cA7Bmn7uw67F7gOvUVLj/S+xcasVibqysiF68vheVkATsf4pwKgPqH5nawjc0BnIj3qoot8JyIeVmg==",
"account"=>{"parent"=>"0",
"name"=>"Foo",
"category"=>"Bar"},
"commit"=>"Create Account"}
我对这应该如何运作感到有点困惑。
答案 0 :(得分:3)
您正在从表单提交parent
的ID,但您的关联期望parent
实际上是一个Account对象,而不是一个ID。
更改表单以提交parent_id
而不是parent
。