.last和.each in rails

时间:2013-03-27 03:11:01

标签: ruby-on-rails ruby-on-rails-3 activerecord each

我正在尝试在创建新的子评论时获取视图中的最后一条记录...我的代码如下......

<% @subcomment = @comment.subcomments.order("created_at").last %>
<% @subcomment.each do |comment| %>
    this worked!
<% end %>

我知道@subcomment有最后一条记录......(例如,当我使用.inspect时,它会显示该对象),但出于某种原因使用.each会出现以下错误......

NoMethodError (undefined method `each' for #<Subcomment:0x007fb14c0e5510>):

我需要使用.each,因为我使用此视图来显示所有子注释。怎么会。每个不起作用,有什么替代方案?

谢谢。

最后......我想要这样的事情:

<% if defined? showlast %>
    <% @subcomments = @comment.subcomments.order("created_at").last %>
    <% [@subcomments].each do |subcomment| %>
    <div id="subcomments">
<% else %>
<div id="subcomments">
  <% @subcomments.each do |subcomment| %>
     <<here is a long template of what to do with @subcomments>>

即。我希望模板迭代(如果是多个)并且如果参数:showlast被发送则用于最后一个项目

3 个答案:

答案 0 :(得分:1)

使用last只会为你带来一个选项,你不能迭代一件事。

答案 1 :(得分:0)

好的,所以如果要对单个实体强制执行迭代,最简单的方法是创建一个包含一个元素的数组。

在这种情况下,而不是@subcomment.each尝试在您的区块中使用[@subcomment].each

话虽如此,我建议您重新审视这种方法。您的查找正在执行.last,这可确保返回单个实体。所以,你可以使用它而不是迭代。

答案 2 :(得分:0)

您应该将<<here is a long template of what to do with @subcomments>>放入名为_subcomment.html.erb的部分中。然后你可以这样做:

<div id="subcomments">
  <% if defined? showlast %>
    <%= render @comment.subcomments.order("created_at").last %>
  <% else %>
    <% @subcomments.each do |subcomment| %>
      <%= render subcomment %>
    <% end%>
  <% end %>
</div>