正在显示ID而不是名称

时间:2011-12-20 16:47:17

标签: ruby-on-rails

我在has_many_and_belongs_to_manyitems之间有builds个关系。 无论我做什么,我都无法获得How do I output name instead of ID?和其他项目的显示项目名称。它只显示ID:/。

在下面提供的代码中,正在显示项目的ID,而不是具有该ID的项目的名称。如何显示项目的名称?

<% current_user.builds.each do |build| %>
  <tr>
    <td><%= build.hero.name%></td> 
    <td><%= build.user.email%></td> 
    <td><%= build.name %></td> 
    <td><%= build.starting_items %></td> 
    <td><%= build.early_items %></td> 
    <td><%= build.core_items %></td> 
    <td><%= build.situational_items %></td> 
  </tr>
<% end %>

这是github回购:https://github.com/imjp/DotA-Items

基本上,我想要做的是能够在我的表单中输入项目的ID,稍后将其显示为项目名称。

我甚至不确定名称starting_items是否最适合这个,或者我应该使用item_id。因为我计划添加许多不同的输入,用户可以输入需要显示为名称的项目。 您是否认为名称starting_items适用于其中一个字段,或者我应该使用item_id

有没有办法可以通过像Item.name.find(build.starting_items)之类的东西来显示带有红宝石的项目的名称?由于starting_items值为item_id

4 个答案:

答案 0 :(得分:2)

当你调用build.starting_items时,我假设它是一个命名范围或方法调用,你可能会返回一个项目数组本身。

在此之后,如果正在检查或您正在查看item.to_s的输出,则可能是每个项目。

为了显示这些项目的名称而不是对象ID,您可能希望使用以下内容:

<td><%= build.starting_items.map(&:name).join(', ') %></td>

这将调用数组上的map并传出每个名称然后加入它们(你也可以在Rails中使用.to_sentence)。

答案 1 :(得分:1)

好的,重新阅读你为了回答其他答案所写的内容,我现在猜测您遇到问题的专栏是:

<td><%= build.starting_items %></td>

(如果猜测错误并告诉我正确的话,请告诉我。)

Rails不会自动知道您要查看这些项目的名称。它会准确地告诉你你所要求的内容 - 在这里你要求提供一组实际项目......而不是项目集的名称。要将这些项目对象转换为项目名称列表,必须在每个项目上调用“名称”方法。你可以使用其他答案给出的代码来做到这一点:

<td><%= build.starting_items.map(&:name).join(', ') %></td>

<强>更新

好的,阅读你的代码库。 问题是您实际上并没有将starting_items保存为实际项目。在创建“构建”的表单中,您将starting_items字段作为选择框...选择框存储一组 ID 。和id只是一个整数值。 您的代码中没有任何地方将这组整数id值转换为实际Item对象

所以...当你再次查看该列表时......它仍然只是一组整数。

要查看具有这些ID的Items的名称,您需要实际实例化那些Item对象...然后然后在它们上调用'name'方法,例如:

<td><%= Item.find(build.starting_items).map(&:name).join(', ') %></td>

注意:您还需要添加基本检查,例如build.starting_items不为空,并且ID实际上是有效ID ...

答案 2 :(得分:1)

查看代码,您将从数据库中检索所有项目的列表,并使用它们填充语义表单。如果您查看html中项目的输出,则会创建一个选项列表,其中项目ID为select的值。

保存表单后,它会在数据库中保存包含单个项目ID的字符串。

首先,如果您需要接受多个项目,您可以指定多个项目,并且属于许多关系,例如:

has_and_belongs_to_many :starting_items, :join_table => "items", :foreign_key => "item_id"

然后,您需要确保表单实际传递了项目ID,以确保正确保存所有ID。

答案 3 :(得分:0)

在购买Ruby书之后,我似乎已经想到了这一点。

首先,我在application.rb中创建了一个名为starting_item的新辅助方法,如下所示:

def starting_item(id="6")
    @item = Item.find(id)
    "#{@item.name}"
end

为何选择辅助方法?这样我就可以在我的视图中调用此方法。 现在,要在索引视图中显示项目的名称,我只需使用参数调用方法,如下所示:<%= starting_item(build.starting_items) %>