rails嵌套资源未知属性错误

时间:2014-05-23 01:50:19

标签: ruby-on-rails ruby nested

我有一个Contract和一个Task_Order模型。我不断获得unknown attribute error for contract_id每个Contract has many Task Orders。我已经阅读了其他嵌套模型未知属性错误问题,但他们还没有能够帮助我。请记住,我是Rails的新手,非常感谢我能得到的任何帮助。我正在使用 Rails 4.0

合同模型:

has_many :task_orders

合约架构:

create_table "contracts", force: true do |t|
   t.string   "contractId"
   t.string   "contractName"
 end

任务订单模型:

belongs_to :contracts

任务订单架构:

create_table "task_orders", force: true do |t|
t.string   "contract_Id"
t.string   "task_orderId"
t.string   "task_orderName"
end

当我点击Show Contract时,我收到错误:

unknown attribute: contract_id

这是突出显示的行:

<%= form_for([@contract, @contract.task_orders.new]) do |f| %>

我可以说Rails正在尝试打印contract_id,这不在我的Contract模型中......所以如何让它打印出来contractId代替在我的Contract模型中?

谢谢!

3 个答案:

答案 0 :(得分:2)

任务订单模型应具有此行belongs_to contract

belongs_to关联应声明为相应模型的单数

task_orders 表中也应该有 contract_id 列。

下图解释了Rails中belongs_to的默认行为

enter image description here

答案 1 :(得分:1)

你需要注意的是Rails的foreign_key(以及一般的关系数据库):


外键

滑轨&#39;标准foreign_key是使用snake_casecontract_id),但是,您可以使用非常规foreign_keys,如下所示:

#app/models/order.rb
belongs_to :contract, foreign_key: "contract_Id"

#schema SHOULD be:
create_table "orders", force: true do |t|
   t.integer "contract_id" #-> should
   t.string "contract_Id" #-> your current
end

主键

create_table "contracts", force: true do |t|
   t.string   "contractId" #-> don't need

   t.string   "contractName" #-> your current
   t.string "name" #-> should be
 end

您的primary_key几乎总是id列。您应该从contractId db!

中删除contracts

Task Orders

您需要这样做:

#app/models/order.rb
belongs_to :contracts
has_many :task_orders

然后您需要app/models/task_order.rb

处的其他模型

<强>表格

您的表单显示错误。这是因为您尝试在视图中创建ActiveRecord。使用标准accepts_nested_attributes_for方法通过表单传递嵌套模型数据会更好:

#app/models/contract.rb
def new
    @contract = Contract.new
    @contract.task_orders.build
end

#app/views/contracts/new.html.erb
<%= form_for @contract do |f| %>

答案 2 :(得分:0)

首先,对singular names

使用 belongs_to
Class TaskOrder < ActiveRecord::Base

belongs_to :contract

end

其次,请尝试将contract_Id表格中的task_orders更改为contract_id

默认情况下,

Rails会查找model_name_id(in your case contract_id) foreign key,除非您的模型中定义了custom foreign keys

最后,为data type integer指定default foreign key。在您的情况下,应为t.integer contract_id

但是,如果您希望contract_Idforeign key,则应在custom foreign key模型本身中将其定义为Contract

Class Contract < ActiveRecord:Base

has_many :task_orders,:foreign_key => "contract_Id"

end