<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>по стопам webkill&#039;а &#187; method_missing</title>
	<atom:link href="http://blog.lukmus.ru/tag/method_missing/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.lukmus.ru</link>
	<description>это наш химический дом для печальных жителей Земли</description>
	<lastBuildDate>Sat, 21 Oct 2023 19:10:13 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>автоматическое подключение декоратора от Draper в rails 3</title>
		<link>http://blog.lukmus.ru/2012/12/20/avtomaticheskoe-podklyuchenie-dekorato/</link>
		<comments>http://blog.lukmus.ru/2012/12/20/avtomaticheskoe-podklyuchenie-dekorato/#comments</comments>
		<pubDate>Thu, 20 Dec 2012 08:45:45 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[draper]]></category>
		<category><![CDATA[method_missing]]></category>
		<category><![CDATA[ruby on rails 3]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=1725</guid>
		<description><![CDATA[Если использовать декоратор Draper, то для использования методов модели описанных в декораторе приходиться использовать явное подключение декоратора через YourModelDecorator.new() или YourModelDecorator.decorate(). Британскими учеными установлено, что явное подключение декоратора утомляет и вызывает сонливость. Для отказа от постоянного декорирования можно задействовать метод класса, который вызывается в случае отсутствия метода с указанным именем method_missing(). 1 2 3 4 [...]]]></description>
			<content:encoded><![CDATA[<p>Если использовать <a href="http://blog.lukmus.ru/?p=1702">декоратор Draper</a>, то для использования методов модели описанных в декораторе приходиться использовать явное подключение декоратора через <code>YourModelDecorator.new()</code> или <code>YourModelDecorator.decorate()</code>. Британскими учеными установлено, что явное подключение декоратора утомляет и вызывает сонливость.<br />
<img src="http://blog.lukmus.ru/wp-content/uploads/2012/12/x_01e790b1.jpg" alt="" title="draper" width="517"  class="aligncenter size-full wp-image-1726" /><span id="more-1725"></span><br />
Для отказа от постоянного декорирования можно задействовать метод класса, который вызывается в случае отсутствия метода с указанным именем <code>method_missing()</code>.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> YourModel <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
...
  <span style="color:#9966CC; font-weight:bold;">def</span> method_missing<span style="color:#006600; font-weight:bold;">&#40;</span>name, <span style="color:#006600; font-weight:bold;">*</span>args, <span style="color:#006600; font-weight:bold;">&amp;</span>block<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;tried to handle unknown method %s&quot;</span> <span style="color:#006600; font-weight:bold;">%</span> name
    your_model=YourModelDecorator.<span style="color:#9900CC;">new</span> <span style="color:#0000FF; font-weight:bold;">self</span>
    <span style="color:#0000FF; font-weight:bold;">return</span> your_model.<span style="color:#9900CC;">send</span><span style="color:#006600; font-weight:bold;">&#40;</span>name.<span style="color:#9900CC;">to_sym</span>, <span style="color:#006600; font-weight:bold;">*</span>args,<span style="color:#006600; font-weight:bold;">&amp;</span>block<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> block_given? <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> !args.<span style="color:#9900CC;">empty</span>?
    <span style="color:#0000FF; font-weight:bold;">return</span> your_model.<span style="color:#9900CC;">send</span><span style="color:#006600; font-weight:bold;">&#40;</span>name.<span style="color:#9900CC;">to_sym</span>, <span style="color:#006600; font-weight:bold;">*</span>args<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">unless</span> args.<span style="color:#9900CC;">empty</span>?
    <span style="color:#0000FF; font-weight:bold;">return</span> your_model.<span style="color:#9900CC;">send</span><span style="color:#006600; font-weight:bold;">&#40;</span>name.<span style="color:#9900CC;">to_sym</span>, <span style="color:#006600; font-weight:bold;">&amp;</span>block<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> block_given?
    your_model.<span style="color:#9900CC;">send</span><span style="color:#006600; font-weight:bold;">&#40;</span>name.<span style="color:#9900CC;">to_sym</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
...
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

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

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> YourModelDecorator <span style="color:#006600; font-weight:bold;">&lt;</span> ApplicationDecorator
...
  <span style="color:#9966CC; font-weight:bold;">def</span> test
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;method without args &amp; block&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> test_with_args<span style="color:#006600; font-weight:bold;">&#40;</span>str<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;method with args: #{str}&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> test_with_block
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;start block&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">yield</span> <span style="color:#9966CC; font-weight:bold;">if</span> block_given?
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;end block&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> test_with_args_and_block<span style="color:#006600; font-weight:bold;">&#40;</span>str,<span style="color:#006600; font-weight:bold;">&amp;</span>block<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;start block with #{str}&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">yield</span> block
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;end block&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
...
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

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

<div class="wp_syntax"><table><tr><td class="code"><pre class="irb" style="font-family:monospace;">&gt; your_model=YourModel.first
&gt; your_model.unknown_method
tried to handle unknown method unknown_method
NoMethodError: undefined method `unknown_method'
&gt; your_model.test
tried to handle unknown method test
method without args &amp; block
 =&gt; nil 
&gt; your_model.test_with_args(&quot;i don't like the drugs&quot;)
tried to handle unknown method test_with_args
method with args: i don't like the drugs
 =&gt; nil 
&gt; your_model.test_with_block{puts &quot;but the drugs like me&quot;}
tried to handle unknown method test_with_block
start block
but the drugs like me
end block
 =&gt; nil 
&gt; your_model.test_with_args_and_block(&quot;there's a hole in our soul&quot;){puts &quot;that we fill with dope&quot;}
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
 =&gt; nil 
&gt; your_model=YourModelDecorator.new
&gt; your_model.test
method without args &amp; block</pre></td></tr></table></div>

<p>Не претендую на оригинальность и простоту, зато таким образом методы декоратора подгружаются только по необходимости.<br />
<meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2012/12/x_01e790b1.jpg" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2012/12/20/avtomaticheskoe-podklyuchenie-dekorato/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
