<?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; upload file</title>
	<atom:link href="http://blog.lukmus.ru/tag/upload-file/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>загрузка изображений AJAX&#8217;ом на Rails 3. CarrierWave+Uploadify</title>
		<link>http://blog.lukmus.ru/2011/12/19/zagruzka-izobrazheniy-ajaxom-na-rails-3-carrierwaveuploadify/</link>
		<comments>http://blog.lukmus.ru/2011/12/19/zagruzka-izobrazheniy-ajaxom-na-rails-3-carrierwaveuploadify/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 08:04:18 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[CarrierWave]]></category>
		<category><![CDATA[imagemagick]]></category>
		<category><![CDATA[rmagick]]></category>
		<category><![CDATA[ruby on rails 3]]></category>
		<category><![CDATA[upload file]]></category>
		<category><![CDATA[Uploadify]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=1165</guid>
		<description><![CDATA[Больше года назад для загрузки изображений я выбрал Paperclip, но на данный момент поддавшись модным тенденциям переходим на аяксовую форму загрузки используя гем CarrierWave и собственно саму аяксовую примочку Uploadify. Про это уже много где написано, но все как-то разрозненно и вот я решил собрать все вместе. CarrierWave установка Прежде всего надо установить RMagick и [...]]]></description>
			<content:encoded><![CDATA[<p>Больше года назад для загрузки изображений я выбрал <a href="http://blog.lukmus.ru/?p=849">Paperclip</a>, но на данный момент поддавшись модным тенденциям переходим на аяксовую форму загрузки используя гем <a rel="nofollow" href="https://github.com/jnicklas/carrierwave" target="_blank">CarrierWave</a> и собственно саму аяксовую примочку <a rel="nofollow" href="http://www.uploadify.com/" target="_blank">Uploadify</a>.</p>
<p>Про это уже много где написано, но все как-то разрозненно и вот я решил собрать все вместе.</p>
<p><img class="aligncenter size-full wp-image-1166" title="011832" src="http://blog.lukmus.ru/wp-content/uploads/2011/12/011832.jpg" alt="" width="517" height="330" /><span id="more-1165"></span></p>
<h2>CarrierWave</h2>
<h3>установка</h3>
<p>Прежде всего надо установить RMagick и ImageMagick (здесь показан вариант для RH-линуксов):</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;">yum install</span> ImageMagick ruby-RMagick ImageMagick-devel <span style="color: #660033;">-y</span></pre></td></tr></table></div>

<p>Теперь вставляем в <code>Gemfile</code>:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">gem 'carrierwave'
gem 'rmagick'</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>

<h3>настройка в приложении</h3>
<p>Для начала создадим тестовое приложение (на всякий случай скажу, что бандлили мы уже непосредственно в приложении, здесь же я создаю новое приложение лишь чтобы были понятны мои модели):</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="bash" style="font-family:monospace;">$ rails new Testapp
$ <span style="color: #7a0874; font-weight: bold;">cd</span> Testapp
$ rails g scaffold Picture image:string
$ rake db:migrate</pre></td></tr></table></div>

<p>После установки CarrierWave появится новый генератор <code>uploader</code>, чем и надо воспользоваться чтобы создать сам аплоадер:</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>После этого появиться файл <code>app/uploaders/image_uploader.rb</code>, где лежат настройки этого аплодера.</p>
<p>Теперь надо смонтировать загрузчик и модель, для этого открываем модель Picture <code>app/models/picture.rb</code> и вставляем туда:</p>

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

<h3>хелперы форм</h3>
<p>Форма для Picture будет выглядеть должна выглядеть примерно так:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</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;">form_for</span><span style="color:#006600; font-weight:bold;">&#40;</span>@picture,:html <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span>:multipart <span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#0000FF; font-weight:bold;">true</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>= f.<span style="color:#5A0A0A; font-weight:bold;">file_field</span> <span style="color:#ff3333; font-weight:bold;">:image</span><span style="color:#006600; font-weight:bold;">%&gt;</span>
  <span style="color:#006600; font-weight:bold;">&lt;%</span>= f.<span style="color:#9900CC;">submit</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>Для отображения закачанного изображения используем хелпер:</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;">image_tag</span> task.<span style="color:#9900CC;">image_url</span>.<span style="color:#5A0A0A; font-weight:bold;">to_s</span> <span style="color:#006600; font-weight:bold;">%&gt;</span></pre></td></tr></table></div>

<p>Практически все, что написано выше я собрал из двух статей: <a rel="nofollow" href="http://asci.blog.ru/120804899.html" target="_blank">http://asci.blog.ru/120804899.html</a> и <a rel="nofollow" href="http://wiki.dgplug.org/index.php/Deploying_of_gitorious_on_fedora" target="_blank">http://wiki.dgplug.org/index.php/Deploying_of_gitorious_on_fedora</a>, так что их можно также почитать если мой пост не ясен.</p>
<h3>настройка загрузчика</h3>
<p>Как я уже писал выше настройки загрузчика находяться в <code>app/uploaders/image_uploader.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;">def</span> store_dir
    <span style="color:#996600;">&quot;uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Также очень полезной опцией являеться варианты сохранения изображений. Чтобы их было несколько надо подключить RMagick и собственно составить сами версии картинки, например:</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:#9966CC; font-weight:bold;">include</span> <span style="color:#6666ff; font-weight:bold;">CarrierWave::RMagick</span>
process <span style="color:#ff3333; font-weight:bold;">:resize_to_fit</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">800</span>, <span style="color:#006666;">800</span><span style="color:#006600; font-weight:bold;">&#93;</span>
version <span style="color:#ff3333; font-weight:bold;">:thumb</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  process <span style="color:#ff3333; font-weight:bold;">:resize_to_fill</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">200</span>,<span style="color:#006666;">200</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>Стоит знать, что <code>:resize_to_fill</code> и  <code>:resize_to_fit</code> при одинаковом разрешении делает разные вещи, одно обрезает, другое масштабирует.</p>
<p>Подробнее о настройках читаем на <a rel="nofollow" href="https://github.com/jnicklas/carrierwave" target="_blank">офсайте</a>, также можно посмотреть <a rel="nofollow" href="http://railscasts.com/episodes/253-carrierwave-file-uploads" target="_blank">RailsCast</a>.</p>
<h2>Uploadify</h2>
<p>Uploadify это набор скриптов, которые отсылают через AJAX файл, непосредственно к самим рельсам и руби оно не имеет никакого отношения.</p>
<h3>установка</h3>
<p>Качаем сам <a rel="nofollow" href="http://www.uploadify.com/download/" target="_blank">Uploadify</a> и затем распаковываем. Теперь для Rails 3.1.x кидаем файлы <code>jquery.uploadify.v2.1.4.min.js</code> и <code>swfobject.js</code> в <code>app/assets/javascripts</code>, для Rails 3.0.x закидываем их в <code>public/javascripts</code>. Первый файл надо переименовать в <code>jquery.uploadify.js</code>.</p>
<p>Файлы <code>uploadify.swf</code> и <code>cancel.png</code> кидаем в <code>app/assets/images/</code> или <code>public/images</code>, а <code>uploadify.css</code> в <code>app/assets/stylesheets/</code> или <code>public/stylesheets</code>.</p>
<p>Открываем <code>application.js</code> из <code>app/assets/javascripts</code> или <code>public/javascripts</code> для разных версий Rails соответственно, и в конец дописываем:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="" style="font-family:monospace;">//= require swfobject
//= require jquery.uploadify</pre></td></tr></table></div>

<p>В форму загрузки изображения (у меня app/views/pictures/_form.html.erb) закидываем сначала:</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="html" style="font-family:monospace;">&lt;input id=&quot;uploadify&quot; name=&quot;uploadify&quot; type=&quot;file&quot; /&gt;</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
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span>
  $<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ready</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">var</span> uploadify_script_data <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
  $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#uploadify'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">uploadify</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    uploader        <span style="color: #339933;">:</span> <span style="color: #3366CC;">'/assets/uploadify.swf'</span><span style="color: #339933;">,</span>
    script          <span style="color: #339933;">:</span> <span style="color: #3366CC;">'&lt;%=pictures_path%&gt;'</span><span style="color: #339933;">,</span>
    cancelImg       <span style="color: #339933;">:</span> <span style="color: #3366CC;">'/images/cancel.png'</span><span style="color: #339933;">,</span>
    auto            <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
    multi           <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
    removeCompleted <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
    scriptData      <span style="color: #339933;">:</span> uploadify_script_data<span style="color: #339933;">,</span>
    onComplete      <span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>event<span style="color: #339933;">,</span> ID<span style="color: #339933;">,</span> fileObj<span style="color: #339933;">,</span> doc<span style="color: #339933;">,</span> data<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<p>В принимающем контроллере (здесь app/controllers/pictures_controller.rb) прописываем например:</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;">def</span> create
    <span style="color:#0066ff; font-weight:bold;">@picture</span> = Picture.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:image</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:Filedata</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@picture</span>.<span style="color:#9900CC;">save</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>И в самом начале контроллера убираем защиту от CSRF:</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;">protect_from_forgery <span style="color:#ff3333; font-weight:bold;">:except</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:create</span></pre></td></tr></table></div>

<p>Для тех кто не хочет отключать защиту от CSRF может попытаться следовать <a rel="nofollow" href="http://stackoverflow.com/questions/8363698/rails-carrier-wave-with-jquery-uploader" target="_blank">полной инструкции</a>.</p>
<p>Если все правильно сделали, то должно получиться как на <a rel="nofollow" href="http://www.uploadify.com/demos/" target="_blank">первой демке</a>.</p>
<h2>Дополнение от 14.04.2012 (касаемо CSRF). Архиважное.</h2>
<p>Итак, чтобы не отключать защиту от CSRF нужно сделать следующее.</p>
<p>1. Бандлим гем <a rel="nofollow" href="https://github.com/trevorturk/flash_cookie_session" target="_blank">flash_cookie_session</a>, он нужен для того, чтобы не прописывать вагон всякой ерунды про поле User-Agent в заголовке запроса, если агентом является Flash, как в нашем случае.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;gem 'flash_cookie_session'&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;&gt;</span> Gemfile
bundle <span style="color: #c20cb9; font-weight: bold;">install</span></pre></td></tr></table></div>

<p>2. Прописываем в дополнительные параметры Uploadify <code>authenticity_token</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
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span>
$<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ready</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#uploadify'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">uploadify</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    uploader        <span style="color: #339933;">:</span> <span style="color: #3366CC;">'/assets/uploadify.swf'</span><span style="color: #339933;">,</span>
    script          <span style="color: #339933;">:</span> <span style="color: #3366CC;">'&lt;%=uploadify_pictures_path%&gt;'</span><span style="color: #339933;">,</span>
    cancelImg       <span style="color: #339933;">:</span> <span style="color: #3366CC;">'/assets/cancel.png'</span><span style="color: #339933;">,</span>
    auto            <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
    multi           <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
    removeCompleted <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
    buttonText      <span style="color: #339933;">:</span> <span style="color: #3366CC;">'Select Files'</span><span style="color: #339933;">,</span>
    scriptData      <span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
     <span style="color: #3366CC;">'_http_accept'</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'application/javascript'</span><span style="color: #339933;">,</span>
     <span style="color: #3366CC;">'_method'</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'put'</span><span style="color: #339933;">,</span>
     <span style="color: #3366CC;">'&lt;%=Rails.application.config.session_options[:key] %&gt;'</span><span style="color: #339933;">:</span>
     encodeURIComponent<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;%= u cookies[session_key_name] %&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
     <span style="color: #3366CC;">'authenticity_token'</span><span style="color: #339933;">:</span>
     encodeURIComponent<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;%= u form_authenticity_token %&gt;'</span><span style="color: #009900;">&#41;</span>
     <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<p>В результате этой мимикрии мы сможем оставить защиту от CSRF и сохранить сессию при запросе от Uploadify.</p>
<p>Источники дополнения:<br />
<a href="http://www.damiangalarza.com/posts/ruby-on-rails/using-uploadify-with-rails-3/" target="_blank" rel='nofollow'> http://www.damiangalarza.com/posts/ruby-on-rails/using-uploadify-with-rails-3/</a><br />
<a href="http://erniemiller.org/2010/07/09/uploadify-and-rails-3/" target="_blank" rel='nofollow'> http://erniemiller.org/2010/07/09/uploadify-and-rails-3/</a><br />
<meta property="og:image" content="http://blog.lukmus.ru/wp-content/uploads/2011/12/011832.jpg" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2011/12/19/zagruzka-izobrazheniy-ajaxom-na-rails-3-carrierwaveuploadify/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ROR 3. форма загрузки изображений</title>
		<link>http://blog.lukmus.ru/2010/12/09/ror-3-forma-zagruzki-izobrazheniy/</link>
		<comments>http://blog.lukmus.ru/2010/12/09/ror-3-forma-zagruzki-izobrazheniy/#comments</comments>
		<pubDate>Thu, 09 Dec 2010 13:55:30 +0000</pubDate>
		<dc:creator>lukmus</dc:creator>
				<category><![CDATA[ruby & ruby on rails]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[has_attached_file]]></category>
		<category><![CDATA[paperclip]]></category>
		<category><![CDATA[ROR]]></category>
		<category><![CDATA[ROR 3]]></category>
		<category><![CDATA[ruby on rails 3]]></category>
		<category><![CDATA[upload file]]></category>
		<category><![CDATA[загрузка файла]]></category>

		<guid isPermaLink="false">http://blog.lukmus.ru/?p=849</guid>
		<description><![CDATA[Этот пост не относиться к переводу офсайта рельсов. Это личный опыт. И здесь я расскажу как я делал форму с загрузкой картинок на ROR 3. установка плагина paperclip Этот плагин неимоверно облегчает работу с файлами, а точнее их загрузку из формы. Насколько я понил, в ROR 3 плагины устанавливаются не так как в предыдущих версиях, [...]]]></description>
			<content:encoded><![CDATA[<p>Этот пост не относиться к переводу офсайта рельсов. Это личный опыт.<br />
И здесь я расскажу как я делал форму с загрузкой картинок на ROR 3.</p>
<p><a href="http://blog.lukmus.ru/wp-content/uploads/2010/12/india_06.jpg"><img class="aligncenter size-full wp-image-850" title="india_06" src="http://blog.lukmus.ru/wp-content/uploads/2010/12/india_06.jpg" alt="" width="500" height="200" /></a><br />
<span id="more-849"></span></p>
<h3>установка плагина paperclip</h3>
<p>Этот плагин неимоверно облегчает работу с файлами, а точнее их загрузку из формы.</p>
<p>Насколько я понил, в ROR 3 плагины устанавливаются не так как в предыдущих версиях, соответсвенно в старых рельсах будет немного иначе. Ну а для ROR 3 вот так:</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;">rails plugin install git<span style="color: #339933;">:</span><span style="color: #666666; font-style: italic;">//github.com/thoughtbot/paperclip</span></pre></td></tr></table></div>

<p>Подробнее о плагине можно прочитать <a href="https://github.com/thoughtbot/paperclip" target="_blank">здесь</a>, там же можно и прочитать инструкцию по плагину на английском, однако, для последнего ROR&#8217;а она немного устарела.</p>
<h3>настройка приложения</h3>
<h4>модель</h4>
<p>Открываем модель, того где нужна загрузка файлов и дописываем (здесь показано напримере модели User, где поле с загружаемой картинкой &#8211; avatar):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> User <span style="color: #339933;">&lt;</span> ActiveRecord<span style="color: #339933;">::</span><span style="color: #004000;">Base</span>
    <span style="color: #339933;">&lt;</span>span style<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;color: #3366ff;&quot;</span><span style="color: #339933;">&gt;</span>has_attached_file<span style="color: #339933;">&lt;/</span>span<span style="color: #339933;">&gt;</span> <span style="color: #339933;">&lt;</span>strong<span style="color: #339933;">&gt;:</span>avatar<span style="color: #339933;">&lt;/</span>strong<span style="color: #339933;">&gt;,</span> 
    <span style="color: #339933;">&lt;</span>strong<span style="color: #339933;">&gt;:</span>styles<span style="color: #339933;">&lt;/</span>strong<span style="color: #339933;">&gt;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#123;</span> <span style="color: #339933;">:</span>medium <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;300x300&gt;&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">:</span>thumb <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;100x100&gt;&quot;</span> <span style="color: #009900;">&#125;</span>
  <span style="color: #990000;">end</span></pre></td></tr></table></div>

<p>Если вы вдруг решили что в БД должно быть поле <strong>:avatar</strong>, то оно не должно там быть. Все необходимые поля мы добавим дальше в миграции. Так что если вы сделали поле с таким именем (в данном случае :avatar), то удалите его миграцией.</p>
<h4>миграции</h4>
<p>Для добавления необходимых полей пишем миграции. И для начала создаем файл миграции (этот и другие способы читаем <a href="http://blog.lukmus.ru/?p=763" target="_blank">здесь</a>):</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;">rails generate migration AddAvatarColumnsToUser</pre></td></tr></table></div>

<p>и пишем в созданной миграции, опять же для модели <span style="color: #808000;"><code>User</code></span> с полем <code>:<span style="color: #ff6600;">avatar</span></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
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> AddAvatarColumnsToUser <span style="color: #339933;">&lt;</span> ActiveRecord<span style="color: #339933;">::</span><span style="color: #004000;">Migration</span>
    def <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">.</span>up
      add_column <span style="color: #339933;">:&lt;</span>span style<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;color: #808000;&quot;</span><span style="color: #339933;">&gt;</span>users<span style="color: #339933;">&lt;/</span>span<span style="color: #339933;">&gt;,</span> <span style="color: #339933;">:&lt;</span>span style<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;color: #ff6600;&quot;</span><span style="color: #339933;">&gt;</span>avatar<span style="color: #339933;">&lt;/</span>span<span style="color: #339933;">&gt;</span>_file_name<span style="color: #339933;">,</span>    <span style="color: #339933;">:</span>string
      add_column <span style="color: #339933;">:&lt;</span>span style<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;color: #808000;&quot;</span><span style="color: #339933;">&gt;</span>users<span style="color: #339933;">&lt;/</span>span<span style="color: #339933;">&gt;,</span> <span style="color: #339933;">:&lt;</span>span style<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;color: #ff6600;&quot;</span><span style="color: #339933;">&gt;</span>avatar<span style="color: #339933;">&lt;/</span>span<span style="color: #339933;">&gt;</span>_content_type<span style="color: #339933;">,</span> <span style="color: #339933;">:</span>string
      add_column <span style="color: #339933;">:&lt;</span>span style<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;color: #808000;&quot;</span><span style="color: #339933;">&gt;</span>users<span style="color: #339933;">&lt;/</span>span<span style="color: #339933;">&gt;,</span> <span style="color: #339933;">:&lt;</span>span style<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;color: #ff6600;&quot;</span><span style="color: #339933;">&gt;</span>avatar<span style="color: #339933;">&lt;/</span>span<span style="color: #339933;">&gt;</span>_file_size<span style="color: #339933;">,</span>    <span style="color: #339933;">:</span>integer
      add_column <span style="color: #339933;">:&lt;</span>span style<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;color: #808000;&quot;</span><span style="color: #339933;">&gt;</span>users<span style="color: #339933;">&lt;/</span>span<span style="color: #339933;">&gt;,</span> <span style="color: #339933;">:&lt;</span>span style<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;color: #ff6600;&quot;</span><span style="color: #339933;">&gt;</span>avatar<span style="color: #339933;">&lt;/</span>span<span style="color: #339933;">&gt;</span>_updated_at<span style="color: #339933;">,</span>   <span style="color: #339933;">:</span>datetime
    <span style="color: #990000;">end</span>
&nbsp;
    def <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">.</span>down
      remove_column <span style="color: #339933;">:&lt;</span>span style<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;color: #808000;&quot;</span><span style="color: #339933;">&gt;</span>users<span style="color: #339933;">&lt;/</span>span<span style="color: #339933;">&gt;,</span> <span style="color: #339933;">:&lt;</span>span style<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;color: #ff6600;&quot;</span><span style="color: #339933;">&gt;</span>avatar<span style="color: #339933;">&lt;/</span>span<span style="color: #339933;">&gt;</span>_file_name
      remove_column <span style="color: #339933;">:&lt;</span>span style<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;color: #808000;&quot;</span><span style="color: #339933;">&gt;</span>users<span style="color: #339933;">&lt;/</span>span<span style="color: #339933;">&gt;,</span> <span style="color: #339933;">:&lt;</span>span style<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;color: #ff6600;&quot;</span><span style="color: #339933;">&gt;</span>avatar<span style="color: #339933;">&lt;/</span>span<span style="color: #339933;">&gt;</span>_content_type
      remove_column <span style="color: #339933;">:&lt;</span>span style<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;color: #808000;&quot;</span><span style="color: #339933;">&gt;</span>users<span style="color: #339933;">&lt;/</span>span<span style="color: #339933;">&gt;,</span> <span style="color: #339933;">:&lt;</span>span style<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;color: #ff6600;&quot;</span><span style="color: #339933;">&gt;</span>avatar<span style="color: #339933;">&lt;/</span>span<span style="color: #339933;">&gt;</span>_file_size
      remove_column <span style="color: #339933;">:&lt;</span>span style<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;color: #808000;&quot;</span><span style="color: #339933;">&gt;</span>users<span style="color: #339933;">&lt;/</span>span<span style="color: #339933;">&gt;,</span> <span style="color: #339933;">:&lt;</span>span style<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;color: #ff6600;&quot;</span><span style="color: #339933;">&gt;</span>avatar<span style="color: #339933;">&lt;/</span>span<span style="color: #339933;">&gt;</span>_updated_at
    <span style="color: #990000;">end</span>
  <span style="color: #990000;">end</span></pre></td></tr></table></div>

<h4>представления</h4>
<p>И здесь нужно сделать немного не так как в руководстве. Открываем частицу (partial) формы (<code>_form.html.erb</code>) и исправляем помощника (helper) <code>form_for</code>:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;%</span> form_for<span style="color: #009900;">&#40;</span><span style="color: #339933;">@</span>user<span style="color: #339933;">,</span> <span style="color: #339933;">:</span><span style="color: #b1b100;">as</span><span style="color: #339933;">=&gt;:</span>user<span style="color: #339933;">,</span> <span style="color: #339933;">:</span>url <span style="color: #339933;">=&gt;</span> user_path<span style="color: #339933;">,</span>
<span style="color: #339933;">:</span>html <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#123;</span> <span style="color: #339933;">:</span>multipart <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span> <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">do</span> <span style="color: #339933;">|</span>f<span style="color: #339933;">|</span> <span style="color: #000000; font-weight: bold;">%&gt;</span></pre></td></tr></table></div>

<p>и в самой форме, где уже должно сверкать это поле с загрузкой файла пишем помощника (helper):</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;"><span style="color: #000000; font-weight: bold;">&lt;%=</span> form<span style="color: #339933;">.</span>file_field <span style="color: #339933;">:</span>avatar <span style="color: #000000; font-weight: bold;">%&gt;</span></pre></td></tr></table></div>

<p>А в представлениях, где нужно отображать картинки пишем, например, так:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;%=</span> image_tag <span style="color: #339933;">@</span>user<span style="color: #339933;">.</span>avatar<span style="color: #339933;">.</span>url <span style="color: #000000; font-weight: bold;">%&gt;</span>
  <span style="color: #000000; font-weight: bold;">&lt;%=</span> image_tag <span style="color: #339933;">@</span>user<span style="color: #339933;">.</span>avatar<span style="color: #339933;">.</span>url<span style="color: #009900;">&#40;</span><span style="color: #339933;">:</span>medium<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">%&gt;</span>
  <span style="color: #000000; font-weight: bold;">&lt;%=</span> image_tag <span style="color: #339933;">@</span>user<span style="color: #339933;">.</span>avatar<span style="color: #339933;">.</span>url<span style="color: #009900;">&#40;</span><span style="color: #339933;">:</span>thumb<span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">%&gt;</span></pre></td></tr></table></div>

<h4>контроллер</h4>
<p>Открываем контроллер нашей модели и добавляем в метод <code>create</code> (в случае если этого там нет):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"> def create
    <span style="color: #339933;">...</span>
    <span style="color: #339933;">&lt;</span>span style<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;color: #666699;&quot;</span><span style="color: #339933;">&gt;&lt;</span>strong<span style="color: #339933;">&gt;@</span>user<span style="color: #339933;">&lt;/</span>strong<span style="color: #339933;">&gt;</span> <span style="color: #339933;">=</span> User<span style="color: #339933;">.</span>create<span style="color: #009900;">&#40;</span> params<span style="color: #009900;">&#91;</span><span style="color: #339933;">&lt;</span>strong<span style="color: #339933;">&gt;:</span>user<span style="color: #339933;">&lt;/</span>strong<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">&lt;/</span>span<span style="color: #339933;">&gt;</span>
    <span style="color: #339933;">...</span>
 <span style="color: #990000;">end</span></pre></td></tr></table></div>

<h4>директории</h4>
<p>Теперь создаем директорию system и даем в ней права на запись:</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;"><span style="color: #990000;">mkdir</span> <span style="color: #000000; font-weight: bold;">public</span><span style="color: #339933;">/</span><span style="color: #990000;">system</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">chmod</span> a<span style="color: #339933;">+</span>w <span style="color: #000000; font-weight: bold;">public</span><span style="color: #339933;">/</span><span style="color: #990000;">system</span></pre></td></tr></table></div>

<p>Все. Теперь файлы будут грузится в <code>public/system/&lt;имя поля (avatar)&gt;/&lt;вариант картинки/файла&gt;/&lt;имя файла&gt;</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.lukmus.ru/2010/12/09/ror-3-forma-zagruzki-izobrazheniy/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>
