这是我的架构文件
ActiveRecord::Schema.define(version: 20150917104809) do
create_table "customers", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "name"
end
create_table "orders", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.datetime "order_date"
t.integer "customers_id"
end
end
以下是模型
class Customer < ActiveRecord::Base
has_many :orders, dependent: :destroy
end
class Order < ActiveRecord::Base
belongs_to :customer
end
关联的迁移文件是
class AddForeignKeyToOrders < ActiveRecord::Migration
def change
add_reference :orders, :customers
end
end
遵循link
中的简单rails assoc示例我使用命令
创建了客户记录Customer.create(name: 'Someone')
现在尝试创建订单
@order = @customer.orders.create(order_date: Time.now)
使用NilClass
收到错误NoMethodError: undefined method `orders' for nil:NilClass
可能是另一双帮助告诉我我做错了什么的眼睛。
答案 0 :(得分:3)
您需要将create
的返回值指定为@customer
:
@customer = Customer.create(name: 'Someone')
@order = @customer.orders.create(order_date: Time.now)
看起来您的架构中也有拼写错误。它应该是:
t.integer "customer_id"
编辑:您的迁移文件不正确。它应该是:
class AddForeignKeyToOrders < ActiveRecord::Migration
def change
add_reference :orders, :customer
end
end
答案 1 :(得分:1)
要添加到@ghr
的答案,您的错误就是:for nil:NilClass
这意味着您尝试在不存在的对象上调用方法。 Ruby实际上将nil类分配给NilClass
对象,因此除非您花时间与它们一起使用,否则它的错误不容易被识别。
-
您必须将Customer.create...
分配给variable
,否则Rails不会存储您要使用的数据:
@customer = Customer.create(name: "Someone")
@customer.orders.create
作为备注,您order_date
模型中不需要Order
- created_at
会处理此问题。如果您从表格中删除了order_date
列,则可以调用以下内容:
#app/models/order.rb
class Order < ActiveRecord::Base
belongs_to :customer
alias_attribute :date, :created_at
end
@customer.orders.first.date