Rails и Mongoid :: Преобразование строк в массивы - PullRequest
2 голосов
/ 14 октября 2011

Я собираю теги в красивый виджет пользовательского интерфейса JavaScript.Затем он принимает все теги и передает их на сервер в виде тегов tag1, tag2, tag3 и т. Д. В один вход text_field.Сервер получает их:

params[:event][:tags] = params[:event][:tags].split(',') # convert to array
@event = Event.find(params[:id])

Есть ли лучший способ преобразовать строку в массив?Это похоже на запах кода.Я должен поместить это как в обновление, так и в новые действия контроллера.

Ответы [ 3 ]

2 голосов
/ 14 октября 2011

вы могли бы сделать это в модели:

У меня редко бывает опыт работы на монгоиде.Следующее будет работать в активной записи (единственное отличие - часть write_attribute)

class Event
  def tags=(value_from_form)
    value_from_form = "" unless value_from_form.respond_to(:split)

    write_attribute(:tags, value_from_form.split(','))
  end
end

С другой стороны, для согласованности вы можете сделать следующее:

class Event
  def tags_for_form=(value_from_form)
    value_from_form = "" unless value_from_form.respond_to(:split)

    self.tags = value_from_form.split(',')
  end

  def tags_for_form
    self.tags
  end

  # no need to change tags and tags= methods. and tags and tags= methods would return an array and accept an array respectively
end

В первом случае (непосредственно перезаписывая метод tags=) tags= принимает строку, но tags возвращает массив.

Во втором случае tags_for_form= и tags_for_form принимаети возвращает строку, в то время как tags= и tags принимает и возвращает массив.

1 голос
/ 20 марта 2012

Я просто создаю другой атрибут модели, который обертывает атрибут тегов следующим образом:

class Event
  def tags_list=(tags_string)
    self.tags = tags_string.split(',').map(&:strip)
  end

  def tags_list
    self.tags.join(',')
  end

end

В вашей форме просто прочитайте / запишите атрибут tags_list, который всегда будет принимать, или возвращайте предварительно отформатированную строку. (Часть .map(:strip) просто удаляет пробелы на концах, если теги вводятся с пробелами: tag1, tag2, tag3.

0 голосов
/ 01 августа 2012

В ответе Питера Вонга отсутствует «?»из метода response_to ();

  class Event
    def tags=(value_from_form)
      value_from_form = "" unless value_from_form.respond_to?(:split)

      write_attribute(:tags, value_from_form.split(','))
    end
  end
...