Skip to content

Commit 18cef75

Browse files
committed
Merge pull request activeadmin#2912 from carnesmedia/issue-2905
Decorate on new for consistency. Closes activeadmin#2905
2 parents 13b9390 + f2b4f14 commit 18cef75

File tree

7 files changed

+74
-43
lines changed

7 files changed

+74
-43
lines changed

lib/active_admin/orm/active_record/comments/comment.rb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@ class Comment < ActiveRecord::Base
1414

1515
# @returns [String] The name of the record to use for the polymorphic relationship
1616
def self.resource_type(resource)
17-
record = resource.respond_to?(:decorated?) && resource.decorated? ? resource.model : resource
18-
record.class.name.to_s
17+
undecorate_resource(resource).class.name.to_s
18+
end
19+
20+
def self.undecorate_resource(resource)
21+
ActiveAdmin::ResourceController::Decorators.undecorate_resource(resource)
1922
end
2023

2124
# Postgres adapters won't compare strings to numbers (issue 34)

lib/active_admin/resource_controller/data_access.rb

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -113,14 +113,18 @@ def find_resource
113113
#
114114
# @returns [ActiveRecord::Base] An un-saved active record base object
115115
def build_resource
116-
return resource if resource = get_resource_ivar
116+
_resource = get_resource_ivar
117+
118+
return _resource if _resource
119+
120+
_resource = build_new_resource
117121

118-
resource = build_new_resource
122+
run_build_callbacks _resource
123+
authorize_resource! _resource
119124

120-
run_build_callbacks resource
121-
authorize_resource! resource
125+
_resource = apply_decorator(_resource)
122126

123-
set_resource_ivar(resource)
127+
set_resource_ivar(_resource)
124128
end
125129

126130
# Builds a new resource. This method uses the method_for_build provided
@@ -205,7 +209,7 @@ def apply_authorization_scope(collection)
205209

206210
def apply_sorting(chain)
207211
params[:order] ||= active_admin_config.sort_order
208-
212+
209213
order_clause = OrderClause.new params[:order]
210214

211215
if order_clause.valid?

lib/active_admin/resource_controller/decorators.rb

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,38 @@ module Decorators
44
protected
55

66
def apply_decorator(resource)
7-
decorator_class ? decorator_class.new(resource) : resource
7+
decorate? ? decorator_class.new(resource) : resource
88
end
99

1010
def apply_collection_decorator(collection)
11-
if decorator = collection_decorator
12-
decorator.decorate(collection, with: decorator_class)
11+
if decorate?
12+
collection_decorator.decorate(collection, with: decorator_class)
1313
else
1414
collection
1515
end
1616
end
1717

18+
# TODO: find a more suitable place for this
19+
def self.undecorate_resource(resource)
20+
if resource.respond_to?(:decorated?) && resource.decorated?
21+
resource.model
22+
else
23+
resource
24+
end
25+
end
26+
1827
private
1928

29+
def decorate?
30+
case action_name
31+
when 'new', 'edit'
32+
form = active_admin_config.get_page_presenter :form
33+
form && form.options[:decorate] && decorator_class.present?
34+
else
35+
decorator_class.present?
36+
end
37+
end
38+
2039
def decorator_class
2140
active_admin_config.decorator_class
2241
end

lib/active_admin/view_helpers/form_helper.rb

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@ def active_admin_form_for(resource, options = {}, &block)
66
options = Marshal.load( Marshal.dump(options) )
77
options[:builder] ||= ActiveAdmin::FormBuilder
88

9-
if !options.fetch(:decorate, false)
10-
resource = resource.model if resource.respond_to? :model
11-
end
12-
139
semantic_form_for resource, options, &block
1410
end
1511

@@ -19,6 +15,7 @@ def hidden_field_tags_for(params, options={})
1915
hidden_field_tag k, v, :id => sanitize_to_id("hidden_active_admin_#{k}")
2016
end.join("\n").html_safe
2117
end
18+
2219
end
2320
end
2421
end

spec/unit/resource_controller/data_access_spec.rb

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,18 @@
1414
end
1515

1616
describe "searching" do
17-
let(:params){ {:q => {} }}
17+
let(:params) {{ :q => {} }}
1818
it "should call the search method" do
1919
chain = double "ChainObj"
2020
expect(chain).to receive(:ransack).with(params[:q]).once.and_return(Post.ransack)
2121
controller.send :apply_filtering, chain
2222
end
23-
2423
end
2524

2625
describe "sorting" do
2726

2827
context "valid clause" do
29-
let(:params){ {:order => "id_asc" }}
28+
let(:params) {{ :order => "id_asc" }}
3029

3130
it "reorders chain" do
3231
chain = double "ChainObj"
@@ -36,8 +35,8 @@
3635
end
3736

3837
context "invalid clause" do
39-
let(:params){ {:order => "_asc" }}
40-
38+
let(:params) {{ :order => "_asc" }}
39+
4140
it "returns chain untouched" do
4241
chain = double "ChainObj"
4342
expect(chain).not_to receive(:reorder)
@@ -69,7 +68,6 @@
6968
expect(controller.send(:collection_before_scope)).to eq chain
7069
end
7170
end
72-
7371
end
7472

7573
end

spec/unit/resource_controller/decorators_spec.rb

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,28 @@
33
describe ActiveAdmin::ResourceController::Decorators do
44
let(:controller_class) do
55
Class.new do
6-
include ActiveAdmin::ResourceController::Decorators
7-
86
def self.name
97
"Test Controller using Decorators"
108
end
119

10+
def self.helper_method(method)
11+
# STUB
12+
end
13+
14+
include ActiveAdmin::ResourceController::Decorators
15+
1216
public :apply_decorator, :apply_collection_decorator
1317
end
1418
end
1519

1620
let(:controller) { controller_class.new }
17-
before { controller.stub(active_admin_config: double(decorator_class: decorator_class)) }
21+
let(:active_admin_config) { double(decorator_class: decorator_class) }
22+
before { controller.stub(active_admin_config: active_admin_config) }
23+
before { controller.stub(action_name: action) }
1824

1925

2026
describe '#apply_decorator' do
27+
let(:action) { 'show' }
2128
let(:resource) { Post.new }
2229
subject(:applied) { controller.apply_decorator(resource) }
2330

@@ -34,6 +41,7 @@ def self.name
3441

3542
describe '#apply_collection_decorator' do
3643
before { Post.create! }
44+
let(:action) { 'index' }
3745
let(:collection) { Post.scoped }
3846
subject(:applied) { controller.apply_collection_decorator(collection) }
3947

@@ -54,4 +62,25 @@ def self.name
5462
end
5563
end
5664
end
65+
66+
describe 'form actions' do
67+
let(:action) { 'edit' }
68+
let(:resource) { Post.new }
69+
let(:form_presenter) { double options: { decorate: decorate_form } }
70+
let(:decorator_class) { PostDecorator }
71+
before { active_admin_config.stub(:get_page_presenter).with(:form).and_return form_presenter }
72+
73+
subject(:applied) { controller.apply_decorator(resource) }
74+
75+
context 'when the form is not configured to decorate' do
76+
let(:decorate_form) { false }
77+
it { should be_kind_of(Post) }
78+
end
79+
80+
context 'when the form is configured to decorate' do
81+
let(:decorate_form) { true }
82+
it { should be_kind_of(PostDecorator) }
83+
end
84+
85+
end
5786
end

spec/unit/view_helpers/form_helper_spec.rb

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,6 @@
1919
expect(view).to receive(:semantic_form_for).with(resource, builder: custom_builder)
2020
view.active_admin_form_for(resource, builder: custom_builder)
2121
end
22-
23-
context 'with a decorated resource' do
24-
let(:decorated) { double 'decorated_resource', model: resource }
25-
26-
it 'can disable automatic decoration' do
27-
expect(view).to receive(:semantic_form_for).with(resource, default_options.merge(decorate: false))
28-
view.active_admin_form_for(decorated, decorate: false)
29-
end
30-
31-
it 'can enable automatic decoration' do
32-
expect(view).to receive(:semantic_form_for).with(decorated, default_options.merge(decorate: true))
33-
view.active_admin_form_for(decorated, decorate: true)
34-
end
35-
36-
it 'defaults to not decorating' do
37-
expect(view).to receive(:semantic_form_for).with(resource, default_options)
38-
view.active_admin_form_for(decorated)
39-
end
40-
end
4122
end
4223

4324
describe ".hidden_field_tags_for" do

0 commit comments

Comments
 (0)