我正在尝试使用apotomo
在我的应用中设置小部件,并且遇到了一些问题。我尝试过研究,但还没找到任何有用的东西。希望有人可能会有一些经验。
这是我的设置:
PagesController#show
视图用于显示页面的已发布版本或预览用户的页面。 PagesController#edit
视图用于以“编辑”模式显示每个窗口小部件的窗体,允许用户根据需要更新它们。title
,url
等)。我遇到的问题是显示每个用户的自定义小部件。
为了这个问题,让我们假设我有一个小部件“PicturesWidget”。我已将小部件添加到PagesController
,如此:
class PagesController < ApplicationController
has_widgets do |root|
root << widget(:pictures)
end
...
end
我在Pages控制器中有两个视图:“PagesController#Edit”和“PagesController#Show”。我还在widget控件中定义了两个视图,一个是“PicturesWidget#edit”,默认是“PicturesWidget #display”。在编辑和显示视图中,我使用类似的东西来加载小部件:
# In views/pages/show.html.erb:
<%= render_widget :pictures, :display, ... %>
# In views/pages/edit.html.erb:
<%= render_widget :pictures, :edit, ... %>
但是,我遇到的主要问题是用户每页可以有多个小部件。换句话说,我必须将序列化的data
字段传入每个窗口小部件,以便它可以在PicturesWidget#display
或PicturesWidget#edit
视图中显示内容。在PagesController
我做:
def show
@user = ...
@page = @user.pages.find(params[:page_id])
@widgets = @page.widgets
end
在views/pages/show.html.erb
中,我使用以下循环:
<% @widgets.each do |widget| %>
<%= render_widget :pictures, :display, :widget => widget %>
<% end %>
这最终将每个窗口小部件ActiveRecord作为参数传递给PicturesWidget
控制器。在小部件控制器中,我为display
和edit
方法添加了“args”:
def display(args)
@widget = args[:widget]
@title = @widget.data[:title]
@url = @widget.data[:url]
render
end
这导致我到处都是问题,因为当我必须重新渲染视图或用另一个替换它时,我通常会抱怨“args”不存在,我无法传递它。
在Apotomo文档中,我发现我们应该在较新版本的gem中使用选项而不是args。选项是从原始PagesController
中的“has_widget”方法中提取的:
has_widgets do |root|
root << widget(:pictures, :data => @data)
end
在这种情况下,options[:data]
会返回@data
。但是,我需要为每个小部件提供数据,而不是全局@data
var。我无法找到其他人如何做到这一点的任何例子。有什么建议?或者我应该废弃整个事情并编写自己的Widget控制器?或者降级到单元格并编写我自己的AJAX处理程序?
很抱歉长篇大论。我认为其他人可能会遇到这个问题,希望这可以帮助他们解决问题。
谢谢, 尼克
[编辑]根据建议,我最终添加了独特的小部件:
@page.widgets.each do |indiv_wid|
root << widget(indiv_wid.kind.to_sym, indiv_wid.id, data: indiv_wid.data)
end
必须覆盖其中一个模块以允许在控制器/视图中使用apotomo_root:
module Apotomo
module Rails
module ActionViewMethods
delegate :render_widget, :apotomo_root, :url_for_event, :to => :controller
end
end
end
(上面添加了:apotomo_root
)
在控制器中使用它来获取所有已加载小部件的列表:
apotomo_root.each do |x|
@widget_ids << x.widget_id unless x.widget_id == :root
end
然后我只是在视图中迭代它:
<% @widget_ids.each do |id| %>
<%= render_widget id %>
<% end %>
答案 0 :(得分:2)
每个小部件可以有单独的选项。无论如何,您应该为每个配置实例化不同的小部件。通过传递每个小部件的ID来执行此操作:http://rdoc.info/github/apotonick/apotomo/Apotomo/WidgetShortcuts:widget
class PagesController < ApplicationController
has_widgets do |root|
root << widget(:pictures, 'one', :data => ...)
root << widget(:pictures, 'two', :data => ...)
end
...
end
您可以在#render_widget
中使用小部件ID,然后使用。
render_widget 'one'