<?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; nokogiri</title>
	<atom:link href="http://blog.lukmus.ru/tag/nokogiri/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>Яндекс.Фотки+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>
	</channel>
</rss>
