Don't override presentee methods for Gitlab::View::Presenter::Delegated

Signed-off-by: Rémy Coutable <remy@rymai.me>
This commit is contained in:
Rémy Coutable 2017-01-20 18:13:14 +01:00
parent b60de9c0fd
commit 0ac65b6cc3
6 changed files with 27 additions and 22 deletions

View file

@ -94,7 +94,7 @@ class Projects::BuildsController < Projects::ApplicationController
private
def build
@build ||= project.builds.find_by!(id: params[:id]).present(user: current_user)
@build ||= project.builds.find_by!(id: params[:id]).present(current_user: current_user)
end
def build_path(build)

View file

@ -113,7 +113,7 @@ detects the presenter based on the presented subject's class.
class Projects::LabelsController < Projects::ApplicationController
def edit
@label = Gitlab::View::Presenter::Factory
.new(@label, user: current_user)
.new(@label, current_user: current_user)
.fabricate!
end
end
@ -132,7 +132,7 @@ and then in the controller:
```ruby
class Projects::LabelsController < Projects::ApplicationController
def edit
@label = @label.present(user: current_user)
@label = @label.present(current_user: current_user)
end
end
```
@ -147,7 +147,7 @@ end
You can also present the model in the view:
```ruby
- label = @label.present(current_user)
- label = @label.present(current_user: current_user)
%div{ class: label.text_color }
= render partial: label, label: label

View file

@ -8,7 +8,9 @@ module Gitlab
@subject = subject
attributes.each do |key, value|
define_singleton_method(key) { value }
unless subject.respond_to?(key)
define_singleton_method(key) { value }
end
end
super(subject)

View file

@ -1,7 +1,7 @@
require 'spec_helper'
describe Gitlab::View::Presenter::Delegated do
let(:project) { double(:project, bar: 'baz') }
let(:project) { double(:project, user: 'John Doe') }
let(:presenter_class) do
Class.new(described_class)
end
@ -12,10 +12,15 @@ describe Gitlab::View::Presenter::Delegated do
describe '#initialize' do
it 'takes arbitrary key/values and exposes them' do
presenter = presenter_class.new(project, user: 'user', foo: 'bar')
presenter = presenter_class.new(project, current_user: 'Jane Doe')
expect(presenter.user).to eq('user')
expect(presenter.foo).to eq('bar')
expect(presenter.current_user).to eq('Jane Doe')
end
it 'does not override the presentee attributes' do
presenter = presenter_class.new(project, user: 'Jane Doe')
expect(presenter.user).to eq('John Doe')
end
end
@ -23,7 +28,7 @@ describe Gitlab::View::Presenter::Delegated do
it 'forwards missing methods to subject' do
presenter = presenter_class.new(project)
expect(presenter.bar).to eq('baz')
expect(presenter.user).to eq('John Doe')
end
end
end

View file

@ -22,13 +22,6 @@ describe Gitlab::View::Presenter::Factory do
end
describe '#fabricate!' do
it 'exposes given params' do
presenter = described_class.new(build, user: 'user', foo: 'bar').fabricate!
expect(presenter.user).to eq('user')
expect(presenter.foo).to eq('bar')
end
it 'detects the presenter based on the given subject' do
presenter = described_class.new(build).fabricate!

View file

@ -1,7 +1,7 @@
require 'spec_helper'
describe Gitlab::View::Presenter::Simple do
let(:project) { double(:project) }
let(:project) { double(:project, user: 'John Doe') }
let(:presenter_class) do
Class.new(described_class)
end
@ -12,10 +12,15 @@ describe Gitlab::View::Presenter::Simple do
describe '#initialize' do
it 'takes arbitrary key/values and exposes them' do
presenter = presenter_class.new(project, user: 'user', foo: 'bar')
presenter = presenter_class.new(project, current_user: 'Jane Doe')
expect(presenter.user).to eq('user')
expect(presenter.foo).to eq('bar')
expect(presenter.current_user).to eq('Jane Doe')
end
it 'override the presentee attributes' do
presenter = presenter_class.new(project, user: 'Jane Doe')
expect(presenter.user).to eq('Jane Doe')
end
end
@ -23,7 +28,7 @@ describe Gitlab::View::Presenter::Simple do
it 'does not forward missing methods to subject' do
presenter = presenter_class.new(project)
expect { presenter.foo }.to raise_error(NoMethodError)
expect { presenter.user }.to raise_error(NoMethodError)
end
end
end