Массив Ruby для массива Javascript
У меня есть массив Ruby с идентификаторами учетной записи.
Я хотел бы сохранить массив Ruby идентификаторов учетной записи в массиве Javascript.
Мне было интересно, как это сделать?
Кроме того, когда я пытался это сделать, кажется, что Javascript думает, что если только один идентификатор учетной записи введен, то это должен быть размер массива. Есть ли способ обойти это? Я попытался положить его в кавычки, но это не работает.
Ответы
Ответ 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.