Rails activeadmin将数据保存在关联表中

时间:2017-06-02 12:16:53

标签: ruby-on-rails activeadmin has-many

我有一个产品表,产品可以是内部或外部,也可以是两者。所以我创建了另一个表来保存Products位置。现在,当管理员添加产品时,我已经提供了选择产品所在位置的选项,但是当它被发布时,代码表明由于验证,该字段不能为空。我不确定我错过了什么或方法是错误的。

产品型号:

class ProductLocation < ApplicationRecord

  enum locations: [:exterior, :interior]

  validates :location, presence: true
  validates :product_id, presence: true

  belongs_to :product
end

产品位置模型:

ActiveAdmin.register Product do

  permit_params :name, product_locations_attributes: {}

  actions :all, except: [:show, :destroy]

  filter :name

  index do        
    column 'Product Name',  :name
    actions
  end

  form do |f|
    f.semantic_errors *f.object.errors.keys

    f.inputs "Products" do
      f.input :name          
    end

    f.has_many :product_locations do |location|
      location.inputs "Locations" do
        location.input :location, as: :select, multiple: true, collection: ProductLocation.locations.keys
      end
    end

    f.actions
  end

  controller do
    def scoped_collection
      Product.where(user_id: nil)
    end
  end

end

产品的ActiveAdmin文件:

Parameters: {"utf8"=>"✓", "product"=>{"name"=>"Test Product", "product_locations_attributes"=>{"0"=>{"location"=>["0", "1"]}}}, "commit"=>"Create Product"}

我得到了一个多选区域,其中包含&#34;内部&#34;和&#34;外部&#34;选择,但它说当我选择位置并提交表格

时,该字段不能为空

我点击保存点击的错误是:

  

位置不能为空

发布的参数是:

angular.module('MyApp', []).controller('myctrl',function($scope,$http){

var vm = this;    
vm.mode = 'fun';

$http.get("https://www.w3schools.com/angular/customers.php")
.success(function(response) {
    $scope.data= response.records;
    $scope.message  = 'ok'
});

vm.setDescription = function(age){
    if(age <= 10){
        vm.description = 'child';
    } else if(age > 10 && age < 18){
        vm.description = 'teen';
    } else if(age >= 18){
         vm.description = 'adultt';
    }
}
});

1 个答案:

答案 0 :(得分:2)

首先,许可属性应为,

<强> product_locations_attributes: [:id, :location]

然后,以您的形式

location.input :location, as: :select, multiple: true, collection: ProductLocation.locations.keys

由于ProductLocation.locations是一个数组, array.keys是一种无效的方法。

所以,直接使用

location.input :location, as: :select, multiple: true, collection: ProductLocation.locations.map { |n| [n,n] }

要存储多个值的数组,请将serialize字段作为数组

class ProductLocation < ApplicationRecord

  enum locations: [:exterior, :interior]

  serialize :location, Array

  validates :location, presence: true
  validates :product_id, presence: true

  belongs_to :product
end

注意:为了获得序列化工作,您需要将该位置dataType作为text。如果不是text运行迁移以更改为text数据类型

文本字段的原因: Rails会在存储到数据库中时将所有这些对象转换为纯文本