我有这样的事情:
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.我收到此错误:
未初始化的Constant OrderLine.
我需要我的accepts_nested_attributes_for调用才能意识到OrderLine被命名为Api :: V1 :: OrderLine.相反,幕后的rails只是在没有命名空间的情况下寻找OrderLine.我该如何解决这个问题?
解决方法
我很确定这里的解决方案只是让Rails知道完整的嵌套/命名空间类名.
来自docs:
:
class_name
Specify the class name of the association. Use it only
if that name can’t be inferred from the association name. So
belongs_to :author will by default be linked to the Author class,but
if the real class name is Person,you’ll have to specify it with this
option.
我经常看到,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