La conversión de una cadena desde un formulario web para MongoMapper Modelo con el tipo de datos de matriz

StackOverflow https://stackoverflow.com/questions/3115898

  •  29-09-2019
  •  | 
  •  

Pregunta

Tengo un modelo MongoMapper y estoy tratando de convertir una cadena delimitada por comas en una matriz para ser almacenados.

El problema principal es que una cadena como tags = "first,second,third" no está siendo convertida en una matriz en la base de datos como ["first","second","third"]. En su lugar, va en tan ["first,second,third"].

Hay algunas otras cosas extrañas sucediendo así:   1) En preen_tags tengo que incluir el menos tags.nil? después de cada línea   2) en preen_tags, utilizando el tags depurador devuelve nil

Esta es mi modelo

class Template
  include MongoMapper::Document
  validate :validate_tags
  after_validation :preen_tags

  key :template_id,     ObjectId

  key :title,           String
  key :description,     String

  key :tags,            Array

  timestamps!

  def validate_tags
    errors.add_to_base "You Must Enter At Least 1 Tag." if tags.blank? 
  end


  def preen_tags
    #return if tags.nil?     #why doesn't this work??
    #only alphanumeric chars allowed, except hyphens and commas
    tags = tags[0] if tags.is_a?(Array)
    tags = tags.gsub(/[^0-9a-z\-\,]/i, '') unless tags.nil?
    #convert spaces to hyphens
    tags = tags.gsub(/\s/, '-') unless tags.nil?
    tags = tags.split(",") unless tags.nil?
  end

end
¿Fue útil?

Solución 2

Las apariencias como la conversión de la cadena en una matriz dentro del controlador antes de pasarlo a la modelo ha resuelto las cosas.

Otros consejos

es porque por las etiquetas por defecto es una matriz en MongoMapper como lo definen. Para que pueda probar tags.empty? en lugar de tags.nil?

En las etiquetas último caso se convierte en cero, puesto que intenta conseguir el primer elemento de etiquetas, pero hay nadie dentro. Sólo nula. Te etiqueta se vuelve nula.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top