Идентификатор отображается вместо имени - PullRequest
1 голос
/ 20 декабря 2011

У меня есть has_many_and_belongs_to_many отношение между items и builds.Что бы я ни делал, я просто не могу получить название элементов, которые будут отображаться для How do I output name instead of 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

По сути, я хочу иметь возможность ввести идентификаторэлемент в моей форме, который позже отображается как имя элемента.

Я даже не уверен, подходит ли для этого имя начальные_элементы, или я должен просто использовать item_id.Потому что я планирую добавить много разных входов, где пользователи могут вводить элементы, которые должны отображаться в виде имен.Как вы думаете, имя starting_items подходит для одного из полей, или я должен использовать item_id?

Разве я не могу отобразить название элемента с помощью ruby, выполнив что-то вроде Item.name.find(build.starting_items) или что-то в этом роде?Поскольку значение starting_items является item_id?

Ответы [ 4 ]

2 голосов
/ 20 декабря 2011

Когда вы вызываете build.starting_items, который, как я полагаю, является именованной областью действия или вызовом метода, вы, вероятно, возвращаете массив самих элементов.

После этого вполне вероятно, что каждый из элементов в случае проверки или вывидите выходные данные item.to_s.

Для отображения имен этих элементов вместо идентификатора объекта вы, вероятно, захотите использовать что-то вроде:

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

Это вызовет mapв массиве и раздать каждое из имен, а затем присоединить их (вы также можете использовать .to_sentence в Rails).

1 голос
/ 20 декабря 2011

Глядя на код, вы получаете список всех элементов из базы данных и используете их для заполнения семантической формы.Если вы посмотрите на вывод элементов в html, то создадите список параметров с идентификатором элемента в качестве значения выбора.

Когда форма сохранена, она сохраняет строку, содержащую единый элемент.Идентификатор элемента в базе данных.

Во-первых, если вам нужно принять несколько элементов, вы можете указать количество элементов, принадлежащих ко многим отношениям, таких как:

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

Затем необходимо убедиться, чточто форма действительно передала идентификаторы элемента, чтобы гарантировать, что все идентификаторы сохранены правильно.

1 голос
/ 20 декабря 2011

Хорошо, перечитав то, что вы написали в ответ на другой ответ, я теперь предполагаю , что столбец, с которым у вас возникли проблемы:

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

(дайте мне знать, если это предположение неверно, и скажите мне правильное).

Rails автоматически не знает, что вы хотите видеть имена этих предметов.Это даст вам именно то, о чем вы просили - и здесь вы просили указать набор реальных предметов, а не имен из набора предметов.Чтобы превратить эти объекты в список имен элементов, вы должны вызвать метод «name» для каждого элемента.Вы можете сделать это, используя код, который дал другой ответ:

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

ОБНОВЛЕНИЕ

ок, чтение вашей базы кода.Проблема в том, что вы на самом деле не сохраняете start_items как фактические элементы.В форме, где вы создаете «сборку», у вас есть поле start_items в качестве поля выбора ... поле выбора хранит набор ids .а id это просто целочисленное значение.нигде в вашем коде вы не превратите этот набор целочисленных значений идентификаторов в фактические объекты Item .

Итак ... когда вы еще раз посмотрите на этот список ... это все еще простонабор целых чисел.

Чтобы увидеть имена Предметов, имеющих эти идентификаторы, вам нужно будет на самом деле создать экземпляры этих предметов ... и затем вызвать метод 'name' длянапример:

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

Примечание: вам также необходимо добавить базовые проверки, например, чтобы build.starting_items не был пустым и чтобы идентификаторы действительно были действительными идентификаторами ...

0 голосов
/ 21 декабря 2011

Я, кажется, понял это самостоятельно после покупки книги по Ruby.

Сначала я создал новый вспомогательный метод в application.rb под названием starting_item, который выглядит следующим образом:

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

Почему вспомогательный метод?Таким образом, я могу вызвать этот метод из моих представлений.Теперь, чтобы отобразить имя элемента в моем представлении индекса, я просто вызываю метод с аргументом следующим образом: <%= starting_item(build.starting_items) %>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...