Подтвердить что ты не робот

Массив Ruby для массива Javascript

У меня есть массив Ruby с идентификаторами учетной записи.

Я хотел бы сохранить массив Ruby идентификаторов учетной записи в массиве Javascript.

Мне было интересно, как это сделать?

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

4b9b3361

Ответ 1

Предположим, вы используете erb. Первый подход:

<%= javascript_tag "account_ids = #{account_ids.to_json.html_safe};" %>

Проблема заключается в том, что это создает глобальную переменную без контекста (кто ее использует?). Вот почему я предпочитаю называть функцию, определенную где-то в вашем JS-коде:

<%= javascript_tag "setAccounts(#{account_ids.to_json.html_safe});" %>

Ответ 2

Вот как работает для меня. Скажем, у меня есть массив в контроллере:

@my_array = [['city', 'number'], ['nyc', 39], ['queens', 98]]

Я хочу использовать его в slim и создавать круговую диаграмму Google. Тогда я могу получить этот массив JavaScript в slim:

javascript:
  var myJsArray = #{raw @my_array};

или я могу получить этот массив JavaScript в erb, например:

var myJsArray = <%=raw @my_array%>;

Как-то работает для меня.

Ответ 3

Если в вашем контроллере есть:

@my_array = [1, 2, 3]

Вы можете установить в своем представлении такую ​​переменную javascript:

<script type="text/javascript">
  var myJSArray = new Array(<%= @my_array.map(&:to_s).join(", ") %>);
</script>

или

var myJSArray = [<%= @my_array.map(&:to_s).join(", ") %>];

Оба случая меняют ваш рубиновый массив числовых значений id в массив строк, а затем соединяют эти строковые значения вместе с запятыми, чтобы вывести допустимые значения для javascript.

Если вам нужны строковые представления в вашем javascript, вам нужно добавить двойные кавычки вокруг значений в вашем рубиновом массиве:

var myJSArray = [<%= @my_array.map { |some_id| '"' + some_id.to_s + '"' }.join(", ") %>];

Ответ 4

на основе последнего решения, предложенного @Shadwell, я предпочитаю что-то вроде:

 var myJSArray = new Array("#{@my_array.map(&:inspect).join(", ")}");

В моем примере не используется ERB, поскольку он использовался для функции MapReduce для mongodb.