<?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; ruby on rails 3</title>
	<atom:link href="http://blog.lukmus.ru/tag/ruby-on-rails-3/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>страничное кэширование мультидоменного сайта на Rails 3+Nginx</title>
		<link>http://blog.lukmus.ru/2013/03/07/stranichnoe-keshirovanie-multidomenn/</link>
		<comments>http://blog.lukmus.ru/2013/03/07/stranichnoe-keshirovanie-multidomenn/#comments</comments>
		<pubDate>Thu, 07 Mar 2013 14:46:48 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[cache_page]]></category>
		<category><![CDATA[expire_cache]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[ruby on rails 3]]></category>
		<category><![CDATA[subdomain]]></category>
		<category><![CDATA[кэш]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=1902</guid>
		<description><![CDATA[«Наиболее эффективными считаются те запросы, которые никогда не выдаются», ― говорит Сэм Руби. Страничное кэширование с этой точки зрения не максимально эффективно, но близко к максимуму т.к. страница загруженная полностью из кэша не делает ни одного запроса к БД. Однако, в случае если сайт имеет поддомены, например, для определения локали (en.site.com, ru.site.com), кэш страницы в [...]]]></description>
			<content:encoded><![CDATA[<p>«Наиболее эффективными считаются те запросы, которые никогда не выдаются», ― говорит Сэм Руби. Страничное кэширование с этой точки зрения не максимально эффективно, но близко к максимуму т.к. страница загруженная полностью из кэша не делает ни одного запроса к БД. Однако, в случае если сайт имеет поддомены, например, для определения локали (en.site.com, ru.site.com), кэш страницы в одной локале будет затираться кэшом в другой. В этой статье мой опыт борьбы с этой проблемой.<br />
<img src="http://blog.lukmus.ru/wp-content/uploads/2013/03/patriarh.jpg" alt="" title="патриарх Кирилл" width="517" height="388" class="alignnone size-full wp-image-1903" /><span id="more-1902"></span><br />
Если загуглить решение этой проблемы, то одно из первых, что выскакивает это статья Ryan Stout <a href="http://www.agileproductions.com/blog_posts/16-Page-Caching-by-Subdomain-in-Rails-and-Nginx" target="_blank" rel='nofollow'>«Page Caching by Subdomain in Rails and Nginx»</a>. Собственно, по ней я и пытался кэшировать на поддоменах, но не все так гладко как там описано. Поэтому я кое-что добавил от себя, а кое-что изменил.</p>
<h3>ApplicationController</h3>
<p>Прежде всего, как и описано в статье надо добавить кое-что в <code>ApplicationController</code>, но тут помимо указанного у Ryan&#8217;а метода <code>cache_page</code> надо будет еще перегрузить <code>expire_page</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
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> ApplicationController <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActionController::Base</span>
...
  <span style="color:#9966CC; font-weight:bold;">def</span> cache_page<span style="color:#006600; font-weight:bold;">&#40;</span>content = <span style="color:#0000FF; font-weight:bold;">nil</span>, options = <span style="color:#0000FF; font-weight:bold;">nil</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    path = <span style="color:#996600;">&quot;/#{request.host}/&quot;</span>
    path <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#9966CC; font-weight:bold;">case</span> options
    <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#CC00FF; font-weight:bold;">Hash</span>
      url_for<span style="color:#006600; font-weight:bold;">&#40;</span>options.<span style="color:#9900CC;">merge</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:only_path</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>, <span style="color:#ff3333; font-weight:bold;">:skip_relative_url_root</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>, :<span style="color:#CC0066; font-weight:bold;">format</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> params<span style="color:#006600; font-weight:bold;">&#91;</span>:<span style="color:#CC0066; font-weight:bold;">format</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#CC0066; font-weight:bold;">String</span>
      options
    <span style="color:#9966CC; font-weight:bold;">else</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> request.<span style="color:#9900CC;">path</span>.<span style="color:#9900CC;">empty</span>? <span style="color:#006600; font-weight:bold;">||</span> request.<span style="color:#9900CC;">path</span> == <span style="color:#996600;">'/'</span>
        <span style="color:#996600;">'/index'</span>
      <span style="color:#9966CC; font-weight:bold;">else</span>
        request.<span style="color:#9900CC;">path</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">super</span><span style="color:#006600; font-weight:bold;">&#40;</span>content, path<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> expire_page<span style="color:#006600; font-weight:bold;">&#40;</span>options = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    path = <span style="color:#996600;">&quot;/#{request.host}/&quot;</span>
    params<span style="color:#006600; font-weight:bold;">&#91;</span>:<span style="color:#CC0066; font-weight:bold;">format</span><span style="color:#006600; font-weight:bold;">&#93;</span>=:html <span style="color:#9966CC; font-weight:bold;">if</span> options<span style="color:#006600; font-weight:bold;">&#91;</span>:<span style="color:#CC0066; font-weight:bold;">format</span><span style="color:#006600; font-weight:bold;">&#93;</span>
    path <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#9966CC; font-weight:bold;">case</span> options
    <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#CC00FF; font-weight:bold;">Hash</span>
      url_for<span style="color:#006600; font-weight:bold;">&#40;</span>options.<span style="color:#9900CC;">merge</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:only_path</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>, :<span style="color:#CC0066; font-weight:bold;">format</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> params<span style="color:#006600; font-weight:bold;">&#91;</span>:<span style="color:#CC0066; font-weight:bold;">format</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#CC0066; font-weight:bold;">String</span>
      options
    <span style="color:#9966CC; font-weight:bold;">else</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> request.<span style="color:#9900CC;">path</span>.<span style="color:#9900CC;">empty</span>? <span style="color:#006600; font-weight:bold;">||</span> request.<span style="color:#9900CC;">path</span> == <span style="color:#996600;">'/'</span>
        <span style="color:#996600;">'/index'</span>
      <span style="color:#9966CC; font-weight:bold;">else</span>
        request.<span style="color:#9900CC;">path</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9966CC; font-weight:bold;">class</span>.<span style="color:#9900CC;">expire_page</span><span style="color:#006600; font-weight:bold;">&#40;</span>path<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>

<h3>настройка самого rails-приложения</h3>
<p>Согласно статье, кэш будет храниться в директории <code>public/cache</code>. Чтобы так и было нужно, во-первых, создать папку <code>cache</code> в <code>public</code>, а, во-вторых, сообщить о пути кэша самому приложению. Для этого можно, например, в <code>config/environments/production.rb</code> дописать:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#6666ff; font-weight:bold;">MyApp::Application</span>.<span style="color:#9900CC;">configure</span> <span style="color:#9966CC; font-weight:bold;">do</span>
...
  <span style="color:#9900CC;">config</span>.<span style="color:#9900CC;">action_controller</span>.<span style="color:#9900CC;">page_cache_directory</span> = Rails.<span style="color:#9900CC;">root</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;public/cache&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<h3>nginx</h3>
<p>В настройке сайта в <code>nginx.conf</code> нужно указать, что и в оригинальной статье:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="text" style="font-family:monospace;"># If the file exists in the public folder, send it
if (-f $request_filename) {
  break;	  
}
&nbsp;
# Check / files with index.html
if (-f $document_root/cache/$host/$uri/index.html) {
  rewrite (.*) /cache/$host/$1/index.html break;
}
&nbsp;
# Check the path + .html
if (-f $document_root/cache/$host/$uri.html) {
  rewrite (.*) /cache/$host/$1.html break;
}
&nbsp;
# Check directly
if (-f $document_root/cache/$host/$uri) {
  rewrite (.*) /cache/$host/$1 break;
}</pre></td></tr></table></div>

<p>Добавление этих условников говорит Nginx&#8217;у куда записывать кэш если его нет и откуда его читать если для данного адреса есть кэш. Вот тут и возникает проблема, Nginx не будет различать это GET-запрос или POST. И если в случае с GET, все хорошо, то когда поступает PUT-запрос на обновление модели (экшены <code>update</code> и <code>show</code> имеют один и тот же URL по умолчанию) Nginx с радостью обнаружит закэшированную страницу и выдаст ошибку 505.<br />
Язык конфигурации Nginx не поддерживает вложенные условники и не понимает конъюнкцию (&#038;&#038; или AND или еще как угодно), все, что остается это строить велосипед что-то типа:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="text" style="font-family:monospace;">if ( $request_method = GET ) {
  set $method_and_file &quot;method&quot;;
}
&nbsp;
if (-f $request_filename) {
  set $method_and_file $method_and_file+&quot;&amp;file&quot;;
}
&nbsp;
if ($method_and_file = &quot;method&amp;file&quot;) {
  break;
}</pre></td></tr></table></div>

<p>Но эти костыли у меня не завелись с первого раза и я забил на эти грязные мысли.</p>
<h2>как же тогда обновить кэш?</h2>
<p>Для обновления кэша я предлагаю такой, на мой взгляд, не самый кровавый вариант. Надо делать форму модели AJAX-вую и в вызове <code>expire_cache</code> явно указывать формат кэша.</p>
<h3>пример на модели Page</h3>
<p><strong>app/controllers/pages_controller.rb:</strong></p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> PagesController <span style="color:#006600; font-weight:bold;">&lt;</span> ApplicationController
...
  <span style="color:#9900CC;">caches_page</span> <span style="color:#ff3333; font-weight:bold;">:show</span>
  caches_page <span style="color:#ff3333; font-weight:bold;">:index</span>
...
  <span style="color:#9966CC; font-weight:bold;">def</span> update
    respond_to <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span><span style="color:#CC0066; font-weight:bold;">format</span><span style="color:#006600; font-weight:bold;">|</span>
      <span style="color:#9966CC; font-weight:bold;">if</span> <span style="color:#0066ff; font-weight:bold;">@page</span>.<span style="color:#9900CC;">update_attributes</span><span style="color:#006600; font-weight:bold;">&#40;</span>params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:page</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        expire_page<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#123;</span>action: <span style="color:#ff3333; font-weight:bold;">:show</span>, id: <span style="color:#0066ff; font-weight:bold;">@page</span>.<span style="color:#9900CC;">id</span>, <span style="color:#CC0066; font-weight:bold;">format</span>: <span style="color:#ff3333; font-weight:bold;">:html</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        expire_page<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#123;</span>action: <span style="color:#ff3333; font-weight:bold;">:index</span>, <span style="color:#CC0066; font-weight:bold;">format</span>: <span style="color:#ff3333; font-weight:bold;">:html</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
        <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">html</span> <span style="color:#006600; font-weight:bold;">&#123;</span> redirect_to <span style="color:#0066ff; font-weight:bold;">@page</span>, notice: <span style="color:#996600;">'Page was successfully updated.'</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
        <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">js</span>
      <span style="color:#9966CC; font-weight:bold;">else</span>
        <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">html</span> <span style="color:#006600; font-weight:bold;">&#123;</span> render action: <span style="color:#996600;">&quot;edit&quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
        <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">js</span>
        <span style="color:#008000; font-style:italic;">#format.json { render json: @page.errors, status: :unprocessable_entity }</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</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><strong>/app/views/pages/update.js:</strong></p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="javascript" style="font-family:monospace;">setTimeout<span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">'window.location.replace(&quot;&lt;%=page_path(@page)%&gt;&quot;)'</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1500</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p><strong>/app/views/pages/_form.html.erb:</strong></p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&lt;%</span>= form_for<span style="color:#006600; font-weight:bold;">&#40;</span>@page, remote: <span style="color:#0000FF; font-weight:bold;">true</span>, <span style="color:#CC0066; font-weight:bold;">format</span>: <span style="color:#ff3333; font-weight:bold;">:js</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>f<span style="color:#006600; font-weight:bold;">|%&gt;</span>
...
<span style="color:#006600; font-weight:bold;">&lt;%</span>end<span style="color:#006600; font-weight:bold;">%&gt;</span></pre></td></tr></table></div>

<p><meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2013/03/patriarh.jpg" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2013/03/07/stranichnoe-keshirovanie-multidomenn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>хлебные крошки на rails. breadcrumbs_on_rails</title>
		<link>http://blog.lukmus.ru/2013/02/05/hlebnyie-kroshki-na-rails-breadcrumbs_on_rails/</link>
		<comments>http://blog.lukmus.ru/2013/02/05/hlebnyie-kroshki-na-rails-breadcrumbs_on_rails/#comments</comments>
		<pubDate>Tue, 05 Feb 2013 22:41:19 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[breadcrumbs_on_rails]]></category>
		<category><![CDATA[ruby on rails 3]]></category>
		<category><![CDATA[хлебные крошки]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=1889</guid>
		<description><![CDATA[Хлебные крошки для RoR-приложения уже давно не нужно писать самому. Уже не менее 2-х лет существует как минимум один gem для быстрой реализации хлебных крошек ― breadcrumbs_on_rails. Ниже я только опишу свой опыт работы с этим гемом, который мало чем отличается от описанного на офстранице breadcrumbs_on_rails. установка В Gemfile добавляем: gem &#34;breadcrumbs_on_rails&#34; и бандлим: $ [...]]]></description>
			<content:encoded><![CDATA[<p>Хлебные крошки для RoR-приложения уже давно не нужно писать самому. Уже не менее 2-х лет существует как минимум один gem для быстрой реализации хлебных крошек ― <a href="https://github.com/weppos/breadcrumbs_on_rails" target="_blank" rel='nofollow'>breadcrumbs_on_rails</a>. Ниже я только опишу свой опыт работы с этим гемом, который мало чем отличается от описанного на <a href="http://www.simonecarletti.com/code/breadcrumbs_on_rails/docs/" target="_blank" rel='nofollow'>офстранице breadcrumbs_on_rails</a>.<br />
<img src="http://blog.lukmus.ru/wp-content/uploads/2013/02/425771.jpg" alt="" title="42577" width="517" height="405" class="alignnone size-full wp-image-1891" /><span id="more-1889"></span></p>
<h3>установка</h3>
<p>В Gemfile добавляем:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;">gem <span style="color:#996600;">&quot;breadcrumbs_on_rails&quot;</span></pre></td></tr></table></div>

<p>и бандлим:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;">$ </span><span style="color: #c20cb9; font-weight: bold;">su</span> <span style="color: #660033;">-c</span> <span style="color: #ff0000;">'bundle install'</span></pre></td></tr></table></div>

<h3>эксплуатация</h3>
<p>Для отображения &#8216;хлебных крошек&#8217; в нужное представление необходимо вставить хелпер:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&lt;%</span>= render_breadcrumbs <span style="color:#006600; font-weight:bold;">%&gt;</span></pre></td></tr></table></div>

<p>Хелпер может принимать параметр <code>separator</code>:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="rails" style="font-family:monospace;">&lt;body&gt;
  <span style="color:#006600; font-weight:bold;">&lt;%</span>= render_breadcrumbs <span style="color:#ff3333; font-weight:bold;">:separator</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">' / '</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>
&lt;/body&gt;</pre></td></tr></table></div>

<p>В контроллере для определения текста и ссылки &#8216;хлебной крошки&#8217; используется метод <code>add_breadcrumb</code>:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;">add_breadcrumb <span style="color:#006600; font-weight:bold;">&lt;</span>анкор<span style="color:#006600; font-weight:bold;">&gt;</span>, <span style="color:#006600; font-weight:bold;">&lt;</span>путь<span style="color:#006600; font-weight:bold;">&gt;</span>, <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&lt;</span>необязательный хэш с параметрами ссылки<span style="color:#006600; font-weight:bold;">&gt;</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></td></tr></table></div>

<p>Путь может представлять из себя как чистый &#8216;путевой&#8217; хелпер, так и символ &#8216;путевого&#8217; хелпера.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> MyController
&nbsp;
  add_breadcrumb <span style="color:#996600;">&quot;home&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:root_path</span>
  add_breadcrumb <span style="color:#996600;">&quot;my&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:my_path</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> index
    add_breadcrumb <span style="color:#996600;">&quot;index&quot;</span>, index_path, <span style="color:#ff3333; font-weight:bold;">:title</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;Back to the Index&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p><meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2013/02/425771.jpg"></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2013/02/05/hlebnyie-kroshki-na-rails-breadcrumbs_on_rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>
		<item>
		<title>rails 3 + декоратор Draper</title>
		<link>http://blog.lukmus.ru/2012/12/18/rails-3-dekorator-draper/</link>
		<comments>http://blog.lukmus.ru/2012/12/18/rails-3-dekorator-draper/#comments</comments>
		<pubDate>Tue, 18 Dec 2012 04:31:21 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[draper]]></category>
		<category><![CDATA[ruby on rails 3]]></category>
		<category><![CDATA[декоратор]]></category>
		<category><![CDATA[к]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=1702</guid>
		<description><![CDATA[Захламлять модели своими методами в Rails-приложении это говнокод, это наверное знает каждый, в отличие от меня, однако, наличие дополнительных методов может существенно облегчить представление. Решить эту дилемму помогают декораторы. Ниже описан мой опыт знакомства с декораторами на примере гема Draper. Зачем нужен рефакторинг моделей и что это такое написано еще тут. А вот гем Draper. [...]]]></description>
			<content:encoded><![CDATA[<p>Захламлять модели своими методами в Rails-приложении это говнокод, это наверное знает каждый, <del datetime="2012-12-18T00:58:42+00:00"><a href="http://rubyclub.com.ua/messages/show/18571" rel="nofollow" target="_blank">в отличие от меня</a></del>, однако, наличие дополнительных методов может существенно облегчить представление. Решить эту дилемму помогают декораторы. Ниже описан мой опыт знакомства с декораторами на примере гема Draper.<br />
<img class="aligncenter size-full wp-image-1706" title="illusion" src="http://blog.lukmus.ru/wp-content/uploads/2012/12/illusion.jpg" alt="" width="517" height="291" /><span id="more-1702"></span><br />
Зачем нужен рефакторинг моделей и что это такое написано еще <a href="http://habrahabr.ru/post/158011/" rel="nofollow" target="_blank">тут</a>. А вот <a href="https://github.com/drapergem/draper" rel="nofollow" target="_blank">гем Draper</a>.</p>
<h2>установка</h2>
<p>Тут все как обычно. Добавляем в <code>Gemfile</code></p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">gem 'draper'</pre></td></tr></table></div>

<p>и бандлим</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">bundle install</pre></td></tr></table></div>

<h2>эксплуатация</h2>
<h3>генерация</h3>
<p>Если модель генерируется после того как был установлен Draper, то декоратор создастся сам автоматически. Для ручной генерации декоратора есть команда:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">rails g decorator YourModel</pre></td></tr></table></div>

<p>После выполнения генерации можно увидеть директорию <code>app/decorators</code> где будет лежать файл <code>your_model_decorator.rb</code>. В этом файле и нужно прописывать дополнительные методы модели.</p>
<h3>ошибки</h3>
<p>Тут я не буду следовать инструкции со страницы гема т.к. она не соответствует реальности, по крайней мере с Rails 3.1.<br />
Итак, на данный момент существует файл декоратора модели YourModel <code>app/decorators/your_model_decorator.rb</code>:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</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
  decorates <span style="color:#ff3333; font-weight:bold;">:your_model</span>
  <span style="color:#008000; font-style:italic;">#bla-bla-bla</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="" style="font-family:monospace;">$ rails c
/home/username/ror/myapp/app/decorators/your_model_decorator.rb:<span style="">2</span>:in `': uninitialized constant ApplicationDecorator <span class="br0">&#40;</span>NameError<span class="br0">&#41;</span>
...</pre></td></tr></table></div>

<p>Конечно, можно создать файл <code>app/decorators/application_decorator.rb</code> как советует страница на гитхабе:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> ApplicationDecorator <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">Draper::Decorator</span>
  <span style="color:#008000; font-style:italic;"># your methods go here</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="" style="font-family:monospace;">$ rails c
/home/username/ror/myapp/app/decorators/your_model_decorator.rb:<span style="">2</span>:in `': uninitialized constant Draper::Decorator <span class="br0">&#40;</span>NameError<span class="br0">&#41;</span>
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/draper-0.12.0/lib/draper/system.rb:<span style="">9</span>:in `block in load_app_local_decorators'
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/draper-0.12.0/lib/draper/system.rb:<span style="">9</span>:in `each'
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/draper-0.12.0/lib/draper/system.rb:<span style="">9</span>:in `load_app_local_decorators'
...</pre></td></tr></table></div>

<p>Пошарясь немного по файлам в директории <code>/usr/local/rvm/gems/ruby-1.9.2-p290/gems/draper-0.12.0/lib/draper/</code>, а конкретнее в файле <code>/usr/local/rvm/gems/ruby-1.9.2-p290/gems/draper-0.12.0/lib/draper/base.rb</code> становится ясно, что <code>app/decorators/application_decorator.rb</code> надо привести к виду:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> ApplicationDecorator <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">Draper::Base</span>
  <span style="color:#008000; font-style:italic;"># your methods go here</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>И тут все ошибки резко пропадают.</p>
<h3>использование</h3>
<p>Теперь в декоратор нужно перенести лишние методы из модели. Для того чтобы экземпляры модели пополнились методами из декоратора при их использовании в контроллере или еще где-либо нужно делать так:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">&gt; your_model_exemplar=YourModel.first
&gt; your_model_exemplar.new_method_which_is_in_decorator
NoMethodError: undefined method `new_method_which_is_in_decorator' for #
&gt; your_model_exemplar=YourModelDecorator.new YourModel.first
&gt; your_model_exemplar.new_method_which_is_in_decorator
=&gt; &quot;it really works&quot;
&gt; your_model_exemplars=YourModelDecorator.decorate YourModel.first<span class="br0">&#40;</span><span style="">10</span><span class="br0">&#41;</span>
&gt; your_model_exemplars.first.new_method_which_is_in_decorator
=&gt; &quot;it really works&quot;</pre></td></tr></table></div>

<p>Для коллекции обязательно использовать метод <code>decorate</code>, для единичного экземпляра можно и <code>new</code>, и <code>decorate</code>. Сказка про <code>decorate_collection</code> для коллекции, которая написана на гитхабе это всего лишь сказка, ее рекомендации не работают в реальном мире.</p>
<h3>хелперы в декораторе</h3>
<p>Офстраница на гитхабе советует задействовать хелперы через <code>helpers</code> и сокращенную форму <code>h</code> или без дополнительных примочек просто подключив модуль <code>include Draper::LazyHelpers</code> (ниже дезинформация с https://github.com/drapergem/draper):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> ArticleDecorator <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">Draper::Decorator</span>   
  <span style="color:#9966CC; font-weight:bold;">def</span> published_at     
    date = h.<span style="color:#9900CC;">content_tag</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:span</span>, article.<span style="color:#9900CC;">published_at</span>.<span style="color:#9900CC;">strftime</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;%A, %B %e&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">squeeze</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot; &quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>, :<span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'date'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    time = h.<span style="color:#9900CC;">content_tag</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:span</span>, article.<span style="color:#9900CC;">published_at</span>.<span style="color:#9900CC;">strftime</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;%l:%M%p&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>, :<span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'time'</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">delete</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot; &quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    h.<span style="color:#9900CC;">content_tag</span> <span style="color:#ff3333; font-weight:bold;">:span</span>, date <span style="color:#006600; font-weight:bold;">+</span> time, :<span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'created_at'</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>У меня ничего из предложенного не прокатило, зато неожиданно прокатил способ с <code>helper</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
13
14
15
16
</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;">include</span> <span style="color:#6666ff; font-weight:bold;">Draper::LazyHelpers</span> <span style="color:#008000; font-style:italic;">#по идее должен избавить от явного объявления helper, но нет</span>
  decorates <span style="color:#ff3333; font-weight:bold;">:your_model</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> test_helpers
    content_tag <span style="color:#ff3333; font-weight:bold;">:div</span>, <span style="color:#996600;">&quot;it really works&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> test_helpers_via_h
    h.<span style="color:#9900CC;">content_tag</span> <span style="color:#ff3333; font-weight:bold;">:div</span>, <span style="color:#996600;">&quot;it really works&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>    
  <span style="color:#9966CC; font-weight:bold;">def</span> test_helpers_via_helpers
    helpers.<span style="color:#9900CC;">content_tag</span> <span style="color:#ff3333; font-weight:bold;">:div</span>, <span style="color:#996600;">&quot;it really works&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>   
  <span style="color:#9966CC; font-weight:bold;">def</span> may_be_that_is_working?
    helper.<span style="color:#9900CC;">content_tag</span> <span style="color:#ff3333; font-weight:bold;">:div</span>, <span style="color:#996600;">&quot;Hallelujah!&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>


<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">&gt; your_model_exemplar=YourModelDecorator.new YourModel.first
&gt; your_model_exemplar.test_helpers
NoMethodError: undefined method `content_tag' for #
&gt; your_model_exemplar.test_helpers_via_h
NoMethodError: undefined method `content_tag' for nil:NilClass
&gt; your_model_exemplar.test_helpers_via_helpers
NoMethodError: undefined method `content_tag' for nil:NilClass
&gt; your_model_exemplar.may_be_that_is_working?
=&gt; &quot;&lt;div&gt;Hallelujah!&lt;/div&gt;&quot;</pre></td></tr></table></div>

<p>Собственно все. Быть может все эти ошибки из-за того, что у меня ruby 1.9.2, а гем писался для 1.9.3 или рельсы у меня старые, а может просто доки у гема что-то типа квеста.<br />
<meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2012/12/illusion.jpg" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2012/12/18/rails-3-dekorator-draper/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>bing-переводчик на ruby</title>
		<link>http://blog.lukmus.ru/2012/10/20/bing-perevodchik-na-ruby/</link>
		<comments>http://blog.lukmus.ru/2012/10/20/bing-perevodchik-na-ruby/#comments</comments>
		<pubDate>Sat, 20 Oct 2012 20:21:52 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[bing]]></category>
		<category><![CDATA[ROR 3]]></category>
		<category><![CDATA[ruby on rails 3]]></category>
		<category><![CDATA[translator]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=1164</guid>
		<description><![CDATA[Уже давно гугл отказался предоставлять API к своему переводчику бесплатно, а у Яндекса, насколько я знаю, поддерживается еще мало языков и еще нет публичных API. Я знаю только 1 бесплатный аналог переводчику гугла &#8211; Bing Translator. В этой статье показана интеграция переводчика от Microsoft в Rails-приложение. установка Раньше я сам писал интерфейс к бингу, а [...]]]></description>
			<content:encoded><![CDATA[<p>Уже давно гугл отказался предоставлять API к своему переводчику бесплатно, а у <a href="http://translate.yandex.ru" target="_blank" rel='nofollow'>Яндекса</a>, насколько я знаю, поддерживается еще мало языков и еще нет публичных API. Я знаю только 1 бесплатный аналог переводчику гугла &#8211; <a href="http://www.bing.com/translator/" target="_blank" rel='nofollow'>Bing Translator</a>. В этой статье показана интеграция переводчика от Microsoft в Rails-приложение.<br />
<img src="http://blog.lukmus.ru/wp-content/uploads/2012/10/relig.png" alt="" title="relig" width="517" height="300" class="aligncenter size-full wp-image-1569" /><span id="more-1164"></span></p>
<h3>установка</h3>
<p>Раньше я сам писал интерфейс к бингу, а сегодня случайно нашел крутой гем <a href="https://github.com/CodeBlock/bing_translator-gem" target="_blank" rel='nofollow'>Bing Translator</a>. Все что я опишу ниже есть на офстранице гема, но все же.<br />
Установка элементарная, как обычно надо вставить в <code>Gemfile</code></p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;">gem <span style="color:#996600;">&quot;bing_translator&quot;</span>, <span style="color:#996600;">&quot;~&gt; 3.0.0&quot;</span></pre></td></tr></table></div>

<p>и забандлить</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666;"># </span>bundle <span style="color: #c20cb9; font-weight: bold;">install</span></pre></td></tr></table></div>

<h3>эксплуатация</h3>
<p>Для начала нужно создать экземпляр класса <code>BingTranslator</code>, от которого потом и надо плясать.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;">translator = BingTranslator.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'YOUR_CLIENT_ID'</span>, <span style="color:#996600;">'YOUR_CLIENT_SECRET'</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></td></tr></table></div>

<p>А вот чтобы получить эти ключи надо пройти на <a href="https://datamarket.azure.com/account" target="_blank" rel='nofollow'>Azure</a> и залогиниться там. <code>Primary Account Key</code> и <code>Customer ID</code> это, соответственно, и будут <code>YOUR_CLIENT_SECRET</code> и <code>YOUR_CLIENT_ID</code>.<br />
Чтобы перевести что-либо, например, с английского на испанский достаточно этого</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;">spanish=translator.<span style="color:#9900CC;">translate</span> <span style="color:#996600;">'Hello. This will be translated!'</span>, <span style="color:#ff3333; font-weight:bold;">:from</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'en'</span>, <span style="color:#ff3333; font-weight:bold;">:to</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'es'</span></pre></td></tr></table></div>

<p>Язык оригинала можно не указывать, в этом случае он будет определен бингом автоматически.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;">spanish=translator.<span style="color:#9900CC;">translate</span> <span style="color:#996600;">'Hello. This will be translated!'</span>, <span style="color:#ff3333; font-weight:bold;">:to</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'es'</span></pre></td></tr></table></div>

<p>В случае если нужно узнать только язык, а переводить не надо, нужно использовать метод <code>detect</code>.</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;">locale = translator.<span style="color:#9900CC;">detect</span> <span style="color:#996600;">'Hello. This will be translated!'</span> <span style="color:#008000; font-style:italic;"># =&gt; :en</span></pre></td></tr></table></div>

<p><em>p.s. Честно говоря, переводчик от бинга бесплатно переводит только 2 млн. символов в месяц, за 4 млн. уже надо платить $40 в месяц.</em><br />
<meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2012/10/relig.png" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2012/10/20/bing-perevodchik-na-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>areyouahuman на rails 3. альтернатива обычной капче</title>
		<link>http://blog.lukmus.ru/2012/10/05/areyouahuman-na-rails-3-alternativa-obyichnoy-kapche/</link>
		<comments>http://blog.lukmus.ru/2012/10/05/areyouahuman-na-rails-3-alternativa-obyichnoy-kapche/#comments</comments>
		<pubDate>Fri, 05 Oct 2012 11:59:13 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[AreYouAHuman]]></category>
		<category><![CDATA[captcha]]></category>
		<category><![CDATA[devise]]></category>
		<category><![CDATA[ruby on rails 3]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=1528</guid>
		<description><![CDATA[Современная капча под давлением программистов роботов-распознователей капчи мутировала уже во что-то непонятное, гугловскую капчу, я например, обновляю раз по 5 перед тем как смогу прочитать что там написано. Короче время привычной капчи заканчивается. Наступает время альтернативной. Например, есть такая штука как AreYouAHuman. Ниже будет показано как ее интегрировать в Rails 3 на примере Devise. установка [...]]]></description>
			<content:encoded><![CDATA[<p>Современная капча под давлением программистов роботов-распознователей капчи мутировала уже во что-то непонятное, гугловскую капчу, я например, обновляю раз по 5 перед тем как смогу прочитать что там написано. Короче время привычной капчи заканчивается. Наступает время альтернативной. Например, есть такая штука как <a rel="nofollow" href="http://areyouahuman.com/" target="_blank">AreYouAHuman</a>. Ниже будет показано как ее интегрировать в Rails 3 на примере Devise.<br />
<img class="aligncenter size-full wp-image-1529" title="dag" src="http://blog.lukmus.ru/wp-content/uploads/2012/10/dag.png" alt="" width="517" height="388" /><span id="more-1528"></span></p>
<h2>установка</h2>
<p>Для Ruby есть типо <a rel="nofollow" href="http://portal.areyouahuman.com/installation/ruby" target="_blank">инструкция</a> на офсайте, но я опишу немного по своему.<br />
Как обычно добавляем в Gemfile:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">gem 'ayah_integration'</pre></td></tr></table></div>

<p>и бандлим:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">bundle install</pre></td></tr></table></div>

<p>Теперь надо <a rel="nofollow" href="http://portal.areyouahuman.com/signup" target="_blank">зарегистрироваться на сайте</a> для получения ключей.</p>
<h2>интеграция в модель плагина Devise</h2>
<p>Предполагается, что уже есть <a href="http://blog.lukmus.ru/?p=1265">сгенерированная и настроенная модель Devise</a>. У меня модель называется User, а внедрять капчу я буду в форму восстановления пароля.</p>
<h3>интеграция в представление</h3>
<p>Если вы особо не мучали Devise генерирований различных представлений, то по умолчанию форма восстановления пароля лежит тут: <code>app/views/devise/passwords/new.html.erb</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:#006600; font-weight:bold;">&lt;%</span>ayah=<span style="color:#6666ff; font-weight:bold;">AYAH::Integration</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&lt;</span>publisher_key<span style="color:#006600; font-weight:bold;">&gt;</span>,<span style="color:#006600; font-weight:bold;">&lt;</span>scoring_key<span style="color:#006600; font-weight:bold;">&gt;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">%&gt;</span>
...
<span style="color:#006600; font-weight:bold;">&lt;%</span>= form_for<span style="color:#006600; font-weight:bold;">&#40;</span>resource,
  <span style="color:#ff3333; font-weight:bold;">:as</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> resource_name,
  <span style="color:#ff3333; font-weight:bold;">:url</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> password_path<span style="color:#006600; font-weight:bold;">&#40;</span>resource_name<span style="color:#006600; font-weight:bold;">&#41;</span>,
  <span style="color:#ff3333; font-weight:bold;">:html</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#ff3333; font-weight:bold;">:method</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:post</span> <span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>f<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>
...
<span style="color:#006600; font-weight:bold;">&lt;%</span>=ayah.<span style="color:#9900CC;">get_publisher_html</span>.<span style="color:#9900CC;">html_safe</span><span style="color:#006600; font-weight:bold;">%&gt;</span>
...
<span style="color:#006600; font-weight:bold;">&lt;%</span>end<span style="color:#006600; font-weight:bold;">%&gt;</span>
...</pre></td></tr></table></div>

<p>У AYAH есть 2 вида капчи:</p>
<ul>
<li>Lightbox &#8211; выводиться в модальном окне после нажатия кнопки &#8216;отправить&#8217; (как в комментариях в этом блоге)</li>
<li>Embedded &#8211; сразу видна в форме</li>
</ul>
<p>Так вот в зависимости от того, какой вид отображения AYAH вы выбрали в настройках, капча в форме восстановления пароля будет либо видна после события <code>submit</code>, либо сразу.</p>
<h3>интеграция в контроллер</h3>
<p>Чтобы соорудить свою обработку события &#8216;восстановление пароля&#8217; в Devise нужно сделать свой контроллер.<br />
В директории <code>app/controllers</code> нужно сделать файл <code>passwords_controller.rb</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
13
14
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> PasswordsController <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">Devise::PasswordsController</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> create
    session_secret = params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'session_secret'</span><span style="color:#006600; font-weight:bold;">&#93;</span>
    ayah = <span style="color:#6666ff; font-weight:bold;">AYAH::Integration</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&lt;</span>publisher_key<span style="color:#006600; font-weight:bold;">&gt;</span>,<span style="color:#006600; font-weight:bold;">&lt;</span>scoring_key<span style="color:#006600; font-weight:bold;">&gt;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    ayah_passed = ayah.<span style="color:#9900CC;">score_result</span><span style="color:#006600; font-weight:bold;">&#40;</span>session_secret, request.<span style="color:#9900CC;">remote_ip</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">if</span> ayah_passed
      <span style="color:#9966CC; font-weight:bold;">super</span>
    <span style="color:#9966CC; font-weight:bold;">else</span>
      respond_to <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span><span style="color:#CC0066; font-weight:bold;">format</span><span style="color:#006600; font-weight:bold;">|</span>
        <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">html</span> <span style="color:#006600; font-weight:bold;">&#123;</span> redirect_to new_user_password_path, notice: <span style="color:#996600;">'Invalid CAPTCHA'</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</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>Я тут не слишком заморачивался и вывел ошибку капчи в <code>notice</code>, хотя по нормальному ее, конечно, надо было бы добавить к ошибкам модели devise.</p>
<h3>добавление контроллера в routes.rb</h3>
<p>Последним шагом надо обозначить в <code>config/routes.rb</code>, что для passwords имеется специальный контроллер:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">...
<span style="color:#9900CC;">devise_for</span> <span style="color:#ff3333; font-weight:bold;">:users</span>, <span style="color:#ff3333; font-weight:bold;">:controllers</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#ff3333; font-weight:bold;">:passwords</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;passwords&quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
...</pre></td></tr></table></div>

<p>Надо не забывать, что после изменения <code>routes.rb</code> надо перезапустить WEBrick.</p>
<h2>Итого</h2>
<p>Многие говорят, что такую капчу роботу легче взломать, чем обычную, т.к. тут ограниченный набор картинок. Это мнение во многом справедливо, однако, современная невзламываемая капча количеством и сложностью своих манипуляций с текстом стремительно мчиться к маразму, экстенсивное развитие уже не приносит ожидаемого результата. Чем сложнее будут эффекты преобразований, тем меньше будет преймущество человека перед роботом в разгадывании этих иероглифов.<br />
Капчи подобные AYAH имеют временнУю фору &#8211; пока они станут настолько популярными, чтобы ими заинтересовались хакеры, они уже достаточно смогут пополнить базу своих картинок, игр и т.д., а быть может и эволюционировать до алгоритмов автоматической генерации игр/картинок, я имею ввиду генерации сколько угодно большого количества разных, например, ламп или бутербродов (различия не по цвету, а по форме и содержанию).<br />
Разработчик AYAH обещал в скором времени <a rel="nofollow" href="http://support.areyouahuman.com/customer/portal/articles/755542-can-we-translate-the-user-interface-or-use-different-languages-" target="_blank">добавить многоязычность интерфейса</a>, так что скоро возможно существенное расширение поля применения.<br />
<meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2012/10/dag.png" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2012/10/05/areyouahuman-na-rails-3-alternativa-obyichnoy-kapche/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sitemap на Rails 3. rails-sitemap</title>
		<link>http://blog.lukmus.ru/2012/08/08/sitemap-na-rails-3-rails-sitemap/</link>
		<comments>http://blog.lukmus.ru/2012/08/08/sitemap-na-rails-3-rails-sitemap/#comments</comments>
		<pubDate>Wed, 08 Aug 2012 02:41:43 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[rails-sitemap]]></category>
		<category><![CDATA[ROR 3]]></category>
		<category><![CDATA[ruby on rails 3]]></category>
		<category><![CDATA[sitemap]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=1472</guid>
		<description><![CDATA[Писать rake-файл, который сделает sitemap самому уже давно не модно т.к. существует 2 вагона готовых гемов для этого. Ниже я немного опишу гем rails-sitemap и самое главное покажу как его заставить делать несколько карт, например, для ситуации когда у сайта локация определяется поддоменом (напр.: ru.site.com и en.site.com). установка Как обычно закидываем в Gemfile: gem 'sitemap' [...]]]></description>
			<content:encoded><![CDATA[<p>Писать rake-файл, который сделает sitemap самому уже давно не модно т.к. существует 2 вагона готовых гемов для этого. Ниже я немного опишу гем <a rel="nofollow" href="https://github.com/viseztrance/rails-sitemap/" target="_blank">rails-sitemap</a> и самое главное покажу как его заставить делать несколько карт, например, для ситуации когда у сайта локация определяется поддоменом (напр.: ru.site.com и en.site.com).<br />
<img class="aligncenter size-full wp-image-1473" title="pussies" src="http://blog.lukmus.ru/wp-content/uploads/2012/08/pussies.png" alt="" width="517" height="368" /><span id="more-1472"></span></p>
<h3>установка</h3>
<p>Как обычно закидываем в Gemfile:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">gem 'sitemap'</pre></td></tr></table></div>

<p>и бандлим:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;"># bundle install</pre></td></tr></table></div>

<p>Далее надо сгенерировать конфигурационный файл:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">$ rails g sitemap:install</pre></td></tr></table></div>

<h3>настройка</h3>
<p>Все настройки хранятся в <code>config/sitemap.rb</code>. На странице гема на гитхабе приведены примеры некоторых настроек, для создания более тонкой конфигурации рекомендуется читать доки, ссылка на которые не указанна и в гугле не числится.<br />
Суть настройки сводится к указанию моделей по которым будет создаваться карта. Приведу пример конфигурационного файла простого сайта, у которого есть 3 модели: страницы (Pages), статьи (Articles) и новости (News). Статьи должны быть одобрены модератором, а новости интересуют только последние 100. Статей очень много.</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
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">Sitemap.<span style="color:#9900CC;">configure</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>config<span style="color:#006600; font-weight:bold;">|</span>
  config.<span style="color:#9900CC;">max_urls</span> = <span style="color:#006666;">50000</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
Sitemap::<span style="color:#CC00FF; font-weight:bold;">Generator</span>.<span style="color:#9900CC;">instance</span>.<span style="color:#CC0066; font-weight:bold;">load</span> <span style="color:#ff3333; font-weight:bold;">:host</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">'site.com'</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  path <span style="color:#ff3333; font-weight:bold;">:root</span>, <span style="color:#ff3333; font-weight:bold;">:priority</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">1</span>
  resources <span style="color:#ff3333; font-weight:bold;">:pages</span>, <span style="color:#ff3333; font-weight:bold;">:skip_index</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>,
    <span style="color:#ff3333; font-weight:bold;">:change_frequency</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;monthly&quot;</span>
  resources <span style="color:#ff3333; font-weight:bold;">:articles</span>,
    <span style="color:#ff3333; font-weight:bold;">:objects</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#CC0066; font-weight:bold;">proc</span> <span style="color:#006600; font-weight:bold;">&#123;</span>Article.<span style="color:#9900CC;">where</span><span style="color:#006600; font-weight:bold;">&#40;</span>moderatable: <span style="color:#0000FF; font-weight:bold;">true</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#125;</span>,
    <span style="color:#ff3333; font-weight:bold;">:change_frequency</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;weekly&quot;</span>
  resources <span style="color:#ff3333; font-weight:bold;">:news</span>,
    <span style="color:#ff3333; font-weight:bold;">:objects</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#CC0066; font-weight:bold;">proc</span> <span style="color:#006600; font-weight:bold;">&#123;</span>News.<span style="color:#9900CC;">last</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">100</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#125;</span>,
    <span style="color:#ff3333; font-weight:bold;">:change_frequency</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;never&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<h2>несколько карт</h2>
<h3>изменение гема</h3>
<p>Чтобы создать несколько карт для начала нужно сделать несколько rake&#8217;овых заданий в геме, для этого нужно найти файл типа <code>/usr/local/rvm/gems/ruby-1.9.2-p290/gems/sitemap-0.3.2/lib/tasks/sitemap.rake</code>, у меня Fedora 15.1 и Ruby 1.9.2-p290 через RVM, поэтому весьма вероятно, что у вас абсолютный путь до этого файла немного другой.<br />
Далее его нужно открыть и изменить (у него рутовские права, так что либо изменяйте под рутом, либо дайте права).<br />
Ниже приведен его вариант на 2 sitemap&#8217;а для английской версии сайта (en.site.com) и русской (ru.site.com), вообще-то это не принципиально, тут просто выбраны такие названия для удобства.</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
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">namespace <span style="color:#ff3333; font-weight:bold;">:sitemap</span> <span style="color:#9966CC; font-weight:bold;">do</span>
&nbsp;
  namespace <span style="color:#ff3333; font-weight:bold;">:ru</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    <span style="color:#9966CC; font-weight:bold;">def</span> ru_setup
      <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>Rails.<span style="color:#9900CC;">root</span>, <span style="color:#996600;">&quot;config&quot;</span>, <span style="color:#996600;">&quot;rusitemap&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
    desc <span style="color:#996600;">&quot;Generates a new sitemap.&quot;</span>
    task <span style="color:#ff3333; font-weight:bold;">:generate</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:environment</span> <span style="color:#9966CC; font-weight:bold;">do</span>
      ru_setup
      root = Sitemap.<span style="color:#9900CC;">configuration</span>.<span style="color:#9900CC;">save_path</span> <span style="color:#006600; font-weight:bold;">||</span>
        ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;LOCATION&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">||</span> Rails.<span style="color:#9900CC;">public_path</span>
      path = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>root, <span style="color:#996600;">&quot;sitemap.xml&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
      Sitemap::<span style="color:#CC00FF; font-weight:bold;">Generator</span>.<span style="color:#9900CC;">instance</span>.<span style="color:#9900CC;">build</span>!
      Sitemap::<span style="color:#CC00FF; font-weight:bold;">Generator</span>.<span style="color:#9900CC;">instance</span>.<span style="color:#9900CC;">save</span> path
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  namespace <span style="color:#ff3333; font-weight:bold;">:en</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    <span style="color:#9966CC; font-weight:bold;">def</span> en_setup
      <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>Rails.<span style="color:#9900CC;">root</span>, <span style="color:#996600;">&quot;config&quot;</span>, <span style="color:#996600;">&quot;ensitemap&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
    desc <span style="color:#996600;">&quot;Generates a new sitemap.&quot;</span>
    task <span style="color:#ff3333; font-weight:bold;">:generate</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:environment</span> <span style="color:#9966CC; font-weight:bold;">do</span>
      en_setup
      root = Sitemap.<span style="color:#9900CC;">configuration</span>.<span style="color:#9900CC;">save_path</span> <span style="color:#006600; font-weight:bold;">||</span>
        ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;LOCATION&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">||</span> Rails.<span style="color:#9900CC;">public_path</span>
      path = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>root, <span style="color:#996600;">&quot;sitemap.xml&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
      Sitemap::<span style="color:#CC00FF; font-weight:bold;">Generator</span>.<span style="color:#9900CC;">instance</span>.<span style="color:#9900CC;">build</span>!
      Sitemap::<span style="color:#CC00FF; font-weight:bold;">Generator</span>.<span style="color:#9900CC;">instance</span>.<span style="color:#9900CC;">save</span> path
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  desc <span style="color:#996600;">&quot;Ping engines.&quot;</span>
  task <span style="color:#ff3333; font-weight:bold;">:ping</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:environment</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    <span style="color:#6666ff; font-weight:bold;">Sitemap::Ping</span>.<span style="color:#9900CC;">send_request</span> ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;LOCATION&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</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>Тут я просто разбил пространство имен <code>sitemap</code> на 2 подпространства <code>ru</code> и <code>en</code>. Каждое подпространство содержит код идентичный коду исходного <code>sitemap</code>, где изменены названия конфигурационных файлов.<br />
Теперь надо отредактировать генератор <code>/usr/local/rvm/gems/ruby-1.9.2-p290/gems/sitemap-0.3.2/lib/sitemap/generator.rb</code> (абсолютный путь тоже может не совпадать). Тут надо изменить метод <code>save</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
13
14
15
16
17
18
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> save<span style="color:#006600; font-weight:bold;">&#40;</span>location<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">if</span> fragments.<span style="color:#9900CC;">length</span> == <span style="color:#006666;">1</span>
    <span style="color:#CC00FF; font-weight:bold;">FileUtils</span>.<span style="color:#9900CC;">mv</span><span style="color:#006600; font-weight:bold;">&#40;</span>fragments.<span style="color:#9900CC;">first</span>.<span style="color:#9900CC;">path</span>, location<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">else</span>
    remove_saved_files<span style="color:#006600; font-weight:bold;">&#40;</span>location<span style="color:#006600; font-weight:bold;">&#41;</span>
    root = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">Pathname</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>location<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">dirname</span>, <span style="color:#996600;">&quot;sitemaps&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC00FF; font-weight:bold;">Dir</span>.<span style="color:#9900CC;">mkdir</span><span style="color:#006600; font-weight:bold;">&#40;</span>root<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">unless</span> <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">directory</span>?<span style="color:#006600; font-weight:bold;">&#40;</span>root<span style="color:#006600; font-weight:bold;">&#41;</span>
    fragments.<span style="color:#9900CC;">each_with_index</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>fragment, i<span style="color:#006600; font-weight:bold;">|</span>
      file_pattern = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>root,<span style="color:#996600;">&quot;sitemap-fragment-#{i + 1}.xml&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#CC00FF; font-weight:bold;">FileUtils</span>.<span style="color:#9900CC;">mv</span><span style="color:#006600; font-weight:bold;">&#40;</span>fragment.<span style="color:#9900CC;">path</span>, file_pattern<span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">chmod</span><span style="color:#006600; font-weight:bold;">&#40;</span>0755, file_pattern<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
    file = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>location, <span style="color:#996600;">&quot;w&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    file.<span style="color:#9900CC;">write</span><span style="color:#006600; font-weight:bold;">&#40;</span>render<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;index&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#CC0066; font-weight:bold;">gsub!</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'/sitemaps/'</span>,<span style="color:#996600;">'/'</span><span style="color:#006600; font-weight:bold;">+</span>Sitemap.<span style="color:#9900CC;">configuration</span>.<span style="color:#9900CC;">locale_fragment_path</span><span style="color:#006600; font-weight:bold;">+</span><span style="color:#996600;">'/'</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    file.<span style="color:#9900CC;">close</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">chmod</span><span style="color:#006600; font-weight:bold;">&#40;</span>0755, location<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>В этом методе я только заменил <code>file.write(render "index")</code>.</p>
<h3>файлы настроек</h3>
<p>Т.к. теперь будут 2 карты, то и файлов настроек будет 2, их имена должны быть в соответствии с именами из <code>/usr/local/rvm/gems/ruby-1.9.2-p290/gems/sitemap-0.3.2/lib/tasks/sitemap.rake</code> т.е. <code>rusitemap.rb</code> и <code>ensitemap.rb</code>.<br />
Пример конфига <code>config/rusitemap.rb</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
13
14
15
16
17
18
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">Sitemap.<span style="color:#9900CC;">configure</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>config<span style="color:#006600; font-weight:bold;">|</span>
 config.<span style="color:#9900CC;">max_urls</span> = <span style="color:#006666;">1000</span>
 config.<span style="color:#9900CC;">save_path</span> = <span style="color:#CC00FF; font-weight:bold;">File</span>.
  <span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>Rails.<span style="color:#9900CC;">root</span>, <span style="color:#996600;">&quot;public&quot;</span>,<span style="color:#996600;">'sitemaps'</span>,<span style="color:#996600;">'ru'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
 config.<span style="color:#9900CC;">locale_fragment_path</span>=<span style="color:#CC00FF; font-weight:bold;">File</span>.
  <span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'sitemaps'</span>,<span style="color:#996600;">'ru'</span>,<span style="color:#996600;">'sitemaps'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
Sitemap::<span style="color:#CC00FF; font-weight:bold;">Generator</span>.<span style="color:#9900CC;">instance</span>.<span style="color:#CC0066; font-weight:bold;">load</span> <span style="color:#ff3333; font-weight:bold;">:host</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">'ru.site.com'</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  path <span style="color:#ff3333; font-weight:bold;">:root</span>, <span style="color:#ff3333; font-weight:bold;">:priority</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">1</span>
  resources <span style="color:#ff3333; font-weight:bold;">:pages</span>, <span style="color:#ff3333; font-weight:bold;">:skip_index</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>,
    <span style="color:#ff3333; font-weight:bold;">:change_frequency</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;monthly&quot;</span>
  resources <span style="color:#ff3333; font-weight:bold;">:articles</span>,
    <span style="color:#ff3333; font-weight:bold;">:objects</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#CC0066; font-weight:bold;">proc</span> <span style="color:#006600; font-weight:bold;">&#123;</span>Article.<span style="color:#9900CC;">where</span><span style="color:#006600; font-weight:bold;">&#40;</span>moderatable: <span style="color:#0000FF; font-weight:bold;">true</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#125;</span>,
    <span style="color:#ff3333; font-weight:bold;">:change_frequency</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;weekly&quot;</span>
  resources <span style="color:#ff3333; font-weight:bold;">:news</span>,
    <span style="color:#ff3333; font-weight:bold;">:objects</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#CC0066; font-weight:bold;">proc</span> <span style="color:#006600; font-weight:bold;">&#123;</span>News.<span style="color:#9900CC;">last</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">100</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#125;</span>,
    <span style="color:#ff3333; font-weight:bold;">:change_frequency</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;never&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>В файле <code>config/ensitemap.rb</code> все аналогично.</p>
<h3>запуск</h3>
<p>Теперь нужно сделать директории <code>public/sitemaps/en</code> и <code>public/sitemaps/ru</code>. После такого колдовства русская карта генерируется по команде:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">$ rake sitemap:ru:generate</pre></td></tr></table></div>

<p>английская:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">$ rake sitemap:en:generate</pre></td></tr></table></div>

<p>Карты соответственно будут лежать в только что созданных директориях.<br />
<meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2012/08/pussies.png" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2012/08/08/sitemap-na-rails-3-rails-sitemap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Яндекс.Фотки+Carrierwave на Rails 3</title>
		<link>http://blog.lukmus.ru/2012/06/14/yandeks-fotkicarrierwave-na-rails-3/</link>
		<comments>http://blog.lukmus.ru/2012/06/14/yandeks-fotkicarrierwave-na-rails-3/#comments</comments>
		<pubDate>Thu, 14 Jun 2012 14:45:49 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[CarrierWave]]></category>
		<category><![CDATA[nokogiri]]></category>
		<category><![CDATA[ROR 3]]></category>
		<category><![CDATA[ruby on rails 3]]></category>
		<category><![CDATA[яндекс.фотки]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=1311</guid>
		<description><![CDATA[Использовать свой сервер для хранения больших фото порой бывает дорого, а если вы хотите еще и хранить разные версии одного и того же изображения (например: иконка, средний размер и оригинал), то часто проделывание стольких преобразований над каждым файлом требует большого количества процессорного времени. Яндекс.Фотки предоставляет API, которые, конечно не идеальны (в смысле я бы расширил [...]]]></description>
			<content:encoded><![CDATA[<p>Использовать свой сервер для хранения больших фото порой бывает дорого, а если вы хотите еще и хранить разные версии одного и того же изображения (например: иконка, средний размер и оригинал), то часто проделывание стольких преобразований над каждым файлом требует большого количества процессорного времени. Яндекс.Фотки предоставляет API, которые, конечно не идеальны (в смысле я бы расширил их функционал), однако, могут решить вышеуказанные проблемы. Ниже будет описано как интегрировать Яндекс.Фотки в Rails 3 через Carrierwave.<br />
<a href="http://blog.lukmus.ru/wp-content/uploads/2012/06/decorated_trains_in_japan_17.jpg"><img class="aligncenter size-full wp-image-1312" title="decorated_trains_in_japan_17" src="http://blog.lukmus.ru/wp-content/uploads/2012/06/decorated_trains_in_japan_17.jpg" alt="" width="517" height="386" /></a><span id="more-1311"></span><br />
Для начала нужно зарегистрироваться на Яндексе. И дальше есть 2 способа: самому разобраться в <a rel="nofollow" href="http://api.yandex.ru/fotki/" target="_blank">API</a> или воспользоваться готовым гемом под Carrierwave. Я воспользусь вторым способом.</p>
<h2>gem carrierwave-yandexfotki</h2>
<p><a rel="nofollow" href="https://github.com/nicck/carrierwave-yandexfotki" target="_blank">Гем</a> придумал и написал <a style="text-decoration: none; font-weight: bold;" rel="nofollow" href="http://clubs.ya.ru/api-fotki/replies.xml?item_no=274" target="_blank"><span style="color: red;">n</span><span style="color: #000;">icck</span></a>, за что ему огромное спасибо, уважение и почет. Однако, гем был написан в начале прошлого года, поэтому немного устарел, а точнее стал чуть-чуть не совместим с текущей версией Rails и Ruby.</p>
<h3>установка</h3>
<p>Добавляем в Gemfile:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">gem 'carrierwave'
gem 'carrierwave-yandexfotki'</pre></td></tr></table></div>

<p>Причем именно в таком порядке иначе будет ошибка.<br />
Теперь по традиции бандлим:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">bundle install</pre></td></tr></table></div>

<p>Тут могут возникнуть проблемы с зависимостями для Nokogiri:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">...
Installing curb <span class="br0">&#40;</span>0.8.0<span class="br0">&#41;</span> with native extensions
Installing nokogiri <span class="br0">&#40;</span>1.5.4<span class="br0">&#41;</span> with native extensions
Gem::Installer::ExtensionBuildError: ERROR: Failed to
build gem native extension.
&nbsp;
        /usr/local/rvm/rubies/ruby-1.9.2-p290/bin/ruby
extconf.rb
checking for libxml/parser.h... no
-----
libxml2 is missing.  please visit ... for help with
installing dependencies.
-----
*** extconf.rb failed ***
...</pre></td></tr></table></div>

<p>В таком случае надо пройти по предложенной <a rel="nofollow" href="http://nokogiri.org/tutorials/installing_nokogiri.html" target="_blank">ссылке</a> и устранить зависимости, после чего повторить <code>bundle install</code>.<br />
Для RedHat-линуксов зависимости устраняются так:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">yum install</span> <span style="color: #660033;">-y</span> libxml2 libxml2-devel libxslt libxslt-devel</pre></td></tr></table></div>

<h3>carrierwave</h3>
<p>Теперь также как и в <a href="http://blog.lukmus.ru/?p=1165">случае с Uploadify</a> нужно сгенерировать аплодер carrierwave:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">$ rails g uploader image</pre></td></tr></table></div>

<p><em>У меня модель с фотографией называется <code>Picture</code> и у нее есть текстовое поле <code>Image</code>, все дальше описанное будет описываться в этим условием.</em></p>
<p>Теперь надо открыть сгенерированный аплодер (app/uploaders/image_uploader.rb) и привести его к такому же виду как и на странице гема на гитхабе:</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
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> ImageUploader <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">CarrierWave::Uploader::Base</span>
&nbsp;
  storage <span style="color:#6666ff; font-weight:bold;">CarrierWave::Storage::YandexFotki</span>
&nbsp;
  yandex_login    <span style="color:#996600;">'login'</span>
  yandex_password <span style="color:#996600;">'password'</span>
&nbsp;
  before <span style="color:#ff3333; font-weight:bold;">:cache</span>, <span style="color:#ff3333; font-weight:bold;">:remove_old_file_before_cache</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> remove_old_file_before_cache<span style="color:#006600; font-weight:bold;">&#40;</span>new_file<span style="color:#006600; font-weight:bold;">&#41;</span>
    remove! <span style="color:#9966CC; font-weight:bold;">unless</span> blank?
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Теперь надо примонтировать аплодер к модели (у меня Picture):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Picture <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  mount_before_save_uploader <span style="color:#ff3333; font-weight:bold;">:image</span>, ImageUploader
<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="" style="font-family:monospace;">$ rails c
Loading development environment <span class="br0">&#40;</span>Rails 3.1.1<span class="br0">&#41;</span>
&gt; pic=Picture.new
&gt; pic.remote_image_url='http://kremlin.ru/putin-platit-churovu-za-vybory.jpg'
&gt; picture.save
NameError: uninitialized constant YandexFotki::Connection::Nokogiri
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/carrierwave-yandexfotki-0.0.1/lib/yandexfotki/connection.rb:<span style="">67</span>:in `block in get_token'
...</pre></td></tr></table></div>

<p>Чтобы устранить этот косяк нужно открыть тот самый файл из ошибки (у меня /usr/local/rvm/gems/ruby-1.9.2-p290/gems/carrierwave-yandexfotki-0.0.1/lib/yandexfotki/connection.rb), найти строчку № 67:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">xml <span style="color: #339933;">=</span> Nokogiri<span style="color: #339933;">::</span><span style="color: #004000;">XML</span><span style="color: #009900;">&#40;</span>key_xml<span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>После чего вернуться в начало файла и дописать (выделено <span style="color: #333399;">фиолетовым</span>):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;yandexfotki/encryptor&quot;</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'nokogiri'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">module</span> YandexFotki
...</pre></td></tr></table></div>

<p>После этого у меня все заработало.</p>
<h3>эксплуатация</h3>
<p>В принципе она описана <a rel="nofollow" href="https://github.com/nicck/carrierwave-yandexfotki/blob/master/README.md#usage" target="_blank">здесь</a>, но я ее повторю.<br />
Загрузка файла может осуществляться как и в обычном варианте Carrierwave, я имею ввиду код в контроллере/моделе:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">pic = Picture.<span style="color:#9900CC;">new</span>
pic.<span style="color:#9900CC;">image</span> = params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:file</span><span style="color:#006600; font-weight:bold;">&#93;</span>
pic.<span style="color:#9900CC;">save</span>!
pic.<span style="color:#9900CC;">image</span>.<span style="color:#9900CC;">url</span></pre></td></tr></table></div>

<p>Варианты изображений можно получить так:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">pic.<span style="color:#9900CC;">image</span>.<span style="color:#9900CC;">url</span>       <span style="color:#008000; font-style:italic;"># ссылка на оригинал</span>
pic.<span style="color:#9900CC;">image</span>.<span style="color:#9900CC;">url</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:xl</span><span style="color:#006600; font-weight:bold;">&#41;</span>  <span style="color:#008000; font-style:italic;"># ссылка на 800x800</span></pre></td></tr></table></div>

<p>Таблица соответсвий аргументов к методу url и версии изображения:</p>
<p><a href="http://blog.lukmus.ru/wp-content/uploads/2012/06/1.png"><img class="aligncenter size-full wp-image-1327" title="1" src="http://blog.lukmus.ru/wp-content/uploads/2012/06/1.png" alt="" width="515" height="216" /></a><br />
<meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2012/06/decorated_trains_in_japan_17.jpg" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2012/06/14/yandeks-fotkicarrierwave-na-rails-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ROR 3. Devise. Управление пользователями</title>
		<link>http://blog.lukmus.ru/2012/03/23/ror-3-devise-upravlenie-polzovatelyami/</link>
		<comments>http://blog.lukmus.ru/2012/03/23/ror-3-devise-upravlenie-polzovatelyami/#comments</comments>
		<pubDate>Fri, 23 Mar 2012 06:21:06 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[devise]]></category>
		<category><![CDATA[ROR]]></category>
		<category><![CDATA[ROR 3]]></category>
		<category><![CDATA[ruby on rails 3]]></category>
		<category><![CDATA[user]]></category>
		<category><![CDATA[управление пользователями]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=1265</guid>
		<description><![CDATA[Сейчас мало таких сайтов, где не нужны были бы пользователи, точнее модель пользователей. Раньше, я как дурак, писал эту модель вручную, иногда, конечно, иначе и нельзя было поступить. А недавно я открыл для себя гем Devise для Rails, который в большинстве случаев избавляет от необходимости прописывать логику управления пользователями самому. Все, что я опишу дальше [...]]]></description>
			<content:encoded><![CDATA[<p>Сейчас мало таких сайтов, где не нужны были бы пользователи, точнее модель пользователей. Раньше, я как дурак, писал эту модель вручную, иногда, конечно, иначе и нельзя было поступить. А недавно я открыл для себя гем <a rel="nofollow" href="https://github.com/plataformatec/devise" target="_blank">Devise</a> для Rails, который в большинстве случаев избавляет от необходимости прописывать логику управления пользователями самому.<br />
<img class="aligncenter size-full wp-image-1267" title="berlin" src="http://blog.lukmus.ru/wp-content/uploads/2012/03/berlin.png" alt="" width="517" height="323" /><span id="more-1265"></span>Все, что я опишу дальше есть как на офстранице гема, так и в этих видео (русская версия Railscasts):</p>
<ol>
<li><a title="начало работы с devise" href="http://vimeo.com/14698174" target="_blank" rel="nofollow" >введение в devise</a></li>
<li><a href="http://vimeo.com/15056344" target="_blank" rel="nofollow" >настройка devise</a></li>
</ol>
<p>Все нижепроделанное относиться к RoR версии выше 3.0.1.</p>
<h2>установка</h2>
<p>Сначала, как обычно, дописываем в <code>Gemfile</code>:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">gem 'devise'</pre></td></tr></table></div>

<p>и далее опять же:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">bundle install</pre></td></tr></table></div>

<p>Теперь надо сгенерировать/интегрировать/спарить/инсталировать/и т.д. rails-приложение и devise:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">rails generate devise:install</pre></td></tr></table></div>

<p>После этого devise напишет мол надо настроить mailer и домашнюю страницу (<code>root_url</code>). Для режима development настроить mailer можно прописав в <code>config/environments/development.rb</code> опцию:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;">config.<span style="color:#9900CC;">action_mailer</span>.<span style="color:#9900CC;">default_url_options</span> =<span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#ff3333; font-weight:bold;">:host</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'localhost:3000'</span> <span style="color:#006600; font-weight:bold;">&#125;</span></pre></td></tr></table></div>

<p>Далее надо сгенерировать модель пользователей для Devise и выполнить созданные миграции:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">rails generate devise User
rake db:migrate</pre></td></tr></table></div>

<h2>настройка и эксплуатация</h2>
<h3>маршрутизация</h3>
<p>После установки devise пропишет свои особые маршруты. Строка в <code>config/routes.rb</code> вида:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;">devise_for <span style="color:#ff3333; font-weight:bold;">:users</span></pre></td></tr></table></div>

<p>мало о чем скажет, поэтому посмотреть маршруты devise можно так:</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
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">rake routes
        new_user_session GET    <span style="color: #000000; font-weight: bold;">/</span>users<span style="color: #000000; font-weight: bold;">/</span>sign_in<span style="color: #7a0874; font-weight: bold;">&#40;</span>.:format<span style="color: #7a0874; font-weight: bold;">&#41;</span>
            user_session POST   <span style="color: #000000; font-weight: bold;">/</span>users<span style="color: #000000; font-weight: bold;">/</span>sign_in<span style="color: #7a0874; font-weight: bold;">&#40;</span>.:format<span style="color: #7a0874; font-weight: bold;">&#41;</span>
    destroy_user_session DELETE <span style="color: #000000; font-weight: bold;">/</span>users<span style="color: #000000; font-weight: bold;">/</span>sign_out<span style="color: #7a0874; font-weight: bold;">&#40;</span>.:format<span style="color: #7a0874; font-weight: bold;">&#41;</span>
           user_password POST   <span style="color: #000000; font-weight: bold;">/</span>users<span style="color: #000000; font-weight: bold;">/</span>password<span style="color: #7a0874; font-weight: bold;">&#40;</span>.:format<span style="color: #7a0874; font-weight: bold;">&#41;</span>
       new_user_password GET    <span style="color: #000000; font-weight: bold;">/</span>users<span style="color: #000000; font-weight: bold;">/</span>password<span style="color: #000000; font-weight: bold;">/</span>new<span style="color: #7a0874; font-weight: bold;">&#40;</span>.:format<span style="color: #7a0874; font-weight: bold;">&#41;</span>
      edit_user_password GET    <span style="color: #000000; font-weight: bold;">/</span>users<span style="color: #000000; font-weight: bold;">/</span>password<span style="color: #000000; font-weight: bold;">/</span>edit<span style="color: #7a0874; font-weight: bold;">&#40;</span>.:format<span style="color: #7a0874; font-weight: bold;">&#41;</span>
                         PUT    <span style="color: #000000; font-weight: bold;">/</span>users<span style="color: #000000; font-weight: bold;">/</span>password<span style="color: #7a0874; font-weight: bold;">&#40;</span>.:format<span style="color: #7a0874; font-weight: bold;">&#41;</span>
cancel_user_registration GET    <span style="color: #000000; font-weight: bold;">/</span>users<span style="color: #000000; font-weight: bold;">/</span>cancel<span style="color: #7a0874; font-weight: bold;">&#40;</span>.:format<span style="color: #7a0874; font-weight: bold;">&#41;</span>
       user_registration POST   <span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">users</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>.:format<span style="color: #7a0874; font-weight: bold;">&#41;</span>
   new_user_registration GET    <span style="color: #000000; font-weight: bold;">/</span>users<span style="color: #000000; font-weight: bold;">/</span>sign_up<span style="color: #7a0874; font-weight: bold;">&#40;</span>.:format<span style="color: #7a0874; font-weight: bold;">&#41;</span>
  edit_user_registration GET    <span style="color: #000000; font-weight: bold;">/</span>users<span style="color: #000000; font-weight: bold;">/</span>edit<span style="color: #7a0874; font-weight: bold;">&#40;</span>.:format<span style="color: #7a0874; font-weight: bold;">&#41;</span>
                         PUT    <span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">users</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>.:format<span style="color: #7a0874; font-weight: bold;">&#41;</span>
                         DELETE <span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">users</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>.:format<span style="color: #7a0874; font-weight: bold;">&#41;</span>
...</pre></td></tr></table></div>

<p>Соответственно в представлении, например, ссылка на регистрацию будет выглядеть как:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&lt;%</span>=<span style="color:#5A0A0A; font-weight:bold;">link_to</span> <span style="color:#996600;">'Регистрация'</span>, new_user_registration_path <span style="color:#006600; font-weight:bold;">%&gt;</span></pre></td></tr></table></div>

<p>а на вход:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&lt;%</span>=<span style="color:#5A0A0A; font-weight:bold;">link_to</span> <span style="color:#996600;">'Войти'</span>, new_user_session_path<span style="color:#006600; font-weight:bold;">%&gt;</span></pre></td></tr></table></div>

<p>Стандартные пути можно изменить подкорректировав <code>config/routes.rb</code>, используя опцию <code>path_names</code>, например, для изменения пути регистрации изменения будут выглядеть так:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">devise_for <span style="color:#ff3333; font-weight:bold;">:users</span>, <span style="color:#ff3333; font-weight:bold;">:path_names</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#006600; font-weight:bold;">&#123;</span>sign_up: <span style="color:#996600;">'register'</span><span style="color:#006600; font-weight:bold;">&#125;</span></pre></td></tr></table></div>

<h3>методы</h3>
<p>Также в первом видео еще рассказали метод, как узнать авторизован ли пользователь:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">user_signed_in?</pre></td></tr></table></div>

<p>и, видимо, экземпляр класса модели User для текущего пользователя <code>current_user</code>, которая работает также как и экземпляр любой другой модели, например, узнать E-mail текущего авторизованного пользователя можно так:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;">current_user.<span style="color:#9900CC;">email</span></pre></td></tr></table></div>

<h3>фильтр</h3>
<p>Еще один важный момент в начале второго видео про before_filter. Чтобы узнать недопустить неавторизованного посетителя до экшенов, нужно использовать фильтр:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="ruby" style="font-family:monospace;">before_filter <span style="color:#ff3333; font-weight:bold;">:authenticate_user</span>!</pre></td></tr></table></div>

<p>Он будет перенаправлять на страницу входа.</p>
<h3>настройка представлений</h3>
<p>Для того, чтобы иметь возможность редактировать представления devise их нужно привести к обычному виду файлов представлений:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">rails g devise:views
      create  app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>devise<span style="color: #000000; font-weight: bold;">/</span>_links.erb
      invoke  form_for
      create    app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>devise<span style="color: #000000; font-weight: bold;">/</span>confirmations
      create    app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>devise<span style="color: #000000; font-weight: bold;">/</span>confirmations<span style="color: #000000; font-weight: bold;">/</span>new.html.erb
      create    app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>devise<span style="color: #000000; font-weight: bold;">/</span>passwords
      create    app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>devise<span style="color: #000000; font-weight: bold;">/</span>passwords<span style="color: #000000; font-weight: bold;">/</span>edit.html.erb
      create    app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>devise<span style="color: #000000; font-weight: bold;">/</span>passwords<span style="color: #000000; font-weight: bold;">/</span>new.html.erb
      create    app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>devise<span style="color: #000000; font-weight: bold;">/</span>registrations
      create    app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>devise<span style="color: #000000; font-weight: bold;">/</span>registrations<span style="color: #000000; font-weight: bold;">/</span>edit.html.erb
      create    app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>devise<span style="color: #000000; font-weight: bold;">/</span>registrations<span style="color: #000000; font-weight: bold;">/</span>new.html.erb
      create    app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>devise<span style="color: #000000; font-weight: bold;">/</span>sessions
      create    app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>devise<span style="color: #000000; font-weight: bold;">/</span>sessions<span style="color: #000000; font-weight: bold;">/</span>new.html.erb
      create    app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>devise<span style="color: #000000; font-weight: bold;">/</span>unlocks
      create    app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>devise<span style="color: #000000; font-weight: bold;">/</span>unlocks<span style="color: #000000; font-weight: bold;">/</span>new.html.erb
      invoke  erb
      create    app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>devise<span style="color: #000000; font-weight: bold;">/</span>mailer
      create    app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>devise<span style="color: #000000; font-weight: bold;">/</span>mailer<span style="color: #000000; font-weight: bold;">/</span>confirmation_instructions.html.erb
      create    app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>devise<span style="color: #000000; font-weight: bold;">/</span>mailer<span style="color: #000000; font-weight: bold;">/</span>reset_password_instructions.html.erb
      create    app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>devise<span style="color: #000000; font-weight: bold;">/</span>mailer<span style="color: #000000; font-weight: bold;">/</span>unlock_instructions.html.erb</pre></td></tr></table></div>

<h3>сообщения об ошибках</h3>
<p>Все сообщения devise храняться в YML-файлах локалей, по умолчанию это <code>config/locales/devise.en.yml</code>. Для добавления своей локали нужно создать файл с аналогичным именем, например, <code>config/locales/devise.ru.yml</code>.<br />
Скачать переведенные на другие языки (в т.ч. русский) локали devise можно тут: <a rel="nofollow" href="https://github.com/plataformatec/devise/wiki/I18n" target="_blank">https://github.com/plataformatec/devise/wiki/I18n</a></p>
<h3>валидация и прочие настройки</h3>
<p>Настройки валидации, как и все остальные для этого гема, находятся в <code>config/initializers/devise.rb</code>. Отключить стандартную валидацию devise можно убрав модуль <code>:validatable</code> из модели, в данном случае <code>User</code>.<br />
А вообще в devise вагон других настроек, например, теже ключи аутентификации, а которых говорят в конце второго видео, настраиваются все в том же <code>config/initializers/devise.rb</code>.<br />
Подробнее о настройках и прочих заморочках этого гема:</p>
<ol>
<li> <a href="https://github.com/plataformatec/devise" target="_blank" rel="nofollow" >офстраница</a></li>
<li> <a href="https://github.com/plataformatec/devise/wiki" target="_blank" rel="nofollow" >вики</a></li>
<li> <a href="http://rubydoc.info/github/plataformatec/devise/master/frames" target="_blank" rel="nofollow" >rubydoc</a></li>
</ol>
<p><meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2012/03/berlin.png" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2012/03/23/ror-3-devise-upravlenie-polzovatelyami/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>собственная конфигурация (свои опции) rails-приложения</title>
		<link>http://blog.lukmus.ru/2012/02/08/sobstvennaya-konfiguratsiya-svoi-optsii-ra/</link>
		<comments>http://blog.lukmus.ru/2012/02/08/sobstvennaya-konfiguratsiya-svoi-optsii-ra/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 17:52:29 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[ruby on rails 3]]></category>
		<category><![CDATA[settingslogic]]></category>
		<category><![CDATA[YML]]></category>
		<category><![CDATA[конфигурация]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=1235</guid>
		<description><![CDATA[В названии я имею ввиду не настройку Rails, которая в config/application.rb и некоторых других файлах, а место, где следует хранить конфигурацию приложения с опциями типа &#8216;количество новостей на странице&#8217; или &#8216;количество символов в отрывке текста на странице списка новостей&#8217; итд, короче говоря, свои собственные конкретные для данного приложения настройки. Хранить некоторые из таких настроек в [...]]]></description>
			<content:encoded><![CDATA[<p>В названии я имею ввиду не настройку Rails, которая в config/application.rb и некоторых других файлах, а место, где следует хранить конфигурацию приложения с опциями типа &#8216;количество новостей на странице&#8217; или &#8216;количество символов в отрывке текста на странице списка новостей&#8217; итд, короче говоря, свои собственные конкретные для данного приложения настройки.<br />
<img class="aligncenter size-full wp-image-1236" title="p_16_6_6" src="http://blog.lukmus.ru/wp-content/uploads/2012/02/p_16_6_6.jpg" alt="" width="517" height="321" /><span id="more-1235"></span><br />
Хранить некоторые из таких настроек в БД не вариант, т.к., несмотря на все кэширование запросов и прочих штук, если настройка очень часто используется есть вариант уронить сервер БД, еще раз подчеркну, что это далеко не всегда и далеко не для всех опций. Вообщем, в местах где это возможно я храню конфигурацию в файле и в не простом файле, а YML.<br />
Для таких интересных целей я использую гем <a rel="nofollow" href="https://github.com/binarylogic/settingslogic" target="_blank">settingslogic</a>. Дальше не будет ничего другого как перевод текста по ссылке выше.</p>
<h3>установка</h3>
<p>Ничего нового. Кидаем в Gemfile:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">gem 'settingslogic'</pre></td></tr></table></div>

<p>и бандлим:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">bundle install</pre></td></tr></table></div>

<p>Теперь создаем файл <code>app/models/settings.rb</code>:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Settings <span style="color:#006600; font-weight:bold;">&lt;</span> Settingslogic
  source <span style="color:#996600;">&quot;#{Rails.root}/config/application.yml&quot;</span>
  namespace Rails.<span style="color:#9900CC;">env</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<h3>где записывать настройки</h3>
<p>Создаем файл <code>config/application.yml</code> и в соответствии с форматом YML прописываем настройки, получиться что-то типа (взял с вышеуказанной офстранице гема):</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
</pre></td><td class="code"><pre class="yml" style="font-family:monospace;">defaults: &amp;defaults
  cool:
    saweet: nested settings
  neat_setting: 24
  awesome_setting: &lt;%= &quot;Did you know 5 + 5 = #{5 + 5}?&quot; %&gt;
&nbsp;
development:
  &lt;&lt;: *defaults
  neat_setting: 800
&nbsp;
test:
  &lt;&lt;: *defaults
&nbsp;
production:
  &lt;&lt;: *defaults</pre></td></tr></table></div>

<h3>как использовать в приложении</h3>
<p>В представлении, например, использовать настройку можно так:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&lt;%</span>=Settings.<span style="color:#9900CC;">neat_setting</span><span style="color:#006600; font-weight:bold;">%&gt;</span> # 800 - development, 24 - остальные
<span style="color:#006600; font-weight:bold;">&lt;%</span>=Settings.<span style="color:#9900CC;">cool</span>.<span style="color:#9900CC;">saweet</span><span style="color:#006600; font-weight:bold;">%&gt;</span> # &quot;nested settings&quot;</pre></td></tr></table></div>

<p>Ну и так далее. Короче, весело и вкусно.<br />
<meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2012/02/p_16_6_6.jpg" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2012/02/08/sobstvennaya-konfiguratsiya-svoi-optsii-ra/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
