Rails 4.2自连接模型 - Create方法返回错误

时间:2015-03-16 23:25:35

标签: ruby-on-rails ruby-on-rails-4

我有一个帐户的简单自我加入模型。帐户可以包含单个父帐户和/或多个子帐户。

这是班级:

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"}

我对这应该如何运作感到有点困惑。

1 个答案:

答案 0 :(得分:3)

您正在从表单提交parent的ID,但您的关联期望parent实际上是一个Account对象,而不是一个ID。

更改表单以提交parent_id而不是parent