Несколько раскладок в рельсах [Newbie Q] - PullRequest
1 голос
/ 15 июня 2010

Будучи новичком, я решил создать приложение «Домашний инвентарь».Теперь я застрял на том, как программно выбрать макет на основе того, какой тип элемента он отображается при просмотре в браузере.

В соответствии с моим планом, до сих пор я должен был создать несколько моделей для представления типов элементов.предметы, которые я могу найти в своем доме: Мебель , Электроника и Книги .

class Book < ActiveRecord::Base
end

class Furniture < ActiveRecord::Base
end

class Electronic < ActiveRecord::Base
end

Теперь Книги Модель имеет такие вещи, как isbn , страницы , адрес и категория . Мебель модель имеет такие вещи, как цвет , цена , адрес и категория . Электроника имеет такие вещи, как имя , напряжение , адрес и категория .

Вот где я запутался .Я знаю, что свойство адрес будет одинаковым для всех из них.Я также знаю, что мне нужно будет создать несколько «макетов» для 3 различных типов элементов, чтобы показать различные свойства указанных элементов с соответствующей графикой и таблицами стилей.

Но как мне решить, какую категориюЭлемент, так что я могу определить, какой макет для визуализации.

По моему мнению, вот как я это сделаю:

class DisplayController < ApplicationController
def display    
  @item = Params[:item]
    if @item.category  = "electronics"
   render :layout => 'electronics'
  end
end

В моем rout.rb

map.display ':item', :controller => 'display', :action => 'display'

Кажется, у меня есть только одна проблема в этом, я, вероятно, добавлю много категорий позже и думаю, что должен быть более СУХОЙ способ решения, а не жесткое их кодирование.

Я понимаю, чтоМне нужно добавить в макет HTML-теги для отображения соответствующей информации для этой конкретной категории.

---- Вопросы ----

  1. Этоправильный подход к решению проблем такого типа.
  2. Будет ли этот подход совместимым, когда я решу добавить камень, например inking_sphinx , для запуска поиска.
  3. Какие проблемы у вас возникают?смотри с моего одобренияах, и как мне сделать его лучше.
  4. Я читал кое-что о "Полиморфной ассоциации", применимо ли это в этом случае, поскольку категория существует для всех элементов?

Также,Я пытался получить маршруты для отображения URL, например "http://localhost/living-room-tv"

Ответы [ 2 ]

1 голос
/ 15 июня 2010

Если я вас правильно понимаю, то что вы хотите, это не разные макеты. То, что вы хотите, это разные шаблоны.

Компоновка означает общую структуру всей страницы, и она обычно является общей для всего проекта, или, возможно, у вас будет 2-3 макета на проект. (общий макет сайта, макет администратора и некоторые другие конкретные макеты).

Вы упоминаете, что хотите, чтобы другой шаблон отображал различные атрибуты книг, мебели и электроники.

Создайте файл представления app / views / display / furniture.html.erb и другой для книг и электроники и отредактируйте его, используя render :template => 'furniture' вместо render :layout.

Теперь, если есть общие части информации среди различных категорий, вам нужно создать частичную часть, которая содержит только общую часть. Например, создайте частичный app / views / shared / address.html.erb, и внутри вашего furniture.html.erb вы сделаете render :partial => '/shared/address', :locals => {:address => @item.address}.

Это поможет вам сохранить максимально возможную логику представления, одновременно предоставляя гибкость при создании пользовательских шаблонов для каждой категории.

1 голос
/ 15 июня 2010
  1. Вероятно, это правильный путь, если у вас есть 2-3 категории. Если ваша система будет развиваться, вы наверняка захотите сделать реализацию более гибкой.

  2. Не уверен, какие проблемы вы ожидаете с поиском. Лучше всего, что на странице результатов поиска у вас будут элементы разного типа, поэтому вам просто понадобятся разные партиалы для их визуализации.

  3. Как я уже сказал, добавление поддержки для разных категорий может быть утомительным при вашем текущем подходе. Я могу предложить две вещи (не обязательно взаимоисключающие):

    • использует соглашение для связывания имени категории с макетом (например, категория "электроника" отображается с помощью electronics макета). Таким образом, вы сможете просто render :layout => @item.category, и этот код будет защищен от добавления новых категорий
    • По мере того, как ваша система будет расти и совершенствоваться, вам может потребоваться ввести совершенно новую модель для ваших категорий. Подумайте об этом сейчас, может быть, вы захотите сделать это прямо сейчас.
  4. Полиморфные ассоциации - это другое. Для них должно быть две модели, сейчас у вас есть только одна. См. Направляющие рельсов, 2.9 .

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

Что касается URL, этот вопрос поднимался много раз ( здесь и там ).

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