ruby-on-rails – Rails 4 API – 接受命名空间模型的嵌套属性

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Rails 4 API – 接受命名空间模型的嵌套属性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有这样的事情:
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

猜你在找的Ruby相关文章