Ruby 查看访问 angular.js 变量

Ruby view accessing angular.js variable

我在 Ruby .erb 视图中有 angular ng-repeat。 现在,我需要为一个页面创建一个 link_to,专用于某个 IP 地址。 首先我尝试了

<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 }}' 的散列。我需要它来查找它在 angular 变量中引用的值。

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

请不要提供设计建议 a-la 'rewrite your app from scratch'。

我认为您有点混淆了两个独立的概念 - 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() 方法可以用于此。我不完全确定你是否可以直接在模板中使用,它可能仍然需要在控制器中调用。