utilizando accepts_nested_attributes_for

Estoy tratando de usar accepts_nested_attributes_for como se describe en http://archives.ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes

Asumí que el segundo bloque de código en el tutorial está destinado a estar en el modelo, ya que luego dice que no se haga nada con el controlador. Sin embargo, el alcance parece señalar el código del controlador. He agregado el siguiente código al modelo para "escanear", que se supone que genera objetos secundarios "hostScan" antes de la creación de un escaneo

class Scan < ActiveRecord::Base
  attr_accessible :description, :endTime, :startTime, :raw
  has_many :hostScans, dependent: :destroy
  accepts_nested_attributes_for :hostScans, :allow_destroy => true

  before_create :interpret

  def interpret

    #parse the start and end times of the scan
self.startTime = raw.split(/(?<=timestamps\|\|\|scan_start\|)(.*?)(?=\|)/)[1]
self.endTime = raw.split(/(?<=timestamps\|\|\|scan_end\|)(.*?)(?=\|)/)[1]

#host scan bodies
    #host name
        #hostScans = raw.scan(/(?<=timestamps\|\|)(.*?)(?=\|host_start)/)
        #self.HostScans_attributes = [{}]
    #raw host text
        hostScanBodies = raw.split(/(?<=host_start\|)(.*?)(?=host_end)/)

        hostScanBodies.each do |body|
            self.HostScans_attributes += [{:raw => body}]
        end
  end
end

Sin embargo, cuando intento crear un escaneo, aparece el siguiente error:

NoMethodError in ScansController#create

undefined method `HostScans_attributes' for #<Scan:0x2441e68>

No parece saber acerca de HostScans_attributes.

preguntado el 22 de mayo de 12 a las 18:05

2 Respuestas

En primer lugar, intente usar under_score notación en lugar de camelCase - Rails espera eso por convención. Al usar atributos anidados, debe declarar un asistente de atributos para trabajar, en este caso: host_scans_attributes (o: hostScans_attributes si se declara como camelcase) así:

class Scan < ActiveRecord::Base
  attr_accessible :description, :end_time, :start_time, :raw, :host_scans_attributes
  has_many :host_scans, dependent: :destroy
  accepts_nested_attributes_for :host_scans, :allow_destroy => true

contestado el 22 de mayo de 12 a las 18:05

Gracias. Estoy seguro de que estoy más cerca, pero todavía no funciona. Mismo problema básico: método indefinido `host_scans_attributes' para # - bla, bla

y agregaste :host_scans_attributes de las personas acusadas injustamente llamadas attr_accessible lista, ¿verdad? - PinnyM

si. attr_accessible :description, :endTime, :startTime, :raw, :host_scans_attributes - bla, bla

¿Es posible que esto no se suponga que esté en el modelo? - bla, bla

Esto ciertamente pertenece al modelo, ¿puede volver a publicar el código revisado? Algo debe faltar en alguna parte... - PinnyM

Estas usando attr_accessible en su modelo, que es básicamente una lista blanca de todos los atributos que se pueden asignar en masa. Por lo tanto, debe agregar el attributes ahí también...

contestado el 22 de mayo de 12 a las 18:05

Eso sería attr_accessible :description, :endTime, :startTime, :raw, :host_scans_attributes, ¿verdad? - bla, bla

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.