Создание пользовательского макета с помощью направляющих - PullRequest
1 голос
/ 30 июля 2009

Я создаю сайт, на котором есть определенные пользователем страницы, состоящие из набора виджетов.

Виджеты довольно просты, похожи на те, что вы найдете в Blogger. Некоторые виджеты предназначены для сбора / форматирования данных с базовой структурой (списки, таблицы), а другие предоставляют более сложные функции (блог, фотоальбомы и т. Д.)

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

Я думал о том, чтобы виджеты были STI (например, BlogWidget, GalleryWidget), и каждый экземпляр Widget имел бы fkey user_id и позицию для сортировки.

Тогда пользователь show.html.erb будет содержать:

for widget in current_user.widgets
    render widget
end

Есть ли лучший способ?

Ответы [ 2 ]

1 голос
/ 30 июля 2009

Я бы создал две модели: «Виджеты» и «Пользовательские виджеты», которые бы выглядели следующим образом:

Widgets:
  ID (Primary Key)
  Name
  Description
  etc...

UserWidgets:
  ID
  Position
  Widget_ID (Foreign Key -> Widgets.ID)
  User_ID (Foreign Key -> Users.ID)

Установите правильные ассоциации, чтобы вы могли просто сделать @ user.widgets, чтобы получить список всех виджетов. Если вы называете ваши виджеты так же, как имя, которое они имеют в базе данных, вы можете просто сделать следующее в представлении / макете / частичном:

<% @user.widgets do |w| %>
  <%= javascript_include_tag w.name %>
<% end %>

Это, конечно, при условии, что вы отделяете каждый виджет в его собственный автономный файл JavaScript (что будет моим предпочтительным способом сделать это).

0 голосов
/ 31 июля 2009

В итоге я реализовал что-то вроде этого:

class Placement < ActiveRecord::Base
  belongs_to :widget, :polymorphic => true
  belongs_to :container, :polymorphic => true

  acts_as_double_polymorphic_join(
    :widgets =>[:blogs, :galleries, :twitter_feeds], 
    :containers => [:pages, :users, :groups]
  )

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