автоматическое подключение декоратора от Draper в rails 3

Если использовать декоратор Draper, то для использования методов модели описанных в декораторе приходиться использовать явное подключение декоратора через YourModelDecorator.new() или YourModelDecorator.decorate(). Британскими учеными установлено, что явное подключение декоратора утомляет и вызывает сонливость.

Для отказа от постоянного декорирования можно задействовать метод класса, который вызывается в случае отсутствия метода с указанным именем method_missing().

1
2
3
4
5
6
7
8
9
10
11
12
class YourModel < ActiveRecord::Base
...
  def method_missing(name, *args, &block)
    puts "tried to handle unknown method %s" % name
    your_model=YourModelDecorator.new self
    return your_model.send(name.to_sym, *args,&block) if block_given? && !args.empty?
    return your_model.send(name.to_sym, *args) unless args.empty?
    return your_model.send(name.to_sym, &block) if block_given?
    your_model.send(name.to_sym)
  end
...
end

И пусть, в самом декораторе, например, следующее:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class YourModelDecorator < ApplicationDecorator
...
  def test
    puts "method without args & block"
  end
  def test_with_args(str)
    puts "method with args: #{str}"
  end
  def test_with_block
    puts "start block"
    yield if block_given?
    puts "end block"
  end
  def test_with_args_and_block(str,&block)
    puts "start block with #{str}"
    yield block
    puts "end block"
  end
...
end

Теперь можно увидеть в консоли примерно следующее:

> your_model=YourModel.first
> your_model.unknown_method
tried to handle unknown method unknown_method
NoMethodError: undefined method `unknown_method'
> your_model.test
tried to handle unknown method test
method without args & block
 => nil 
> your_model.test_with_args("i don't like the drugs")
tried to handle unknown method test_with_args
method with args: i don't like the drugs
 => nil 
> your_model.test_with_block{puts "but the drugs like me"}
tried to handle unknown method test_with_block
start block
but the drugs like me
end block
 => nil 
> your_model.test_with_args_and_block("there's a hole in our soul"){puts "that we fill with dope"}
tried to handle unknown method test_with_args_and_block
start block with there's a hole in our soul
that we fill with dope
end block
 => nil 
> your_model=YourModelDecorator.new
> your_model.test
method without args & block

Не претендую на оригинальность и простоту, зато таким образом методы декоратора подгружаются только по необходимости.

No Comments.

Leave a Reply

(обязательно)

(обязательно)