我有一个产品表,产品可以是内部或外部,也可以是两者。所以我创建了另一个表来保存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';
}
}
});
答案 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会在存储到数据库中时将所有这些对象转换为纯文本