Почему значение поля не отображается для первой записи в Rails?

#ruby-on-rails #ruby-on-rails-3.1

#ruby-on-rails #ruby-on-rails-3.1

Вопрос:

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

 <% @product.options.each do |o| %>
<tr>
    <td class="option"> 
    <%= o.display %> 
    ...
  

Но o.display часть не работает для самой первой записи option. Во всех других параметрах оно корректно выводит отображаемое значение, но не в самом первом. Я проверил в MySQL, что значение существует для этой конкретной опции (вариант 1):

 mysql> select id,title,display from options;
 ---- ----------------------------- --------- 
| id | title                       | display |
 ---- ----------------------------- --------- 
|  1 | Option 1                    |       1 |
|  2 | Option 2                    |       2 |
|  3 | Option 3                    |       3 |
 ---- ----------------------------- --------- 
  

Что я здесь делаю не так?

Подробная информация:

Если я добавлю:

 <%= debug o %>
  

перед попыткой распечатать отображаемое поле, оно не только отображает отладочную информацию, но и отображает отображаемое значение должным образом. Без отладки отображаемое значение отображаться не будет.

Комментарии:

1. Не похоже, что вы делаете что-то неправильно; вы уверены , что параметры рассматриваемого продукта соответствуют вашим представлениям? То, что это работает для всех параметров, кроме одного, больше указывает на проблему с данными / извлечением.

2. Все остальные поля отображаются правильно для первого варианта. Данные для поля отображения отображаются в других параметрах. Не уверен, как еще я мог бы проверить что-либо еще о параметрах.

Ответ №1:

display — это метод класса Object в Ruby, и, я думаю, это создало проблему с ActiveRecord. Возможно, вы могли бы изменить имя этого поля, это должен быть более простой вариант.

Комментарии:

1. Есть ли другой способ получить доступ к полю отображения? Мне кажется странным, что если это конфликт с методом Ruby, то другие параметры будут отображать поле отображения.

2. @croceldon Ммм, но метод может быть добавлен динамически, хотя он все еще не объясняет (для меня), что пока происходит.

Ответ №2:

Поместите код в отладчик и выполните пошаговое выполнение.

Я бы поместил отладчик в контроллер, где @product (или где бы ни устанавливались эта и другие переменные экземпляра).

Чтобы поместить ваше приложение rails в отладчик — вам нужно добавить «gem ruby-debug» в ваш Gemfile и выполнить установку пакета. (возможно, вам потребуется выполнить «ruby-debug19», если вы используете ruby 1.9). Когда вы нажмете на действие, появится консоль, в которой вы запустили сервер. Вы можете использовать «n» для следующей, «l» для списка и «p» для печати объектов. (Прочитайте руководство по отладчику).

Вам нужно спросить себя «что находится в @product.option»? Это массив? Отвечает ли оно на каждую из них? Что такое первый элемент?

Я бы зашел так далеко, что удалил цикл и просто использовал «@product.option[0].display» в опции.

В отсутствие дополнительной информации лучшее, что я могу помочь, это помочь вам в отладке.