Първото нещо, което трябва да направим, е да добавим маршрут към routes.rb за достъп до файловете.
Редактирайте routes.rb и добавете параметъра :member с удебелен шрифт:
ресурси :потребители, :член => { :аватари => :получи }
Сега, за да получим аватара за потребител 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 адрес сме конфигурирали да използва нашия файл routes.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