Есть несколько реализаций, упомянутых Беном Хьюзом, которые являются хорошими примерами и могут послужить хорошей отправной точкой. Если вы хотите создать собственное решение с нуля, я бы предложил что-то вроде следующего:
Создание двух таблиц / моделей, виджетов и пользовательских виджетов:
Widgets:
ID (Primary Key)
Name
Description
UserWidgets:
ID (Primary Key)
User_ID (Foreign Key -> Users.ID)
Widget_ID (Foreign Key -> Widget.ID)
Теперь у вас есть таблица для привязки пользователя к виджету. Я предполагаю, что ваши виджеты будут обрабатываться в основном через JavaScript, поэтому добавьте новый подкаталог, например ...
/public/javascripts/widgets
Теперь для каждого виджета в вашей таблице виджетов добавьте соответствующий JS-файл в этот подкаталог. Если у вас есть виджет с именем «Часы», добавьте «Clock.js».
Добавьте соответствующие ассоциации в пользовательскую модель.
has_many :user_widgets, :dependent => :destroy
has_many :widgets, :through -> :user_widgets
Тогда где-то в представлении вы можете сделать:
<% @user.widgets.each do |w| %>
<%= javascript_include_tag "widgets/#{w}" -%>
<% end %>
Скорее всего, это будет включено в макет любой страницы, на которой будет отображаться виджет. Если вы не хотите использовать динамические виджеты через JavaScript, вы можете использовать очень похожий код представления в любом месте представления / частичного.