我正在开发一个Ruby on Rails应用程序,同时使用AngularJS作为前端。我正在使用AngularJS资源从MySql数据库中查询数据并将它们存储在'entries'变量中。 Ruby on Rails已经有来自数据库的'显示','编辑'和'销毁'行的控制器设置,因此我不确定是否要通过忽略这些控制器并使用AngularJS资源来重新发明轮子。 使用ng-repeat过滤我的数据时,我还想在每个受尊重的行中添加RoR“显示”,“编辑”和“销毁”链接。我无法使用RoRs<%@ songs.each do | song | %GT;声明,因为这会在我的ng-repeat循环中添加一个循环。相反,我只想使用AngularJS {{e.id}}变量并将其传递给<%= link_to'Edit',edit_song_path( ID_VARIABLE )%>函数,但RoR和AngularJS变量似乎不能很好地结合在一起。 有没有“简单”的方法来做到这一点?
<div class="container">
<ul class="list-group">
<table class="table">
<thead>
<tr>
<th>Band</th>
<th>Title</th>
</tr>
</thead>
<tbody ng-repeat="e in entries | filter:searchFilter">
<tr>
<td>{{e.band}}</td>
<td>{{e.title}}</td>
<td>{{e.id}}</td>
<td>
<!-- Pass 'e.id' to the 'link_to' function -->
<%= link_to 'Edit', edit_song_path(**{{e.id}}**) %>
</td>
</tr>
</tbody>
</table>
</ul>
</div>
</div>
答案 0 :(得分:0)
服务器端代码(rails helper)将在javascript之前渲染很长时间,因此你的js变量将无法传递给rails helper。
处理此问题的最快(非理想)方法是不使用rails path helper并在anchor元素<a href="/thing/{{e.id}}/edit">Edit</a>
中明确写出路径。
几年前,我写了一篇关于使用Angular和Rails的博客,如果你感兴趣的话,没有完全潜入客户端MVC:http://www.littlelines.com/blog/2014/02/21/how_to_use_angularjs_and_keep_loving_rails/
使用类似Angular Rails Resource之类的东西可能允许您引用歌曲编辑端点,而无需在整个应用程序中对其进行明确的硬编码。
希望有所帮助。
P.S。 sjagr的js_routes gem引用也是一种有趣的方法。
答案 1 :(得分:0)
Rails无法看到您的Angular变量,但除了using a nice gem以外,您还可以将Angular {{}}
标记作为Rails URL本身的参数传递。 Rails并不关心你所引用的ID的存在,只是你传递了一个参数来引用它。
唯一需要注意的是,你必须忘掉它:
<%= link_to 'Edit', CGI::unescape(edit_song_path('{{e.id}}')) %>