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

时间:2015-10-14 19:11:38

标签: ruby-on-rails ruby-on-rails-4

我有这样的事情:

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。我该如何解决这个问题?

1 个答案:

答案 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