Я использую виноград для разработки API для рельсов, который работает довольно хорошо для всей модели, кроме формы динамической модели. У нас есть следующие модели..
1- product_type
2- product_fields
3- products
product_type
имеет has_many
связь как с product_fields
, так и с products
моделями. При создании нового product_type
мы можем создать различные атрибуты поля для этого product
. Каждый product
имеет разные атрибуты, но мы храним их в отдельной таблице "products". Я хочу динамически генерировать API всякий раз, когда добавляется product_type
.
Я пробовал, как показано ниже, но продолжаю получать ошибки при публикации записи. Цените любое предложение.
require 'grape'
module API
module V1
class Products < Grape::API
include API::V1::Defaults
@product_type=ProductType.all
@product_type.each do |producttype|
resource :"#{producttype.name}" do
desc "Create a new product for #{producttype.name}"
params do
requires :product_type_id , type: "Integer", desc: "product type Id"
producttype.productfields.each do |field|
if field.is_required?
requires :"#{field.field_name}" , type: "#{field.filed_type}", desc: "#{field.field_name}"
else
optional :"#{field.field_name}", type: "#{field.filed_type}", desc: "#{field.field_name}"
end
end
end
post do
Products.create!({
product_type_id:params[:product_type_id],
........
........
........
})
end
end
end
end
end
end
Ошибка:
NoMethodError - undefined method `collect' for nil:NilClass:
grape-swagger (0.10.1) lib/grape-swagger.rb:70:in `block in combine_namespace_routes'
grape-swagger (0.10.1) lib/grape-swagger.rb:65:in `combine_namespace_routes'
grape-swagger (0.10.1) lib/grape-swagger.rb:39:in `add_swagger_documentation'
app/controllers/api/v1/base.rb:10:in `<class:Base>'
app/controllers/api/v1/base.rb:6:in `<module:V1>'
app/controllers/api/v1/base.rb:5:in `<module:API>'
app/controllers/api/v1/base.rb:4:in `<top (required)>'