<?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; has_attached_file</title>
	<atom:link href="http://blog.lukmus.ru/tag/has_attached_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>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>
