Skip to content

Commit 62644ff

Browse files
committed
Merge branch '0.8-stable': Redirect or render inside widget behaviours [#431]
2 parents 629fcdc + 7c085a5 commit 62644ff

2 files changed

Lines changed: 70 additions & 2 deletions

File tree

lib/ubiquo_design/ubiquo_widgets.rb

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,18 @@ def run_behaviour widget
9595
::Widget.behaviours[widget.key][:proc].bind(self).call(widget)
9696
end
9797

98+
def widget_performed?
99+
performed?
100+
end
101+
102+
def widget_redirected?
103+
@performed_redirect
104+
end
105+
106+
def widget_rendered?
107+
@performed_render
108+
end
109+
98110
# Renders the widget as a string
99111
#
100112
# The +widget+ is the instance to be rendered
@@ -104,8 +116,20 @@ def render_widget widget
104116
require_dependency "widgets/#{widget_name}_widget"
105117
raise WidgetNotFound.new("Widget #{widget_name} not found") unless available_widgets.include?(widget_name)
106118
end
107-
run_behaviour(widget)
108-
render_to_string :file => File.join("widgets", widget_name.to_s, "show.html.erb")
119+
120+
output = run_behaviour(widget)
121+
if widget_redirected?
122+
# Not render any other widget
123+
false
124+
elsif widget_rendered?
125+
# Erase render results: @performed_render and @performed_redirect
126+
# This is used in ActionView::Base::render_to_string
127+
erase_render_results
128+
reset_variables_added_to_assigns
129+
output #return the output rendered by the behaviour
130+
else
131+
render_to_string :file => File.join("widgets", widget_name.to_s, "show.html.erb")
132+
end
109133
end
110134

111135
end
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
require File.dirname(__FILE__) + '/../test_helper'
2+
3+
class GenericDetailWidgetTest < ActionController::TestCase
4+
tests PagesController
5+
6+
test "should render" do
7+
widget, page = create_widget(:generic_detail)
8+
9+
old_proc_behaviour = ::Widget.behaviours[widget.key][:proc]
10+
::Widget.behaviours[widget.key][:proc] = Proc.new do
11+
render :text => "<div id=\"widget-test-container\">Foo</div>"
12+
end
13+
14+
get :show, :url => [page.url_name, widget.id]
15+
assert_equal @controller.widget_rendered?, true
16+
assert_select "#widget-test-container", "Foo"
17+
18+
::Widget.behaviours[widget.key][:proc] = old_proc_behaviour
19+
end
20+
21+
test "should redirect" do
22+
widget, page = create_widget(:generic_detail)
23+
page.add_widget(page.blocks.first.block_type, Free.new(:name => 'free2', :content => 'test_content'))
24+
25+
PagesController.any_instance.expects(:widget_redirected?).returns(true)
26+
PagesController.any_instance.expects(:run_behaviour).once
27+
PagesController.any_instance.expects(:render).returns("foo")
28+
29+
get :show, :url => [page.url_name, widget.id]
30+
end
31+
32+
private
33+
34+
def widget_attributes
35+
{
36+
:model => 'GenericDetail'
37+
}
38+
end
39+
40+
def create_widget(type, options = {})
41+
insert_widget_in_page(type, widget_attributes.merge(options))
42+
end
43+
44+
end

0 commit comments

Comments
 (0)