【问题标题】:Ruby on Rails each iteration error when one recordRuby on Rails 每次迭代出错时有一条记录
【发布时间】:2015-03-21 11:09:08
【问题描述】:

我坚持似乎应该有一个非常简单的解决方案,但我找不到任何可行的方法!我正在从索引页面上的一个表中迭代结果(它返回一个状态列表)。当返回多条记录时,这没有任何问题。但是,当返回单个记录时,我收到一个错误:undefined method 'each' for #

我知道仅返回一条记录时会导致错误,但我找不到任何有关如何处理此问题的文档,尤其是在可能返回 1 或 0 条记录的情况下。

控制器中的代码:

@states = State.find(params[:id])

索引页面中的代码:

<ul>
  <% @states.each do |state| %>
    <li>
      <%= state.state_name %>
    </li>
  <% end %>
</ul>

【问题讨论】:

  • 您是否有多个具有相同 id 的州?

标签: ruby-on-rails iteration each


【解决方案1】:

因为你使用的是find,所以当你在params中发送多个id时,会匹配多条记录;当您发送单个 id 时,将返回单个实例。

为确保每次都能获得一个可以调用 eachActiveRecord::Relation 对象,请将控制器代码更改为以下内容:

@states = State.where(id: params[:id]) # index action

您提到它是index 视图,因此上述更改应该可以解决您的问题。

如果是show 视图,那么您需要坚持使用find 并将视图更改为只显示一个state

【讨论】:

  • 谢谢!这非常有效,这正是我想要做的!我刚刚开始学习 RoR,只看到在教程中使用了 find。这帮助很大!
【解决方案2】:

您需要检查它是否响应 .each,这是了解某物是否实现了 enumerable 模块的首要条件。

if @states.respond_to?(:each)
  # iteration goes here
else
  # single handling goes here

当然你也可以在查询中使用 .where 选项,它总是返回一个集合

@states = State.where(id: params[:id])

【讨论】:

    【解决方案3】:

    场景一:-

    当在控制器中查询记录时:

    @states = State.find(params[:id])
    

    那么在视图中应该是这样的:

    <p><%= @states.state_name %></p>
    

    场景2:-

    当在控制器中查询记录时:

    @states = State.all
    

    那么在视图中应该是这样的:

    <ul>
      <% @states.each do |state| %>
        <li>
          <%= state.state_name %>
        </li>
      <% end %>
    </ul>
    

    注意:- 在第一种情况下,它只是一个对象,但在第二种情况下,它是对象的集合或对象的数组。并且只迭代数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2013-01-04
      • 2011-06-09
      • 1970-01-01
      相关资源
      最近更新 更多