我有这样的事情:
module Api
module V1
class Order < ActiveRecord::Base
has_many :order_lines
accepts_nested_attributes_for :order_lines
end
end
module Api
module V1
class OrderLine < ActiveRecord::Base
belongs_to :order
end
end
在我的订单控制器中,我允许order_lines_attributes
参数:
params.permit(:name, :order_lines_attributes => [
:quantity, :price, :notes, :priority, :product_id, :option_id
])
然后我正在调用相应的路线,这将创建一个订单和所有嵌套的order_lines
。该方法成功创建了一个订单,但是一些rails魔术也试图创建嵌套的order_lines。我收到这个错误:
Uninitialized Constant OrderLine
。
我需要accepts_nested_attributes_for
调用才能意识到OrderLine
已命名为Api::V1::OrderLine
。相反,幕后的rails只查找没有名称空间的OrderLine
。我该如何解决这个问题?
答案 0 :(得分:1)
我很确定这里的解决方案只是让Rails知道完整的嵌套/命名空间类名。
来自docs:
:
class_name
指定关联的类名。仅使用它 如果无法从关联名称推断出该名称。所以 belongs_to:作者默认会链接到Author类,但是 如果真正的类名是Person,则必须用它来指定它 选项。
我经常看到,class_name选项将字符串(类名)作为参数,但我更喜欢使用常量,而不是字符串:
module Api
module V1
class Order < ActiveRecord::Base
has_many :order_lines,
class_name: Api::V1::OrderLine
end
end
end
module Api
module V1
class OrderLine < ActiveRecord::Base
belongs_to :order,
class_name: Api::V1::Order
end
end
end