Skip to content

Commit f6cb164

Browse files
committed
Backport delegate_missing_to from Rails 5.1
1 parent caca06b commit f6cb164

File tree

5 files changed

+32
-5
lines changed

5 files changed

+32
-5
lines changed

app/models/box_form.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ class BoxForm
22
attr_reader :box, :batch_uuids
33

44
delegate :purpose, :purpose=, to: :box
5-
delegate :model_name, :errors, to: :box
5+
delegate_missing_to :box
66

77
def self.build(navigation_context, params = nil)
88
box = Box.new(

app/presenters/sample_transfer_presenter.rb

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
class SampleTransferPresenter
22
attr_reader :transfer, :context, :current_user
33

4+
delegate_missing_to :transfer
5+
46
def initialize(transfer, context)
57
@transfer = transfer
68
@context = context
79
end
810

9-
# TODO(Rails 5.1): Use delegate_missing
10-
delegate :transfer_package, :sample, :confirmed_at, :confirmed?, :created_at, :receiver_institution, :sender_institution, to: :transfer
11-
1211
def receiver?
1312
context.institution == transfer.receiver_institution
1413
end

app/views/boxes/_form.haml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
= cdx_form_for(@box_form.box) do |f|
1+
= cdx_form_for(@box_form) do |f|
22
.row
33
.col
44
= f.form_field :purpose do

config/initializers/backports.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
require "delegate_missing_to"

lib/delegate_missing_to.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Backports `#delegate_missing_to` from Rails 5.1
2+
3+
unless Module.respond_to?(:delegate_missing_to)
4+
class Module
5+
def delegate_missing_to(target)
6+
target = target.to_s
7+
target = "self.#{target}" if DELEGATION_RESERVED_METHOD_NAMES.include?(target)
8+
9+
module_eval <<-RUBY, __FILE__, __LINE__ + 1
10+
def respond_to_missing?(name, include_private = false)
11+
# It may look like an oversight, but we deliberately do not pass
12+
# +include_private+, because they do not get delegated.
13+
14+
#{target}.respond_to?(name) || super
15+
end
16+
17+
def method_missing(method, *args, &block)
18+
if #{target}.respond_to?(method)
19+
#{target}.public_send(method, *args, &block)
20+
else
21+
super
22+
end
23+
end
24+
RUBY
25+
end
26+
end
27+
end

0 commit comments

Comments
 (0)