Первое, что нам нужно сделать, это добавить маршрут в route.rb для доступа к файлам.
Отредактируйте route.rb и добавьте параметр :member жирным шрифтом:
ресурсы :users, :member => { :avatars => :get }
Теперь, чтобы получить, например, аватар для пользователя 7, мы можем создать такой URL-адрес:
localhost:3000/users/7/avatars
… и запрос будет перенаправлен на действие avatars
в контроллере users
(множественное число, поскольку у пользователя может быть более одного стиля аватара).
Итак, теперь давайте продолжим и реализуем метод аватаров и добавим код для загрузки файла в клиент. Это можно сделать с помощью ActionController::Streaming::send_file. Это достаточно просто; нам просто нужно передать путь к файлу в send_file, а также тип содержимого MIME, который клиент использует в качестве подсказки для принятия решения о том, как отображать файл, и все! Давайте жестко закодируем эти значения для лучшего понимания (обновите путь здесь для вашей машины):
class UsersController < ApplicationController
def avatars
send_file '/path/to/non-public/system/avatars/7/original/mickey-mouse.jpg',
:type => 'image/jpeg'
end
end
Теперь, если вы наберете localhost:3000/users/7/avatars
в своем браузере, вы должны увидеть изображение Микки.
Вместо жесткого кодирования пути в методе аватаров нам, очевидно, нужно иметь возможность обрабатывать запросы на любое вложение файла аватара для любой записи пользователя. Для этого настройте Paperclip и сообщите ему, где файлы теперь хранятся в файловой системе, и какой URL-адрес мы настроили для использования в файле route.rb.
Для этого нам нужно добавить пару параметров к нашему вызову has_attached_file в нашей модели пользователя (user.rb),
has_attached_file :avatar,
:styles => { :thumb => "75x75>", :small => "150x150>" },
:path =>
':rails_root/non-public/system/:attachment/:id/:style/:basename.:extension',
:url => '/:class/:id/:attachment'
Но теперь мы можем обобщить наш код в UserController для обработки любого пользователя, например:
def avatars
user = User.find(params[:id])
send_file user.avatar.path, :type => user.avatar_content_type
end
Теперь мы можем снова протестировать localhost:3000/users/7/avatars
, чтобы убедиться, что мы ничего не сломали.
Ваше здоровье!
person
My God
schedule
05.12.2012