ROR 3. форма загрузки изображений

Этот пост не относиться к переводу офсайта рельсов. Это личный опыт.
И здесь я расскажу как я делал форму с загрузкой картинок на ROR 3.


установка плагина paperclip

Этот плагин неимоверно облегчает работу с файлами, а точнее их загрузку из формы.

Насколько я понил, в ROR 3 плагины устанавливаются не так как в предыдущих версиях, соответсвенно в старых рельсах будет немного иначе. Ну а для ROR 3 вот так:

1
rails plugin install git://github.com/thoughtbot/paperclip

Подробнее о плагине можно прочитать здесь, там же можно и прочитать инструкцию по плагину на английском, однако, для последнего ROR’а она немного устарела.

настройка приложения

модель

Открываем модель, того где нужна загрузка файлов и дописываем (здесь показано напримере модели User, где поле с загружаемой картинкой – avatar):

1
2
3
4
class User < ActiveRecord::Base
    <span style="color: #3366ff;">has_attached_file</span> <strong>:avatar</strong>, 
    <strong>:styles</strong> => { :medium => "300x300>", :thumb => "100x100>" }
  end

Если вы вдруг решили что в БД должно быть поле :avatar, то оно не должно там быть. Все необходимые поля мы добавим дальше в миграции. Так что если вы сделали поле с таким именем (в данном случае :avatar), то удалите его миграцией.

миграции

Для добавления необходимых полей пишем миграции. И для начала создаем файл миграции (этот и другие способы читаем здесь):

1
rails generate migration AddAvatarColumnsToUser

и пишем в созданной миграции, опять же для модели User с полем :avatar:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class AddAvatarColumnsToUser < ActiveRecord::Migration
    def self.up
      add_column :<span style="color: #808000;">users</span>, :<span style="color: #ff6600;">avatar</span>_file_name,    :string
      add_column :<span style="color: #808000;">users</span>, :<span style="color: #ff6600;">avatar</span>_content_type, :string
      add_column :<span style="color: #808000;">users</span>, :<span style="color: #ff6600;">avatar</span>_file_size,    :integer
      add_column :<span style="color: #808000;">users</span>, :<span style="color: #ff6600;">avatar</span>_updated_at,   :datetime
    end
 
    def self.down
      remove_column :<span style="color: #808000;">users</span>, :<span style="color: #ff6600;">avatar</span>_file_name
      remove_column :<span style="color: #808000;">users</span>, :<span style="color: #ff6600;">avatar</span>_content_type
      remove_column :<span style="color: #808000;">users</span>, :<span style="color: #ff6600;">avatar</span>_file_size
      remove_column :<span style="color: #808000;">users</span>, :<span style="color: #ff6600;">avatar</span>_updated_at
    end
  end

представления

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

1
2
<% form_for(@user, :as=>:user, :url => user_path,
:html => { :multipart => true } do |f| %>

и в самой форме, где уже должно сверкать это поле с загрузкой файла пишем помощника (helper):

1
<%= form.file_field :avatar %>

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

1
2
3
<%= image_tag @user.avatar.url %>
  <%= image_tag @user.avatar.url(:medium) %>
  <%= image_tag @user.avatar.url(:thumb) %>

контроллер

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

1
2
3
4
5
 def create
    ...
    <span style="color: #666699;"><strong>@user</strong> = User.create( params[<strong>:user</strong>] )</span>
    ...
 end

директории

Теперь создаем директорию system и даем в ней права на запись:

1
mkdir public/system && chmod a+w public/system

Все. Теперь файлы будут грузится в public/system/<имя поля (avatar)>/<вариант картинки/файла>/<имя файла>.

8 Comments to “ROR 3. форма загрузки изображений”

  1. Всеволод пишет:

    Мне понравился гем uploader. Удобная загрузка аяксом. А также STI. Советую попробовать

  2. lukmus пишет:

    если у вас возникает после установки paperclip ошибка типа:

    bla-bla-bla/gems/activesupport-3.0.7/lib/active_support/dependencies.rb:239:in `require': no such file to load -- cocaine (LoadError)

    То надо открыть your_rails_app/vendor/plugins/paperclip/lib/paperclip.rb и закомментировать там строку номер 43:

    #require 'cocaine'

  3. lukmus пишет:

    Если нужен Rmagick и при установке его gem’а вылетает ошибка:
    ...
    checking for Ruby version >= 1.8.5... yes
    checking for gcc... yes
    checking for Magick-config... no
    ...

    То надо установить ImageMagick-devel:
    # yum install ImageMagick-devel.x86_64
    # gem install rmagick
    Building native extensions. This could take a while...
    Successfully installed rmagick-2.13.1
    1 gem installed
    Installing ri documentation for rmagick-2.13.1...
    Installing RDoc documentation for rmagick-2.13.1...

  4. Julia пишет:

    Сделала все как вы написали. Картинки не загружаются в эту папку. Rails 3.1
    Вот пример формы:
    {:multipart => true}, :url => theme_posts_path(@theme) do |f| %>

    Почему так – у меня вложенный маршрут: theme/id/posts – create метод.
    Вроде как выбрать файл получается, но вместо картинки создается missing.png и папка с изображениями пустая.
    Подскажите пожалуйста..

  5. Julia пишет:

    Прошу прощения. Куда-то исчез кусок формы:
    {:multipart => true}, :url => theme_posts_path(@theme) do |f| %>

  6. lukmus пишет:

    Julia, Rails 3.1 отличается от Rails 3.0.x, правда я еще не читал про отличия, но даже при беглом взгляде можно заметить, что images, javascripts и stylesheets теперь лежат не в public, а в app/assets. Это я к тому, что если даже у вас получилось сделать по информации в этом посту, вероятнее всего частично или полностью в ближайшем будущем он будет не актуален.

  7. SLT-A77 пишет:

    Matchless тему , это очень интересно для меня ))))

  8. [...] Больше года назад для загрузки изображений я выбрал Paperclip, но на данный момент поддавшись модным тенденциям [...]

Leave a Reply to SLT-A77

(обязательно)

(обязательно)