ti-enxame.com

Ruby matriz para matriz Javascript

Eu tenho uma matriz Ruby com identificações de conta.

Gostaria de armazenar a matriz Ruby de IDs de conta em uma matriz Javascript.

Eu queria saber a melhor maneira de fazer isso?

Além disso, quando estou tentando fazer isso, parece que o Javascript acha que se houver apenas um ID de conta inserido, esse deve ser o tamanho da matriz. Existe uma maneira de contornar isso? Eu tentei colocá-lo entre aspas, mas isso não parece funcionar.

33
Brian

Vamos supor que você esteja usando erb. Uma primeira abordagem:

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

O problema é que isso cria uma variável global sem contexto (quem a usa?). É por isso que prefiro chamar uma função definida em algum lugar do seu código JS:

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

Aqui está o caminho para mim. Digamos que tenho matriz no controlador:

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

Eu quero usá-lo no slim e gerar um gráfico de pizza do Google. Então, posso obter esse array JavaScript no slim da seguinte maneira:

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

ou posso obter essa matriz JavaScript em erb como:

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

De alguma forma, funciona para mim.

34
ken

Se no seu controlador você tiver:

@my_array = [1, 2, 3]

Você pode definir uma variável javascript como esta na sua visualização:

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

ou:

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

Ambos os casos alteram sua matriz de valores numéricos de ID Ruby em uma matriz de cadeias de caracteres e, em seguida, juntam esses valores de cadeia de caracteres juntamente com vírgulas para gerar valores válidos para javascript.

Se você quiser representações de string no seu javascript, precisará adicionar aspas duplas ao redor dos valores do seu array Ruby:

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

com base na última solução proposta por @Shadwell, prefiro algo como:

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

meu exemplo não usa ERB, porque foi usado em uma função MapReduce para mongodb.

0
VP.