Неисправный массив Rails

#ruby-on-rails #model #attributes #controller

#ruby-on-rails #Модель #атрибуты #контроллер

Вопрос:

Я сгенерировал атрибут массива, используя

 rails gen ... AddTaglistToPictures taglist:array
  

В моей функции create в моем контроллере Pictures, в if @picture.save, у меня есть

 tagList =[]
tags = @picture.tags
tags.each do |tag|
  tagList  = [tag.tagcontent]
end
@picture.taglist = tagList
@picture.save
  

В приведенном выше примере у меня есть тег как модель, созданный с помощью nested_form gem (мне нужна модель, а также список)

Когда я создаю группу тегов, я получаю список, подобный этому

 "---n- tablen- kevinn- tablen- kevinn"
  

это правильные теги, но они на самом деле не пригодны для использования (потому что попытка извлечь элементы похожа на то, что tag [0] равен ‘-‘, tag [4] равен ‘n’.) Как мне создать этот атрибут, чтобы он правильно форматировал массив

Ответ №1:

Если вы хотите сохранить массив в столбце, вам нужно использовать ключевое слово serialize

 class Photo
   serialize :tags, Array
end
  

затем добавьте столбец тегов в класс Photo типа string (или text, если их будет много)

Ответ №2:

"---n- tablen- kevinn- tablen- kevinn" является сериализованным массивом yaml.

Попробуйте загрузить его с помощью YAML.load("---n- tablen- kevinn- tablen- kevinn") . Это должно дать вам правильный массив ruby.

Комментарии:

1. ваш ответ вроде как работает, он не займет просто pic.taglist = YAML.load (pic.taglist). как мне изменить фактический массив, чтобы я мог передать его как обычный массив через AJAX-вызов в javascript

2. Имеет ли смысл этот комментарий (я имею в виду, что я не могу просто выполнить YAML.load (pic.taglist) в javascript)

3. Вы можете преобразовать массив в json, если хотите передать его в javascript.

4. Как я могу это сделать, я попробовал что-то простое, например, pic.taglist.to_json, которое выдает мне «»—\n- table \n- kevin \n- таблица \n- кевин \ n»» , я также … неважно, как мне это сделать. извините, если это звучит немного глупо, но я не знаю, как вывести список тегов в формате json (в моем изображении json-массива, который был создан автоматически)

5. О, да, сначала вам пришлось бы преобразовать его из сериализованного объекта YAML, что сделало бы код немного более запутанным ( YAML.load(pic.taglist).to_json ).

Ответ №3:

Честно говоря, вы сказали ему использовать массив, поэтому он собирается сериализовать фактический массив.

IMO это должно быть нормальной ассоциацией:

 class Photo
    has_many :tags
end
  

Или вы могли бы просто использовать acts_as_taggable_on_steroids или любой из плагинов для тегов.