20Дек
автоматическое подключение декоратора от Draper в rails 3
Posted by lukmus | Category: ruby & ruby on rails | No Comments
Если использовать декоратор 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 |
Не претендую на оригинальность и простоту, зато таким образом методы декоратора подгружаются только по необходимости.