使用params建模new,用nil初始化所有属性

时间:2017-05-03 17:02:19

标签: ruby-on-rails ruby activerecord

我使用一些属性值

初始化一个ItemMedida对象
item_medida = SpfPedido::ItemMedida.new(cantidad: 3, ancho: 800, alto: 600)

但是当我调用它时,所有属性都是nil

item_medida #=> <SpfPedido::ItemMedida id: nil, cantidad: nil, ancho: nil, alto: nil)

cantidad,alto,ancho在DB中定义好。

为什么我会出现这种行为?我希望我的对象具有正确的属性。 有提示吗?

模型

# encoding: utf-8
module SpfPedido
  class ItemMedida < ApplicationRecord
    belongs_to :item, class_name: "SpfPedido::Item", inverse_of: :item_medidas
    belongs_to :medida
    has_many :pulidos, class_name: "SpfPedido::Pulido"
    has_many :agujeros, class_name: "SpfPedido::Agujero"
    has_many :entrantes, class_name: "SpfPedido::Entrante"
    has_many :solapes, class_name: "SpfPedido::Solape"
    has_one :forma
    has_and_belongs_to_many :adjuntos
    has_many :adjunto_medidas
    has_many :adjuntos, through: :adjunto_medidas
    has_many :curvaturas
    has_many :bites
    has_many :tango_bodies, as: :linea_item, class_name: 'SpfTango::TangoBody'
    # Polymorphic
    has_one :pre_facturacion, as: :linea_item
    has_one :facturacion, as: :linea_item
    has_one :expedicion, as: :linea_item
    has_many :trazabilidads, through: :item
    #############
    has_and_belongs_to_many :orden_corte_mesas # creo que no va mas
    has_many :medidas_orden_corte_mesas
    has_many :comprobante_medidas
    has_many :comprobante_temps, through: :comprobante_medidas
    has_many :rotura_vidrios
    has_many :elementos, through: :item
    has_many :proceso_de_elementos, through: :item
    has_many :componentes, through: :item
    has_many :proceso_de_componentes, through: :item
    delegate :pedido, to: :item
    before_update :cambio_de_medidas?, :if => proc { ancho_changed? || alto_changed? } 
    validates :cantidad, numericality: { only_integer: true, greater_than: 0, less_than: 1000, message: "Debe introducirse un valor entero entre 0 y 999" } 
    validates :ancho, numericality: { only_integer: true, greater_than: 0, less_than: 10000, message: "Debe introducirse un valor entero entre 0 y 9999" }
    validates :alto, numericality: { only_integer: true, greater_than: 0, less_than: 10000, message: "Debe introducirse un valor entero entre 0 y 9999"  }
    accepts_nested_attributes_for :medida
    accepts_nested_attributes_for :solapes
    accepts_nested_attributes_for :pulidos
    accepts_nested_attributes_for :bites
    accepts_nested_attributes_for :curvaturas
    attr_accessor :config_pulido_id
    attr_accessor :objeto_pulible_type
    attr_accessor :objeto_pulible_id
    attr_accessor :accion
    attr_accessor :cambio_de_medidas
    attr_accessor :comentario
    attr_accessor :total_de_complementos # es la suma de complementos del item
    attr_accessor :precio_unitario_con_complementos # total_linea + total_complementos / superficie
  end
end

我希望item_medida为<SpfPedido::ItemMedida id: nil, cantidad: 3, ancho: 600, alto: 800>

编辑:

另一项测试。

item_medida = SpfPedido::ItemMedida.new(cantidad: 3, ancho: 800, alto: 600)
item_medida #=> <SpfPedido::ItemMedida id: nil, cantidad: nil, ancho: nil, alto: nil>
item_medida.valid? #=> false
item_medida = SpfPedido::ItemMedida.new(cantidad: 3, ancho: 800, alto: 600)
item_medida #=> <SpfPedido::ItemMedida id: nil, cantidad: 3, ancho: 800, alto: 600>

调用.valid?方法后,item_medida对象被正确初始化。

1 个答案:

答案 0 :(得分:0)

我发现了异常现象。这是我的错。我的模型包含一个模块,其中有一个错误的method_missing重定义,而不使用super,如下所示:

def method_missing(m, *args, &block)
  if condition
    #do something
  end
end

所以我用

纠正了它
def method_missing(m, *args, &block)
  if condition
    #do something
  else
    super(m, *args, &block)
  end
end

感谢大家的帮助!