【发布时间】:2017-10-03 22:19:03
【问题描述】:
我有以下型号:
class Order < ApplicationRecord
class Bill < Order
class Preorder < Order
class Detail < ApplicationRecord
class Metric < Detail
class Unit < Detail
模型Order 接受Detail 的嵌套属性,Order 可以是Bill 或Preorder,Detail 可以是Unit 或Metric
我正在使用 jsonb_accessor gem 为 Unit 和 Metric 创建附加属性
class Metric < Detail
jsonb_accessor :data,
height: :decimal,
width: :decimal
end
class Unit < Detail
jsonb_accessor :data,
quantity: :decimal
end
在我看来,我正在使用 Cocoon gem 为 Unit 或 Metric 生成字段
<%= link_to_add_association(I18n.t('activerecord.models.metric.add'), f, :details, data: {association_insertion_node: '#details', association_insertion_method: :append}, :class => "btn btn-success",
wrap_object: Proc.new { |detail| detail.type = "Metric"; detail = Metric.new }) %>
<%= link_to_add_association(I18n.t('activerecord.models.unit.add'), f, :details, data: {association_insertion_node: '#details', association_insertion_method: :append}, :class => "btn btn-success",
wrap_object: Proc.new { |detail| detail.type = "Unit"; detail = Unit.new }) %>
在我的控制器中,我有这个方法来验证参数
def order_params(type)
if type=="Bill"
params.require(:bill).permit(:client_id, :type, :delivered, :paid, :total_paid, details_attributes: [:id, :total_price, :type, :data, :service_id, :_destroy])
elsif type=="Preorder"
params.require(:preorder).permit(:client_id, :type, :delivered, details_attributes: [:id, :total_price, :type, :data, :service_id, :_destroy])
end
end
表单工作得非常完美,它存储了我在表单中输入的所有数据,除了:width, :height, :quantity,当我把它们放在参数中时,它给出一个错误,说这些参数不属于细节模型,当我把@ 987654338@ 而不是,该列仍然是空的。
我正在考虑,直接为父模型 Detail 使用列,而不是使用 jsonb_accessor,或者为每个 Metric 和 Unit 模型使用单独的视图和控制器,但我将这些解决方案作为最后的手段,因为我想保留代码更干,尽可能少用列
【问题讨论】:
标签: ruby-on-rails ruby strong-parameters jsonb cocoon-gem