draper 4.0.2 → 4.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +41 -25
  3. data/.rspec +1 -2
  4. data/CHANGELOG.md +18 -0
  5. data/Gemfile +27 -5
  6. data/README.md +23 -1
  7. data/draper.gemspec +3 -3
  8. data/lib/draper/automatic_delegation.rb +14 -4
  9. data/lib/draper/decoratable/collection_proxy.rb +15 -0
  10. data/lib/draper/decoratable.rb +2 -2
  11. data/lib/draper/query_methods.rb +1 -1
  12. data/lib/draper/railtie.rb +8 -4
  13. data/lib/draper/version.rb +1 -1
  14. data/lib/draper/view_context/build_strategy.rb +1 -9
  15. data/lib/draper.rb +0 -6
  16. data/spec/draper/decoratable_spec.rb +1 -1
  17. data/spec/draper/decorator_spec.rb +2 -2
  18. data/spec/draper/factory_spec.rb +8 -8
  19. data/spec/draper/query_methods_spec.rb +10 -0
  20. data/spec/draper/view_context/build_strategy_spec.rb +1 -18
  21. data/spec/dummy/.rspec +0 -1
  22. data/spec/dummy/app/decorators/comment_decorator.rb +13 -0
  23. data/spec/dummy/app/decorators/mongoid_post_decorator.rb +1 -3
  24. data/spec/dummy/app/models/admin.rb +2 -4
  25. data/spec/dummy/app/models/comment.rb +3 -0
  26. data/spec/dummy/app/models/mongoid_post.rb +2 -4
  27. data/spec/dummy/app/models/post.rb +4 -0
  28. data/spec/dummy/app/models/user.rb +2 -4
  29. data/spec/dummy/config/application.rb +22 -51
  30. data/spec/dummy/config/environments/development.rb +65 -22
  31. data/spec/dummy/config/environments/production.rb +76 -33
  32. data/spec/dummy/config/environments/test.rb +55 -21
  33. data/spec/dummy/config/initializers/draper.rb +4 -2
  34. data/spec/dummy/db/migrate/20240907041839_create_comments.rb +9 -0
  35. data/spec/dummy/db/schema.rb +16 -9
  36. data/spec/dummy/spec/decorators/active_model_serializers_spec.rb +1 -1
  37. data/spec/dummy/spec/decorators/post_decorator_spec.rb +1 -1
  38. data/spec/dummy/spec/jobs/publish_post_job_spec.rb +2 -0
  39. data/spec/dummy/spec/models/post_spec.rb +41 -5
  40. data/spec/dummy/spec/rails_helper.rb +69 -0
  41. data/spec/dummy/spec/spec_helper.rb +90 -5
  42. data/spec/performance/benchmark.rb +1 -1
  43. data/spec/support/dummy_app.rb +1 -1
  44. metadata +22 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6b009279cf28737a6fcf4027fc26f3dc2a955741c7c5e5d2220c8dcb383490e3
4
- data.tar.gz: 22455a3a7126650483af269d6a0e432a5a4465a59c762518ce78f40bcecb4286
3
+ metadata.gz: 78c5e444690de191d46a5be87ed46a3f9be6ec0ffd59fed6dcd1d63e5d527b85
4
+ data.tar.gz: f92be8ee42d8ce2e48c1743077f758eef779296593fcbcdef9a82fd5937a03ae
5
5
  SHA512:
6
- metadata.gz: 2fd6c0b87227c23320e9ee211b4b2001c81cbf76d103a12e5076f427954febdb2d0366d5182f16b27f5155717ad878f08671098f8b1f9986c137ec053e1637bf
7
- data.tar.gz: 260d4eccd57c623c966422cd256ab1485e1ce4bbaea05d2c6f615cdb644ab0147f00e8917b8165eba78651f279b66cde0a13da38b1c5cc9dc6a0e49822db2361
6
+ metadata.gz: 2b2d10594f175019d7cbee9b7af7f811c8978349abae3cdce746abd94f24501d81b519c9da9ae350658265dd5aa0b33cdd9b3f18e26df922363227df8f57c4a4
7
+ data.tar.gz: 81565fd7b8034294a41c49b557f48619e6cee814056d2d4bff4c0e6f17c024877b250b421d4a185310f6b6fa3dee14b51d954b6ee3cef39100d3cfb4c9582af7
@@ -2,21 +2,42 @@
2
2
  name: CI
3
3
 
4
4
  on:
5
- - push
6
- - pull_request
5
+ push:
6
+ branches:
7
+ - master
8
+ pull_request:
9
+
10
+ permissions:
11
+ contents: read
7
12
 
8
13
  jobs:
9
14
  rspec:
10
- runs-on: ubuntu-20.04
15
+ name: >-
16
+ rspec (${{ matrix.ruby }})
17
+
18
+ runs-on: ubuntu-latest
19
+
11
20
  strategy:
12
21
  fail-fast: false
13
22
  matrix:
14
23
  ruby:
15
- - '3.0'
16
- - '2.7'
17
- - '2.6'
18
- - '2.5'
19
- - '2.4'
24
+ - 3.3
25
+ - 3.2
26
+ - 3.1
27
+ rails:
28
+ - 7.2
29
+ include:
30
+ # Edge
31
+ - { ruby: 'head', rails: 'edge', allow-fail: true }
32
+ # Outdated
33
+ - { ruby: '3.0', rails: '7.1' }
34
+ - { ruby: '2.7', rails: '6' } # RSpec AR Expectations support Rails 7.1 since Ruby 3.0
35
+ - { ruby: '2.6', rails: '6' }
36
+ - { ruby: '2.5', rails: '6' }
37
+ - { ruby: '2.4', rails: '5' }
38
+
39
+ env:
40
+ RAILS_VERSION: "${{ matrix.rails }}"
20
41
 
21
42
  services:
22
43
  mongodb:
@@ -25,31 +46,26 @@ jobs:
25
46
  - 27017:27017
26
47
 
27
48
  steps:
28
- - name: Checkout
29
- uses: actions/checkout@v2
49
+ - uses: actions/checkout@v4
30
50
 
31
51
  - name: Setup Ruby
32
52
  uses: ruby/setup-ruby@v1
33
53
  with:
34
54
  ruby-version: ${{ matrix.ruby }}
35
-
36
- - name: Setup Ruby cache
37
- uses: actions/cache@v2
38
- with:
39
- path: vendor/bundle
40
- key: ${{ runner.os }}-gems-${{ matrix.ruby }}-${{ hashFiles('**/Gemfile.lock') }}
41
- restore-keys: |
42
- ${{ runner.os }}-gems-${{ matrix.ruby }}-
43
-
44
- - name: Bundle
45
- run: |
46
- gem install bundler
47
- bundle config path vendor/bundle
48
- bundle install --jobs 4 --retry 3
55
+ rubygems: latest
56
+ bundler-cache: true
49
57
 
50
58
  - name: RSpec & publish code coverage
51
- uses: paambaati/codeclimate-action@v2.7.5
59
+ uses: paambaati/codeclimate-action@v8
52
60
  env:
53
61
  CC_TEST_REPORTER_ID: b7ba588af2a540fa96c267b3655a2afe31ea29976dc25905a668dd28d5e88915
54
62
  with:
55
63
  coverageCommand: bin/rake
64
+ continue-on-error: ${{ matrix.allow-fail }}
65
+ id: test
66
+
67
+ - name: >-
68
+ Test ${{ steps.test.outcome }}
69
+ run: |
70
+ echo Ruby ${{ matrix.ruby }}
71
+ echo Rails ${{ matrix.rails }}
data/.rspec CHANGED
@@ -1,2 +1 @@
1
- --color
2
- --order rand
1
+ --format progress
data/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Draper Changelog
2
2
 
3
+ ## 4.0.4 - 2025-01-28
4
+
5
+ ### Fixes
6
+ * Fix a `LoadError` caused by a cherry-pick issue in version 4.0.3
7
+
8
+ ## 4.0.3 - 2025-01-27
9
+
10
+ Added support for latest Ruby (upto 3.4) and Rails (upto 8) versions.
11
+
12
+ ### Fixes
13
+ * Fix `CollectionDecorator#respond_to?` for non-ORM collections [#920](https://github.com/drapergem/draper/pull/920)
14
+ * Fix issues with using Draper outside of controller scope [#927](https://github.com/drapergem/draper/pull/927)
15
+ * Fix decoration of AR associations [#932](https://github.com/drapergem/draper/pull/932)
16
+
17
+ ### Other Changes
18
+ * Improve performance of delegation via `delegate_all` [#911](https://github.com/drapergem/draper/pull/911)
19
+ * Improve README [#878](https://github.com/drapergem/draper/pull/878), [#922](https://github.com/drapergem/draper/pull/922), [#934](https://github.com/drapergem/draper/pull/934)
20
+
3
21
  ## 4.0.2 - 2021-05-27
4
22
 
5
23
  ### Fixes
data/Gemfile CHANGED
@@ -2,6 +2,8 @@ source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
5
+ gem 'puma'
6
+
5
7
  platforms :ruby do
6
8
  if RUBY_VERSION >= "2.5.0"
7
9
  gem 'sqlite3'
@@ -15,10 +17,30 @@ platforms :jruby do
15
17
  gem "activerecord-jdbcsqlite3-adapter"
16
18
  end
17
19
 
18
- if RUBY_VERSION >= "2.5.0"
19
- gem "rails", "~> 6.0"
20
- gem 'webrick'
20
+ case rails_version = ENV['RAILS_VERSION']
21
+ when nil
22
+ gem 'rails'
23
+ when 'edge'
24
+ gem 'rails', github: 'rails/rails'
21
25
  else
22
- gem "rails", "~> 5.0"
26
+ gem 'rails', "~> #{rails_version}.0"
27
+ end
28
+
29
+ gem 'mongoid' unless
30
+ rails_version == 'edge'
31
+ gem 'active_model_serializers'
32
+
33
+ case RUBY_VERSION
34
+ when '2.6'...'3.0'
35
+ gem "turbo-rails", "<= 2.0.7"
36
+ gem "redis", "~> 4.0"
37
+ when '3.0'...'4'
38
+ gem 'turbo-rails'
39
+ gem 'redis', '~> 4.0'
40
+ end
41
+
42
+ if RUBY_VERSION < "2.5.0"
43
+ gem 'rspec-activerecord-expectations', '~> 1.2.0'
44
+ gem 'simplecov', '0.17.1'
45
+ gem "loofah", "< 2.21.0" # Workaround for `uninitialized constant Nokogiri::HTML4`
23
46
  end
24
- gem "mongoid", github: "mongodb/mongoid"
data/README.md CHANGED
@@ -131,6 +131,17 @@ class ArticleDecorator < Draper::Decorator
131
131
  end
132
132
  ```
133
133
 
134
+
135
+ To decorate a model in a namespace e.g. `Admin::Catalogue` place the decorator under the
136
+ directory `app/decorators/admin` in the same way you would with views and models.
137
+
138
+ ```ruby
139
+ # app/decorators/admin/catalogue_decorator.rb
140
+ class Admin::CatalogueDecorator < Draper::Decorator
141
+ # ...
142
+ end
143
+ ```
144
+
134
145
  ### Generators
135
146
 
136
147
  To create an `ApplicationDecorator` that all generated decorators inherit from, run...
@@ -155,6 +166,15 @@ rails generate decorator Article
155
166
 
156
167
  ...to create the `ArticleDecorator`.
157
168
 
169
+ If you don't want Rails to generate decorator files when generating a new controller,
170
+ you can add the following configuration to your `config/application.rb` file:
171
+
172
+ ```ruby
173
+ config.generators do |g|
174
+ g.decorator false
175
+ end
176
+ ```
177
+
158
178
  ### Accessing Helpers
159
179
 
160
180
  Normal Rails helpers are still useful for lots of tasks. Both Rails' provided
@@ -664,7 +684,8 @@ great community of open source
664
684
 
665
685
  ### Current maintainers
666
686
 
667
- * Cliff Braton (cliff.braton@gmail.com)
687
+ * Alexander Senko (Alexander.Senko@gmail.com)
688
+ * Yuji Yaginuma (yuuji.yaginuma@gmail.com)
668
689
 
669
690
  ### Historical maintainers
670
691
 
@@ -673,3 +694,4 @@ great community of open source
673
694
  * Vasiliy Ermolovich
674
695
  * Andrew Haines
675
696
  * Sean Linsley
697
+ * Cliff Braton (cliff.braton@gmail.com)
data/draper.gemspec CHANGED
@@ -5,7 +5,7 @@ Gem::Specification.new do |s|
5
5
  s.version = Draper::VERSION
6
6
  s.authors = ["Jeff Casimir", "Steve Klabnik"]
7
7
  s.email = ["jeff@casimircreative.com", "steve@steveklabnik.com"]
8
- s.homepage = "http://github.com/drapergem/draper"
8
+ s.homepage = "https://github.com/drapergem/draper"
9
9
  s.summary = "View Models for Rails"
10
10
  s.description = "Draper adds an object-oriented layer of presentation logic to your Rails apps."
11
11
  s.license = "MIT"
@@ -26,9 +26,9 @@ Gem::Specification.new do |s|
26
26
  s.add_development_dependency 'ammeter'
27
27
  s.add_development_dependency 'rake'
28
28
  s.add_development_dependency 'rspec-rails'
29
+ s.add_development_dependency 'rspec-activerecord-expectations'
29
30
  s.add_development_dependency 'minitest-rails'
30
31
  s.add_development_dependency 'capybara'
31
- s.add_development_dependency 'active_model_serializers', '>= 0.10'
32
32
  s.add_development_dependency 'rubocop'
33
- s.add_development_dependency 'simplecov', '0.17.1'
33
+ s.add_development_dependency 'simplecov'
34
34
  end
@@ -18,11 +18,21 @@ module Draper
18
18
  super || delegatable?(method)
19
19
  end
20
20
 
21
- # @private
22
- def delegatable?(method)
23
- return if private_methods(false).include?(method)
21
+ # The inherit argument for `private_method_defined?` is supported since Ruby 2.6.
22
+ if RUBY_VERSION >= "2.6"
23
+ # @private
24
+ def delegatable?(method)
25
+ return if self.class.private_method_defined?(method, false)
24
26
 
25
- object.respond_to?(method)
27
+ object.respond_to?(method)
28
+ end
29
+ else
30
+ # @private
31
+ def delegatable?(method)
32
+ return if private_methods(false).include?(method)
33
+
34
+ object.respond_to?(method)
35
+ end
26
36
  end
27
37
 
28
38
  module ClassMethods
@@ -0,0 +1,15 @@
1
+ module Draper
2
+ module Decoratable
3
+ module CollectionProxy
4
+ # Decorates a collection of objects. Used at the end of a scope chain.
5
+ #
6
+ # @example
7
+ # company.products.popular.decorate
8
+ # @param [Hash] options
9
+ # see {Decorator.decorate_collection}.
10
+ def decorate(options = {})
11
+ decorator_class.decorate_collection(load_target, options.reverse_merge(with: nil))
12
+ end
13
+ end
14
+ end
15
+ end
@@ -11,6 +11,8 @@ module Draper
11
11
  extend ActiveSupport::Concern
12
12
  include Draper::Decoratable::Equality
13
13
 
14
+ autoload :CollectionProxy, 'draper/decoratable/collection_proxy'
15
+
14
16
  # Decorates the object using the inferred {#decorator_class}.
15
17
  # @param [Hash] options
16
18
  # see {Decorator#initialize}
@@ -87,8 +89,6 @@ module Draper
87
89
  def ===(other)
88
90
  super || (other.is_a?(Draper::Decorator) && super(other.object))
89
91
  end
90
-
91
92
  end
92
-
93
93
  end
94
94
  end
@@ -10,7 +10,7 @@ module Draper
10
10
  end
11
11
 
12
12
  def respond_to_missing?(method, include_private = false)
13
- strategy.allowed?(method) || super
13
+ object.respond_to?(method) && strategy.allowed?(method) || super
14
14
  end
15
15
 
16
16
  private
@@ -33,10 +33,14 @@ module Draper
33
33
  end
34
34
 
35
35
  initializer 'draper.setup_orm' do
36
- [:active_record, :mongoid].each do |orm|
37
- ActiveSupport.on_load orm do
38
- Draper.setup_orm self
39
- end
36
+ ActiveSupport.on_load :active_record do
37
+ include Draper::Decoratable
38
+
39
+ ActiveRecord::Associations::CollectionProxy.include Draper::Decoratable::CollectionProxy
40
+ end
41
+
42
+ ActiveSupport.on_load :mongoid do
43
+ include Draper::Decoratable
40
44
  end
41
45
  end
42
46
 
@@ -1,3 +1,3 @@
1
1
  module Draper
2
- VERSION = '4.0.2'
2
+ VERSION = '4.0.4'
3
3
  end
@@ -38,17 +38,9 @@ module Draper
38
38
  def controller
39
39
  Draper::ViewContext.controller ||= Draper.default_controller.new
40
40
  Draper::ViewContext.controller.tap do |controller|
41
- controller.request ||= new_test_request controller if defined?(ActionController::TestRequest)
41
+ controller.request ||= ActionDispatch::TestRequest.create
42
42
  end
43
43
  end
44
-
45
- def new_test_request(controller)
46
- is_above_rails_5_1 ? ActionController::TestRequest.create(controller) : ActionController::TestRequest.create
47
- end
48
-
49
- def is_above_rails_5_1
50
- ActionController::TestRequest.method(:create).parameters.first == [:req, :controller_class]
51
- end
52
44
  end
53
45
  end
54
46
  end
data/lib/draper.rb CHANGED
@@ -51,12 +51,6 @@ module Draper
51
51
  end
52
52
  end
53
53
 
54
- def self.setup_orm(base)
55
- base.class_eval do
56
- include Draper::Decoratable
57
- end
58
- end
59
-
60
54
  class UninferrableDecoratorError < NameError
61
55
  def initialize(klass)
62
56
  super("Could not infer a decorator for #{klass}.")
@@ -147,7 +147,7 @@ module Draper
147
147
  scoped = [Product.new]
148
148
  allow(Product).to receive(:all).and_return(scoped)
149
149
 
150
- expect(Product.decorator_class).to receive(:decorate_collection).with(scoped, with: nil).and_return(:decorated_collection)
150
+ expect(Product.decorator_class).to receive(:decorate_collection).with(scoped, {with: nil}).and_return(:decorated_collection)
151
151
  expect(Product.decorate).to be :decorated_collection
152
152
  end
153
153
 
@@ -118,7 +118,7 @@ module Draper
118
118
  it "creates a CollectionDecorator using itself for each item" do
119
119
  object = [Model.new]
120
120
 
121
- expect(CollectionDecorator).to receive(:new).with(object, with: Decorator)
121
+ expect(CollectionDecorator).to receive(:new).with(object, {with: Decorator})
122
122
  Decorator.decorate_collection(object)
123
123
  end
124
124
 
@@ -134,7 +134,7 @@ module Draper
134
134
  it "creates a custom collection decorator using itself for each item" do
135
135
  object = [Model.new]
136
136
 
137
- expect(ProductsDecorator).to receive(:new).with(object, with: ProductDecorator)
137
+ expect(ProductsDecorator).to receive(:new).with(object, {with: ProductDecorator})
138
138
  ProductDecorator.decorate_collection(object)
139
139
  end
140
140
 
@@ -73,17 +73,17 @@ module Draper
73
73
  worker = ->(*){}
74
74
  allow(Factory::Worker).to receive_messages new: worker
75
75
 
76
- expect(worker).to receive(:call).with(baz: "qux", context: {foo: "bar"})
76
+ expect(worker).to receive(:call).with({baz: "qux", context: {foo: "bar"}})
77
77
  factory.decorate(double, {baz: "qux"})
78
78
  end
79
79
 
80
80
  it "is overridden by explicitly-specified context" do
81
- factory = Factory.new(context: {foo: "bar"})
81
+ factory = Factory.new({context: {foo: "bar"}})
82
82
  worker = ->(*){}
83
83
  allow(Factory::Worker).to receive_messages new: worker
84
84
 
85
- expect(worker).to receive(:call).with(context: {baz: "qux"})
86
- factory.decorate(double, context: {baz: "qux"})
85
+ expect(worker).to receive(:call).with({context: {baz: "qux"}})
86
+ factory.decorate(double, {context: {baz: "qux"}})
87
87
  end
88
88
  end
89
89
  end
@@ -109,7 +109,7 @@ module Draper
109
109
  allow(worker).to receive_messages decorator: decorator
110
110
  context = {foo: "bar"}
111
111
 
112
- expect(decorator).to receive(:call).with(anything(), context: context)
112
+ expect(decorator).to receive(:call).with(anything(), {context: context})
113
113
  worker.call(context: ->{ context })
114
114
  end
115
115
 
@@ -140,7 +140,7 @@ module Draper
140
140
  allow(worker).to receive_messages decorator: decorator
141
141
  context = {foo: "bar"}
142
142
 
143
- expect(decorator).to receive(:call).with(anything(), context: context)
143
+ expect(decorator).to receive(:call).with(anything(), {context: context})
144
144
  worker.call(context: context)
145
145
  end
146
146
  end
@@ -150,7 +150,7 @@ module Draper
150
150
  decorator = ->(*){}
151
151
  allow(worker).to receive_messages decorator: decorator
152
152
 
153
- expect(decorator).to receive(:call).with(anything(), foo: "bar")
153
+ expect(decorator).to receive(:call).with(anything(), {foo: "bar"})
154
154
  worker.call(foo: "bar", context_args: [])
155
155
  end
156
156
  end
@@ -228,7 +228,7 @@ module Draper
228
228
  allow(object).to receive(:decorate){ nil }
229
229
  worker = Factory::Worker.new(nil, object)
230
230
 
231
- expect(decorator_class).to receive(:decorate_collection).with(object, foo: "bar", with: nil).and_return(:decorated)
231
+ expect(decorator_class).to receive(:decorate_collection).with(object, {foo: "bar", with: nil}).and_return(:decorated)
232
232
  expect(worker.decorator.call(object, foo: "bar")).to be :decorated
233
233
  end
234
234
  end
@@ -53,14 +53,24 @@ module Draper
53
53
  context 'when strategy allows collection to call the method' do
54
54
  before do
55
55
  allow(fake_strategy).to receive(:allowed?).with(:some_query_method).and_return(true)
56
+ allow(collection).to receive(:respond_to?).with(:some_query_method).and_return(true)
56
57
  end
57
58
 
58
59
  it { is_expected.to eq(true) }
60
+
61
+ context 'and collection does not implement the method' do
62
+ before do
63
+ allow(collection).to receive(:respond_to?).with(:some_query_method).and_return(false)
64
+ end
65
+
66
+ it { is_expected.to eq(false) }
67
+ end
59
68
  end
60
69
 
61
70
  context 'when strategy does not allow collection to call the method' do
62
71
  before do
63
72
  allow(fake_strategy).to receive(:allowed?).with(:some_query_method).and_return(false)
73
+ allow(collection).to receive(:respond_to?).with(:some_query_method).and_return(true)
64
74
  end
65
75
 
66
76
  it { is_expected.to eq(false) }
@@ -37,7 +37,7 @@ module Draper
37
37
 
38
38
  expect(controller.request).to be_nil
39
39
  strategy.call
40
- expect(controller.request).to be_an ActionController::TestRequest
40
+ expect(controller.request).to be_an ActionDispatch::TestRequest
41
41
  expect(controller.params).to be_empty
42
42
 
43
43
  # sanity checks
@@ -45,23 +45,6 @@ module Draper
45
45
  expect(controller.view_context.params).to be controller.params
46
46
  end
47
47
 
48
- it "compatible with rails 5.1 change on ActionController::TestRequest.create method" do
49
- ActionController::TestRequest.class_eval do
50
- if ActionController::TestRequest.method(:create).parameters.first == []
51
- def create controller_class
52
- create
53
- end
54
- end
55
- end
56
- controller = Class.new(ActionController::Base).new
57
- allow(ViewContext).to receive_messages controller: controller
58
- strategy = ViewContext::BuildStrategy::Full.new
59
-
60
- expect(controller.request).to be_nil
61
- strategy.call
62
- expect(controller.request).to be_an ActionController::TestRequest
63
- end
64
-
65
48
  it "adds methods to the view context from the constructor block" do
66
49
  allow(ViewContext).to receive(:controller).and_return(fake_controller)
67
50
  strategy = ViewContext::BuildStrategy::Full.new do
data/spec/dummy/.rspec CHANGED
@@ -1,2 +1 @@
1
- --color
2
1
  --format progress
@@ -0,0 +1,13 @@
1
+ class CommentDecorator < Draper::Decorator
2
+ delegate_all
3
+
4
+ # Define presentation-specific methods here. Helpers are accessed through
5
+ # `helpers` (aka `h`). You can override attributes, for example:
6
+ #
7
+ # def created_at
8
+ # helpers.content_tag :span, class: 'time' do
9
+ # object.created_at.strftime("%a %m/%d/%y")
10
+ # end
11
+ # end
12
+
13
+ end
@@ -1,4 +1,2 @@
1
- if defined?(Mongoid)
2
- class MongoidPostDecorator < Draper::Decorator
3
- end
1
+ class MongoidPostDecorator < Draper::Decorator
4
2
  end
@@ -1,5 +1,3 @@
1
- if defined?(Devise)
2
- class Admin
3
- extend Devise::Models
4
- end
1
+ class Admin
2
+ extend Devise::Models if defined? Devise
5
3
  end
@@ -0,0 +1,3 @@
1
+ class Comment < ApplicationRecord
2
+ belongs_to :post
3
+ end
@@ -1,5 +1,3 @@
1
- if defined?(Mongoid)
2
- class MongoidPost
3
- include Mongoid::Document
4
- end
1
+ class MongoidPost
2
+ include Mongoid::Document if defined? Mongoid
5
3
  end
@@ -1,3 +1,7 @@
1
1
  class Post < ApplicationRecord
2
2
  # attr_accessible :title, :body
3
+
4
+ has_many :comments
5
+
6
+ broadcasts if defined? Turbo::Broadcastable
3
7
  end
@@ -1,5 +1,3 @@
1
- if defined?(Devise)
2
- class User
3
- extend Devise::Models
4
- end
1
+ class User
2
+ extend Devise::Models if defined? Devise
5
3
  end