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)>/<вариант картинки/файла>/<имя файла>
.
Мне понравился гем uploader. Удобная загрузка аяксом. А также STI. Советую попробовать
если у вас возникает после установки 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'
Если нужен 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...
Сделала все как вы написали. Картинки не загружаются в эту папку. Rails 3.1
Вот пример формы:
{:multipart => true}, :url => theme_posts_path(@theme) do |f| %>
Почему так – у меня вложенный маршрут: theme/id/posts – create метод.
Вроде как выбрать файл получается, но вместо картинки создается missing.png и папка с изображениями пустая.
Подскажите пожалуйста..
Прошу прощения. Куда-то исчез кусок формы:
{:multipart => true}, :url => theme_posts_path(@theme) do |f| %>
Julia, Rails 3.1 отличается от Rails 3.0.x, правда я еще не читал про отличия, но даже при беглом взгляде можно заметить, что images, javascripts и stylesheets теперь лежат не в public, а в app/assets. Это я к тому, что если даже у вас получилось сделать по информации в этом посту, вероятнее всего частично или полностью в ближайшем будущем он будет не актуален.
Matchless тему , это очень интересно для меня ))))
[...] Больше года назад для загрузки изображений я выбрал Paperclip, но на данный момент поддавшись модным тенденциям [...]