2015-09-30 4 views
1

Эта проблема полностью меня превзошла. Я все еще новичок в 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 

Что вы, люди, думаете?

+0

Не '<% = countertop.countmaterial.name%>' дает вам имя? – dimakura

+0

Nope. Я получаю «неопределенный метод« имя »для nil: NilClass» как ошибку. – JohnOHFS

+0

ok позволяет сделать небольшую отладку. Пожалуйста, измените ваш индекс на <% @ countertops.each do | countertop | %> <% = countertop.inspect.to_s%> <% = countertop.countmaterial..inspect.to_s%> Это должно дать некоторые странные сгустки данных, пожалуйста, напишите те , – vereecjw

ответ

0

Вы столкнетесь с вашими конкретными названиями моделей; при именовании моделей и контроллеров - держите его SUPER простым. Одно слово ...

#app/models/counter.rb 
class Counter < ActiveRecord::Base 
    #columns id | type_id | material_id | size_id | color_id | zip_code| created_at | updated_at 
    belongs_to :type 
    belongs_to :material 
    belongs_to :size 
    belongs_to :color 
    delegate :name, to: :size, prefix: true 
end 

#app/models/option.rb 
class Option < ActiveRecord::Base 
    #columns id | Type | name | created_at | updated_at 
    has_many :counters 
end 

#app/models/size.rb 
class Size < Option 
end 

#app/models/type.rb 
class Type < Option 
end 

#app/models/color.rb 
class Color < Option 
end 

#app/models/material.rb 
class Material/Option 
end 

Это даст вам возможность сделать следующее:

#config/routes.rb 
resources :counters 

#app/controllers/counters_controller.rb 
class CountersController < ApplicationController 
    def index 
     @counters = Counter.all 
    end 
end 

#app/views/counters/index.html.erb 
<% @counters.each do |counter| %> 
    <%= counter.size_name %> 
<% end %> 

Чтобы дать вам контекст о том, как это работает, вы должны знать, что Rails & рубин объект ориентирован. Это может не означать многого, но это жизненно важно при разработке приложений с ними.

Object orientated programming - это шаблон, который ставит объект в центре кода. Когда вы поймете, как это работает, ничего не будет когда-либо быть таким же ...

enter image description here

В «традиционном» программирования, вы работаете с потоком пользователя. Это известно как event driven programming, и, хотя он хорошо подходит для стандартных приложений, он не подходит для среды Ruby/Rails.

Веб-приложения могут обрабатывать гораздо больше данных/функций, что имеет смысл рассматривать все как объект.

Таким образом, всякий раз, когда вы имеете дело с Ruby, вы должны думать о всем с точки зрения объектов, которые вы пытаетесь сделать CRUD (Create Read Update Destroy).

Именно поэтому ваша модель CounterTop немного отрывочна - какой объект вы пытаетесь вызвать?

Как только вы увидите, что объект находится в основе того, как работает Rails, вы сможете построить вокруг него все, как указано выше.

+0

Спасибо, что нашли время, чтобы объяснить это, Рич. Хотя, прочитав его, я в основном смущен. В этом приложении я пытаюсь сделать Countertop центральным объектом, вокруг которого работает приложение. Таким образом, материал, размер, тип материала и т. Д. Описывают основную столешницу. Я добавил Countertype и CountMaterial, потому что хочу в конечном итоге расширить приложение, чтобы включить другие продукты, которые будут иметь похожие атрибуты. Поэтому назвать «цвет» модели не является разумной идеей, если у меня есть пять разных продуктов с их собственными возможными цветами. – JohnOHFS

+0

Кроме того, у вас есть счетчики как принадлежащие к атрибутам, а не наоборот, и у вас есть тип в параметрах, а затем введите свою собственную модель? Кажется значительно менее простеньким тогда, когда есть countercolors, cabinetcolors, countercolors, countermaterial и т. Д. – JohnOHFS

Смежные вопросы