访问angular.js变量的Ruby视图

时间:2015-08-07 10:55:32

标签: javascript ruby-on-rails ruby angularjs erb

我在Ruby .erb视图中有角度ng-repeat。 现在,我需要对一个专用于某个IP地址的页面进行link_to。 首先我试过

<td><%= link_to '{{ roll.system }}' ,'server/'+'{{ roll.system }}' %></a></td>

其中{{roll.system}}是包含ip的angular.js变量。 整体路径类似于localhost/server/127.0.0.1,因为IP地址中的点而无法工作。现在,我试图用IP地址做一个哈希,然后在路由完成后对其进行解码。

我目前的代码是:

<td><%= link_to '{{ roll.system }}' ,"server/"+Base64.urlsafe_encode64('{{ roll.system }} %></a></td>

这是问题所在。 Base64按原样对字符串进行编码,创建文字字符串'{{ roll.system }}'的哈希值。我需要它在角度变量中查找它所指的值。

我不明白为什么这是一个问题,因为link_to工作正常。

请不要设计建议a-la'从头开始重写你的应用'。

1 个答案:

答案 0 :(得分:2)

我认为你有点混淆两个独立的概念 - 渲染Rails视图和播放Angular。

当您点击应用时,您的第一个建议会呈现Rails视图并将您的link_to转换为此原始HTML:

<td><a href="{{ roll.system }}/server/{{ roll.system }}"></a></td>

一旦rails渲染了视图并将页面返回到浏览器,您的Angular代码就会启动,找到{{ roll.system }}调用并将其修改为:

<td><a href="127.0.0.1/server/127.0.0.1"></a></td>

第二次尝试的问题是Base64.urlsafe_encode64在渲染Rails视图时会运行,因此此时Angular不会替换roll.system。因此,无论roll.system是什么,您都会得到这个原始HTML:

 <td><a href="{{ roll.system }}/server/e3sgcm9sbC5zeXN0ZW0gfX0="></a></td>

相反,您可能希望尝试对Angular中的字符串进行base64编码。因此,您可能希望使用angular-base64之类的内容。您可以使用它来执行以下操作:

<td><a href="{{ roll.system }}/server/{{ roll.encoded_system }}"></a></td>

在Angular控制器中设置roll.encoded_system的位置。正如Martin在下面提到的那样,有一种原生的window.btoa()方法可以用于此。我不完全确定你是否可以直接在模板中使用它,它可能仍然需要在控制器中调用。