Ruby on Rails - выбранные значения не работают должным образом в нескольких объектах: true (simple_form) - PullRequest
0 голосов
/ 06 января 2019

В моей форме у меня есть f.select с multiple: true, но select не работает, если он не в жестком коде in.

Это моя форма в new виде:

= f.select :os, get_uniq_objects(:os), {}, {multiple: true }

Мой помощник

def get_uniq_objects(obj)
  somethings.pluck(obj).uniq
end

Мой контроллер

def campaign_params
      params.require(:something).permit(os:[])
end

В представлении new при выборе ОС результат будет сохранен как ['Linux', 'Windows'], поэтому в моем представлении edit я делаю, как показано ниже , но ничего не выбирается:

= f.select :os, options_for_select(get_uniq_objects(:os), @something.os), {}, { multiple: true}

НО если я жестко закодировал их, как показано ниже, все работает нормально. Я даже дважды проверил, что такое @something.os, добавив его в мое представление, и оно точно так же, как код в жестком коде.

= f.select :os, options_for_select(get_uniq_objects(:os), ['Linux', 'Windows']), {}, { multiple: true}

Я не уверен, что я здесь сделал неправильно. Любая помощь приветствуется и спасибо заранее!

1 Ответ

0 голосов
/ 07 января 2019

При более внимательном рассмотрении значения, полученного f.select, мне удалось решить эту проблему.

Значение, которое было передано ему, было следующим:

["Linux", "Windows"]

Но по какой-то причине f.select получил этот массив (с обратной косой чертой):

[\"Linux\", \"Windows\"]

Это моё решение. В моей модели я сделал gsub, чтобы изменить сохраняемые значения на строку из массива:

before_save do
  self.os_name.gsub!(/[\[\]\"]/, "") if attribute_present?("os_name")
end

поэтому ["Linux", "Windows"] станет Linux, Windows

и я изменил свой f.select на следующий:

= f.select :os, options_for_select(get_uniq_objects(:os), @something.os.split(/\W+/)), {}, { multiple: true}

Я сделал .split(/\W+/), чтобы изменить строку на массив, который f.select примет .

...