将AngularJS Data-Bind变量作为Ruby on Rails变量

时间:2016-02-26 18:32:05

标签: ruby-on-rails angularjs ruby ng-repeat

我正在开发一个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>

2 个答案:

答案 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}}')) %>