Эта проблема полностью меня превзошла. Я все еще новичок в RoR и учился.Как показать имя вместо идентификатора в рельсах
У меня есть две таблицы: столешницы и счетчик материалов. Пользователь будет выбирать все функции для своей столешницы, включая тип материала. Варианты материала перечислены в таблице Countmaterial и выбираются из коллекции.
Мой вопрос: после того, как был сделан выбор, и создается Countertop, как я могу отобразить имя типа материала на индексной странице для Countertops вместо контртепа, который является целым числом, сгенерированным в соответствии с именем в таблице Countmaterial ?
Я бы предпочел, например, индексный указатель «Гранит» вместо «1». «Гранит» указан в таблице Countmaterial, и когда пользователь выбирает «Гранит», он заполняет таблицу Countertop «1» в столбце countertype. Мрамор "2" и так далее ...
Вот моя схема:
create_table "countertops", force: :cascade do |t|
t.string "size"
t.string "color"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "ZipCode"
t.string "countertype"
end
create_table "countmaterials", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "countertop_id"
end
Мой Прилавок контроллер для индекса:
def index
@countertops = Countertop.all
@countertops = Countertop.includes(:countmaterial).all
end
Мой индекс код:
<% @countertops.each do |countertop| %>
<tr>
<td><%= countertop.ZipCode %></td>
<td><%= countertop.countmaterial.name %></td>
Ассоциации:
class Countertop < ActiveRecord::Base
has_one :countmaterial
end
class Countmaterial < ActiveRecord::Base
belongs_to :countertop
end
Что вы, люди, думаете?
Не '
Nope. Я получаю «неопределенный метод« имя »для nil: NilClass» как ошибку. – JohnOHFS
ok позволяет сделать небольшую отладку. Пожалуйста, измените ваш индекс на <% @ countertops.each do | countertop | %>
ответ
Вы столкнетесь с вашими конкретными названиями моделей; при именовании моделей и контроллеров - держите его SUPER простым. Одно слово ...
Это даст вам возможность сделать следующее:
Чтобы дать вам контекст о том, как это работает, вы должны знать, что Rails & рубин объект ориентирован. Это может не означать многого, но это жизненно важно при разработке приложений с ними.
Object orientated programming - это шаблон, который ставит объект в центре кода. Когда вы поймете, как это работает, ничего не будет когда-либо быть таким же ...
В «традиционном» программирования, вы работаете с потоком пользователя. Это известно как event driven programming, и, хотя он хорошо подходит для стандартных приложений, он не подходит для среды Ruby/Rails.
Веб-приложения могут обрабатывать гораздо больше данных/функций, что имеет смысл рассматривать все как объект.
Таким образом, всякий раз, когда вы имеете дело с Ruby, вы должны думать о всем с точки зрения объектов, которые вы пытаетесь сделать
CRUD
(Create Read Update Destroy).Именно поэтому ваша модель
CounterTop
немного отрывочна - какой объект вы пытаетесь вызвать?Как только вы увидите, что объект находится в основе того, как работает Rails, вы сможете построить вокруг него все, как указано выше.
источник
2015-09-30 22:26:47
Спасибо, что нашли время, чтобы объяснить это, Рич. Хотя, прочитав его, я в основном смущен. В этом приложении я пытаюсь сделать Countertop центральным объектом, вокруг которого работает приложение. Таким образом, материал, размер, тип материала и т. Д. Описывают основную столешницу. Я добавил Countertype и CountMaterial, потому что хочу в конечном итоге расширить приложение, чтобы включить другие продукты, которые будут иметь похожие атрибуты. Поэтому назвать «цвет» модели не является разумной идеей, если у меня есть пять разных продуктов с их собственными возможными цветами. – JohnOHFS
Кроме того, у вас есть счетчики как принадлежащие к атрибутам, а не наоборот, и у вас есть тип в параметрах, а затем введите свою собственную модель? Кажется значительно менее простеньким тогда, когда есть countercolors, cabinetcolors, countercolors, countermaterial и т. Д. – JohnOHFS
Смежные вопросы