使用rails构建用户自定义布局

时间:2009-07-30 02:38:05

标签: ruby-on-rails layout

我正在构建一个网站,其中包含由一组小部件组成的用户定义页面。

小部件非常基本,类似于您在Blogger中找到的内容。一些小部件用于基本结构(列表,表格)的数据收集/格式化表示,而其他小部件则提供更复杂的功能(博客,相册等)

我想允许用户选择在他们的页面上显示哪些小部件并重新排序。

我正在考虑让Widgets成为STI(例如BlogWidget,GalleryWidget),每个Widget实例都有一个fkey user_id和一个排序位置。

然后用户的show.html.erb将包含:

for widget in current_user.widgets
    render widget
end

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

我会创建两个模型,“Widgets”和“UserWidgets”,它们看起来如下:

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文件中(这是我首选的方法)。

答案 1 :(得分:0)

我最终实现了这样的事情:

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