使用Angular JS Ng-repeat在Rails form_for中传入'ID'

时间:2014-03-28 18:30:40

标签: angularjs ruby-on-rails-4 find form-for ng-repeat

我使用ng-repeat在Rails视图中创建记录索引,在此索引上我试图实现一个按钮来更新特定记录。问题是我需要将正确的id传递给Rails控制器。当我尝试使用'{{swim_record.id}}!'传递记录ID,并通过Angular使用字符串插值时,我收到错误。

<tbody>
  <tr ng-repeat='swim_record in SwimRecords | orderBy:predicate.value:reverse |
  filter:search'>
   <td>
     <a ng-href='/swim_records/{{swim_record.id}}'>
      {{swim_record.last_name}}
     </a>
   </td>
   <td>{{swim_record.first_name}}</td>
   <td class = 'hidden-xs'>{{swim_record.check_in | date:'MM/dd/yyyy @ h:mma'}}</td>
   <th class = 'hidden-xs'>{{swim_record.lmsc}}</td>
   <td>
    <%= bootstrap_form_for Swimmer.find_by_id("{{swim_record.id }}!".to_i) do |f| %>
     <%= f.hidden_field :last_name, value: "Hat" %>
     <%= f.submit 'Check Out', class: "btn btn-danger" %>
    <% end %>
   </td>
  </tr>
</tbody>

非常感谢任何建议!

2 个答案:

答案 0 :(得分:0)

你不应该像这样混合服务器和客户端代码。服务器端代码在角度ng-repeat开始之前执行。你必须了解它是如何工作的。服务器端正在呈现html并发送到浏览器,其中angularjs再次呈现此html。所以你不能那样swim_record.id。我建议仅将服务器端语言用于API,angularjs将处理休息

答案 1 :(得分:0)

AngularJS是一个非常灵活和强大的框架,但正如他们所说,强大的力量带来了巨大的责任(/陈词滥调)。虽然它可能是您的Web堆栈的一个很好的补充,但您必须真正了解AngularJS的功能及其尝试实现的目标。

我不认为AngularJS团队在营销他们的产品方面做得很好。在他们的几个页面上,他们告诉你使用AngularJS然后你想要,吹嘘他们的MVW(模型视图无论如何)的口号。他们的头版需要大胆地说明AngularJS是什么以及它试图做什么,但我所看到的只是自我赞美。抱歉,“为网络应用增强了HTML!”不是一个很好的描述...

此外,他们的网站上写着这个危险的小短语

  

“尽可能多地将AngularJS添加到现有页面中   喜欢。许多其他框架需要完全承诺。 “

不幸的是,这使得许多开发人员(包括我自己)将AngularJS视为一个可以与旧的开发风格和实践无缝协作的库。当我在暑期实习期间尝试将标准的Rails MVC和ERB与AngularJS混合开发时,我犯了这个致命的错误。但我离题了......

  

这里需要记住的核心是vanilla Rails 4堆栈   服务器端MVC,而AngularJS用于客户端MVC。

简而言之,vanilla Rails将在服务器上构建并嵌入您的视图,而另一方面,AngularJS将构建并嵌入您的视图客户端。

不要让这阻止你将Rails与AngularJS结合使用。你不能很好地混合和匹配AngularJS和ERB。如果你想继续使用AngularJS,我建议用Rails公开json API端点,避免使用任何&lt; %%&gt;除非绝对必要,否则嵌入。